# PIP-0015 · Limits on an open request

A request whose amount is null may bound what the payer enters, per capability and inside the standing intent. A fixed amount meets the intent's limits at issue.

## Why

A request with `amount: null` lets the payer choose: a tip, a donation, an open invoice ([PIP-0010](/pips/0010)). This PIP lets it state the range it accepts, for example between 1 000 and 50 000 XOF, and makes that range binding on the wallet. The bounds take the shape of the per-capability limits of an address ([PIP-0008](/pips/0008)), and a request issued against an address stays inside them.

## The object

```json
{
  "type": "path.request",
  "reference": "q81mzv4k2tx9",
  "issuer": "member-a",
  "payee": { "member": "member-a", "address": "path:4a91c2f7e8d3" },
  "amount": null,
  "accepts": [
    {
      "rail": "book",
      "asset_type": "fiat",
      "asset_code": "XOF",
      "limits": {
        "min_single": { "value": "1000", "asset_type": "fiat", "asset_code": "XOF" },
        "max_single": { "value": "50000", "asset_type": "fiat", "asset_code": "XOF" }
      },
      "fees": []
    }
  ],
  "status": "created",
  "settled_by": [],
  "expires_at": "2026-10-10T10:00:00Z",
  "grammar": 2
}
```

## Rules

| Field | Rule |
|---|---|
| `accepts[].limits` | Optional, and only when `amount` is `null`. `min_single`, `max_single`, each an Amount in the capability's asset, as in PIP-0008. Bounds are inclusive. |
| Against an address | The request's limits lie inside those of the entry in the standing intent named by `intent_version`. A bound the request leaves out is copied from the intent. A request tightens, never widens. |
| Fixed `amount` | `limits` is absent. The amount sent on each capability — `amount`, or the entry's `quote.amount` — lies within the intent's limits for that capability, or the request is not issued. |

## Payment

- A wallet does not send, on an entry, an amount outside its `limits`.
- A payment instruction ([PIP-0009](/pips/0009)) for an open request or an address carries the `limits` of the entry in force, and `null` when `amount` is fixed.
- An open request moves to `paid` on its first settled receipt whose `received` meets the `min_single` of the entry in the same asset. A receipt below it is listed in `settled_by` and leaves the request `created`. Above `max_single` follows the rule for an excess in PIP-0010: the request moves to `paid`, refund is reserved.

## What this is not

Display. Limits bound what may be paid, so they are terms, signed and enforced. How the amount is shown is [PIP-0016](/pips/0016).

Platform bounds. Bounds an operator applies on its own platform are outside the protocol. The operator publishes their intersection with its customer's bounds, here or in the standing intent.

## Compatibility

Additive. Requests without `limits` read as before. The payment instruction gains `limits`, `null` unless an open amount has them. Requests issued before this PIP are served as signed.