---
title: "Ask for a higher limit for an existing customer"
method: POST
path: "/customers/{customer_id}/limit-requests"
tags: ["Customers"]
---

# Ask for a higher limit for an existing customer

`POST /customers/{customer_id}/limit-requests`

## Request

- Base URL: `https://developers.ozav.io/v2`
- URL: `https://developers.ozav.io/v2/customers/{customer_id}/limit-requests`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

Asks OZAV to raise the limit of an approved customer - most often one
approved at the entry limit. A customer that is not approved, or whose
account is closed or suspended, answers `409 CUSTOMER_NOT_ELIGIBLE`. Send the monthly amount you want
(and, optionally, the per-transaction amount and a short reason).

The response lists the proofs of economic capacity that are still
missing for that amount in `documents_due`, each with the `doc_type`
that closes it in `POST /customers/{customer_id}/documents`. The same
items appear in `requirements.documents_due` of the customer, with
`purpose: limit_increase`, and a `requirement.due` webhook follows within
about 15 minutes.
Proofs sent recently and not rejected are not asked again.

The request moves on its own: `awaiting_documents` while a proof is
missing, `in_review` once everything arrived, and `approved` (with
`approved_limit`) when OZAV's compliance officer sets the new limit - it
can be lower than what you asked. `declined` carries no reason;
`canceled` means the customer stopped being eligible. Subscribe to `limit_request.updated` to
be told of each change.

One open request per customer: a second one answers
`409 LIMIT_REQUEST_ALREADY_OPEN`. Do not put personal data in `reason`.

## Headers

- `Idempotency-Key` string

## Request body

- LimitRequestCreate
  - `monthly_usd` string, required: The monthly limit you ask for, in USD, as a decimal string.
  - `per_transaction_usd` string, nullable: Optional per-transaction limit, in USD. Cannot exceed `monthly_usd`.
  - `reason` string, nullable: Why the customer needs more. Short; no personal data.

## Response `201`

The limit request was recorded.

- LimitRequest
  - `id` string, required
  - `object` 'limit_request', required
  - `customer_id` string, required
  - `status` 'awaiting_documents' | 'in_review' | 'approved' | 'declined' | 'canceled', required: `awaiting_documents` while a proof in `documents_due` is missing; `in_review` once everything arrived and OZAV is deciding; `approved` when the new limit is in force (see `approved_limit`); `declined` when OZAV did not raise the limit (no reason is given); `canceled` when the customer stopped being eligible (rejected, closed or suspended) while the request was open.
  - `requested` object, required
    - `monthly_usd` string, nullable, required
    - `per_transaction_usd` string, nullable, required
  - `reason` string, nullable, required
  - `documents_due` object[], required: The proofs of economic capacity this request still needs. Send each one with `POST /customers/{customer_id}/documents` using its `doc_type`. Empty once the request is decided.
    - `key` string, required
    - `doc_type` string, nullable, required
    - `label` string, required
    - `status` 'due' | 'submitted' | 'accepted', required: `due` - send it; `submitted` - received, under review; `accepted` - an OZAV review accepted a document sent after the request.
  - `approved_limit` object, nullable, required: The limit now in force. Only when `status` is `approved`; it can be lower than requested.
    - `monthly_usd` string, nullable, required
    - `per_transaction_usd` string, nullable, required
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required
  - `decided_at` string, date-time, nullable, required

## Other responses

- `202`: Accepted - a concurrent request with the same `Idempotency-Key` is still executing; the body is `{"status": "processing"}`. Retry with the same key once the original completes: a completed request replays its stored response verbatim with the original status code and the `Idempotent-Replayed: true` header. This is not the resource - check the status code before deserializing. If this `202` repeats instead of resolving, the original request's outcome is unknown and no stored result will arrive - the key stays claimed when a request fails after the resource may already have been written. Stop retrying, reconcile with a `GET` to see whether the resource exists, and use a new key if it does not.
- `400`: The request is invalid.
- `401`: Missing or invalid API key.
- `403`: The organization lacks the entitlement (code ENTITLEMENT_REQUIRED) or the key lacks the scope (code INSUFFICIENT_SCOPE). On money-moving requests (POST /transfers, POST /wallets/{wallet_id}/transfers) a compliance hold on the customer answers with code COMPLIANCE_HOLD: the hold is reviewed and lifted on OZAV's side; retrying does not clear it. When the only hold is a pause until pending onboarding documents are received, a withdrawal answers CUSTOMER_DOCUMENTS_PENDING instead: send what `requirements` on GET /customers/{id} lists; OZAV lifts the pause after reviewing it. On OZAV Services (live without the platform's KYB), any API outside decisions, screenings, lists and self-custody wallets answers with code PRODUCTION_NOT_ACTIVATED.
- `404`: The resource does not exist, is not visible to the caller, or the id was malformed for this position (see "Resource ids" under Errors). These share one status; `code` and `message` tell them apart.
- `409`: Conflict (e.g. IDEMPOTENCY_KEY_REUSED).

---

[API](https://skmtc.dev/ozav/apis/ozav-api.md) - [All operations](https://skmtc.dev/ozav/apis/ozav-api/llms.txt) - [OpenAPI document](https://skmtc.dev/ozav/apis/ozav-api/revisions/4133dc2109d7?raw)
