> For the complete documentation index, see [llms.txt](https://developers.unigox.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://developers.unigox.com/api-reference/fiat-accounts.md).

# Fiat Accounts

Accounts Unigox issues to your customers, in their own name, for them to be paid into.

A fiat account belongs to a customer you created with `POST /api/v1/partner/users` and put through KYC, and it is addressed by its own `fiat_account_id`. Open one, show the customer where to pay in, and read what lands on it. In v1 neither you nor the customer can move money off an account through this API, and converting it is an order. EUR and GBP off-ramps are paid through the customer's account by Unigox itself, on to the bank you named: see `payout_via_own_account` on the order.

An optional product Unigox activates per partner. `GET /api/v1/partner/fiat-accounts/config` answers whether it is on for you, before any customer is in scope.

## What fiat accounts you can offer

> Whether you may issue fiat accounts right now, which currencies an account may be\
> denominated in, and which jurisdictions each currency can be issued from. The one fiat\
> account route that names no customer.\
> \
> Entitlement is never an error here: when the product is not active it answers \`200\` with\
> \`enabled: false\` and a \`disabled\_reason\`. \`issues\_accounts: false\` with \`enabled: true\`\
> means you may read accounts but not open them.<br>

```json
{"openapi":"3.0.3","info":{"title":"Unigox API Gateway","version":"1.0.0"},"tags":[{"name":"Fiat Accounts","description":"Accounts Unigox issues to your customers, in their own name, for them to be paid into.\n\nA fiat account belongs to a customer you created with `POST /api/v1/partner/users` and put\nthrough KYC, and it is addressed by its own `fiat_account_id`. Open one, show the customer\nwhere to pay in, and read what lands on it. In v1 neither you nor the customer can move money\noff an account through this API, and converting it is an order. EUR and GBP off-ramps are paid\nthrough the customer's account by Unigox itself, on to the bank you named: see\n`payout_via_own_account` on the order.\n\nAn optional product Unigox activates per partner. `GET /api/v1/partner/fiat-accounts/config`\nanswers whether it is on for you, before any customer is in scope.\n"}],"servers":[{"url":"https://api-staging.unigox.com","description":"Sandbox server"},{"url":"https://api.unigox.com","description":"Production server"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Partner API key for authentication. Required for all partner account endpoints."}},"schemas":{"FiatAccountConfigResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Whether you may use fiat accounts at all."},"issues_accounts":{"type":"boolean","description":"Whether you may OPEN accounts, as opposed to only reading the ones you have.\n"},"disabled_reason":{"type":"string","description":"Why the product is unavailable. Present only when `enabled` is false."},"currencies":{"type":"array","items":{"type":"string"},"description":"ISO 4217 currencies an account may be denominated in."},"issuers":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}},"description":"Currency to issuing jurisdictions (ISO 3166-1 alpha-2), default first."}}}}},"PartnerErrorResponse":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean"},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code. Possible values:\n- `QUOTE_EXPIRED` — quote TTL has passed; for a customer withdrawal, also the customer's forwarder nonce moved or another withdrawal has not executed yet (request a new quote)\n- `QUOTE_NOT_FOUND` — quote ID does not exist\n- `QUOTE_ALREADY_USED` — quote was already consumed by initiate. `details.order_id` names the order it created, so a retried initiate whose first response was lost can continue with that order\n- `PRICE_CHANGED_REQUOTE` — price changed beyond slippage tolerance, partner should request a new quote\n- `ORDER_NOT_FOUND` — order ID does not exist or belongs to another partner\n- `NO_OFFERS_AVAILABLE` — no vendor offers for the requested pair\n- `INVALID_REQUEST` — malformed request or missing fields\n- `INVALID_PAYMENT_DETAILS` — payment details not found or invalid\n- `RAIL_ROUTE_MISMATCH` — rail or route does not match payment details (self-payout only; on a third-party payout a mismatched `rail` is `THIRD_PARTY_CONTEXT_INVALID`)\n- `UNAUTHORIZED` — authentication failed\n- `INTERNAL_ERROR` — unexpected server error\n- `INVALID_STATUS` — order is not in the correct status for the requested action\n- `TRANSACTOR_ERROR` — (502) the relay did not accept a signed request that passed every check, or a refund could not be executed; retry\n- `INSUFFICIENT_BALANCE` — the funding wallet (your partner wallet, or the `external_wallet` customer's address) lacks tokens for the escrow or withdrawal\n- `OPERATION_NOT_ALLOWED` — action is not permitted for the current order state\n- `KYC_NOT_CLEARED` — the customer is not KYC-cleared for this transaction; `error.details.kyc_status` carries their current partner-facing status\n- `FEATURE_NOT_ENABLED` — non-custodial mode is not switched on for your partner account\n- `WALLET_NOT_LINKED` — the `external_wallet` customer has no linked address yet\n- `WALLET_ALREADY_LINKED` — the customer is already linked, the address is linked to another of your customers, or Unigox holds it for an account (a Unigox app wallet, your partner wallet, an escrow) or uses it itself\n- `WALLET_TYPE_MISMATCH` — the call does not apply to this customer's `wallet_type`\n- `INVALID_SIGNATURE` — a wallet challenge signature does not recover to the address, or the message was altered\n- `CHALLENGE_EXPIRED` — no wallet challenge was issued, it is older than 10 minutes, already used, or replaced by a newer one\n- `CUSTOMER_NOT_FOUND` / `WITHDRAWAL_NOT_FOUND` — unknown customer or withdrawal on the customer wallet routes\n- `ADDRESS_CAP_REACHED` — allocating would take the customer past the deposit-address limit for that chain type\n- `BALANCE_UNAVAILABLE` / `DEPOSIT_ADDRESSES_UNAVAILABLE` — a dependency did not answer; safe to retry\n- `AMOUNT_TOO_LOW` — (422) too small to bridge to the destination chain: the bridge refused it (`error.details.reason`), or its fee would exceed 2% (`error.details.bridge_fee`, `estimated_minimum_amount`, `max_fee_pct`)\n- `SENDER_IDENTITY_REQUIRED` — the payout corridor settles consumer-to-consumer and the customer's record cannot name them as the remitter; `error.details.kyc_fields` lists what to send to `PATCH /partner/users/{user_uuid}/kyc`, and `error.details.field_limits` carries the rail's length ceiling on any listed field that has one\n- `RECIPIENT_NOT_FOUND` — (404) the recipient endpoints, and an estimate naming such a recipient or destination: no recipient (or destination) with that id belongs to your partner account, or it was archived. A quote answers the same case `422 THIRD_PARTY_CONTEXT_INVALID`\n- `RECIPIENT_SERVICE_UNAVAILABLE` — (503) the recipient endpoints: the recipient directory could not be reached; retry with backoff\n- `THIRD_PARTY_CONTEXT_INVALID` — (422) the sender, recipient or destination of a third-party payout cannot be used, including a `rail` that is not the destination's and a destination currency that is not `fiat_currency`; the message says which\n- `THIRD_PARTY_RAIL_NOT_SUPPORTED` — (409) the currency is open to recipient payouts, but not over the rail the destination settles on\n- `THIRD_PARTY_PAYOUT_AGENT_NOT_READY` — (409) recipient payouts are switched off on our side; no order is created and the quote stays valid\n- `THIRD_PARTY_RELATIONSHIP_NOT_SUPPORTED` — (422) the rail refuses that beneficiary (a Chinese wallet pays `self` or `family` only)\n- `THIRD_PARTY_SENDER_COUNTRY_NOT_SUPPORTED` — (422) the rail refuses money sent from the country on the customer's verified identity\n- `THIRD_PARTY_PAYOUT_UNDER_REVIEW` — (422, initiate) compliance put the payout in review\n- `THIRD_PARTY_PAYOUT_DECLINED` — (422, initiate) compliance refused the payout\n\nFiat account endpoints (`/partner/fiat-accounts/config` and the `/partner/users/{user_uuid}`\n`identity`, `identification` and `fiat-accounts` routes) answer with their own codes, each\ndescribed on the response that returns it: `FIAT_ACCOUNT_NOT_FOUND`,\n`ACCOUNT_HOLDER_NOT_FOUND`, `ACCOUNT_NOT_PROVISIONED`, `CUSTOMER_NOT_FOUND`,\n`CUSTOMER_NOT_VERIFIED`, `CLIENT_NOT_APPROVED`, `HOLDER_REGISTRATION_IN_PROGRESS`,\n`IDENTIFICATION_MISSING`, `IDENTIFICATION_ALREADY_LINKED`, `INVALID_DOCUMENT_TYPE`,\n`POSTAL_CODE_REQUIRED`, `INVALID_POSTAL_CODE`, `MISSING_FIELDS`, `PRODUCT_NOT_ACTIVATED`,\n`ISSUANCE_NOT_GRANTED`, `ISSUANCE_DISABLED`, `PROVISIONING_IN_PROGRESS`,\n`UNSUPPORTED_CURRENCY`, `UNSUPPORTED_ISSUER_COUNTRY`, `CURRENCY_NOT_PERMITTED`,\n`CURRENCY_NOT_PRICED`, `RECORD_FAILED`, `BANKING_ERROR`, `BANKING_UNAVAILABLE`.\n\nThis list is not closed: codes are added as endpoints grow. Treat a code you do not recognise\nas an error of the kind its HTTP status says, rather than rejecting the response.\n"},"message":{"type":"string","description":"Human-readable error message"},"details":{"type":"object","nullable":true,"additionalProperties":true,"description":"Additional context (e.g., quoted_rate, current_rate for slippage errors)"}}}}}}},"paths":{"/api/v1/partner/fiat-accounts/config":{"get":{"tags":["Fiat Accounts"],"summary":"What fiat accounts you can offer","operationId":"getFiatAccountsConfig","description":"Whether you may issue fiat accounts right now, which currencies an account may be\ndenominated in, and which jurisdictions each currency can be issued from. The one fiat\naccount route that names no customer.\n\nEntitlement is never an error here: when the product is not active it answers `200` with\n`enabled: false` and a `disabled_reason`. `issues_accounts: false` with `enabled: true`\nmeans you may read accounts but not open them.\n","responses":{"200":{"description":"Current configuration","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FiatAccountConfigResponse"}}}},"401":{"description":"Missing or invalid credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorResponse"}}}}}}}}}
```

## List a customer's fiat accounts

> Every fiat account issued to one of your customers. A customer with none yet answers an\
> empty list.\
> \
> Only the last four digits of the identifier travel here. Read a single account for the\
> pay-in details a customer needs.<br>

```json
{"openapi":"3.0.3","info":{"title":"Unigox API Gateway","version":"1.0.0"},"tags":[{"name":"Fiat Accounts","description":"Accounts Unigox issues to your customers, in their own name, for them to be paid into.\n\nA fiat account belongs to a customer you created with `POST /api/v1/partner/users` and put\nthrough KYC, and it is addressed by its own `fiat_account_id`. Open one, show the customer\nwhere to pay in, and read what lands on it. In v1 neither you nor the customer can move money\noff an account through this API, and converting it is an order. EUR and GBP off-ramps are paid\nthrough the customer's account by Unigox itself, on to the bank you named: see\n`payout_via_own_account` on the order.\n\nAn optional product Unigox activates per partner. `GET /api/v1/partner/fiat-accounts/config`\nanswers whether it is on for you, before any customer is in scope.\n"}],"servers":[{"url":"https://api-staging.unigox.com","description":"Sandbox server"},{"url":"https://api.unigox.com","description":"Production server"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Partner API key for authentication. Required for all partner account endpoints."}},"schemas":{"FiatAccountListResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"fiat_accounts":{"type":"array","items":{"$ref":"#/components/schemas/FiatAccount"}}}}}},"FiatAccount":{"type":"object","description":"One issued account. The pay-in fields appear once `status` is `active`, and only the ones\nthe account's rail uses.\n\nNothing here names the bank or banking platform Unigox routes through. `bank_name` and\n`bic` describe the account a payer sends money to, which is different — those are for the\ncustomer to see.\n","properties":{"fiat_account_id":{"type":"string","format":"uuid","description":"The account's id, and the only one. It is what every `/fiat-accounts/{fiat_account_id}`\nroute takes, what a webhook names the account by, and what an order funded from this\naccount carries.\n"},"user_uuid":{"type":"string","format":"uuid","description":"The customer who holds the account."},"currency":{"type":"string"},"issuer_country":{"type":"string","description":"The jurisdiction the account was issued in."},"status":{"type":"string","enum":["pending","active","failed","closed"],"description":"`pending` — being opened, no pay-in details yet, do not send the customer to it.\n`active` — ready, and the pay-in details below are on this response.\n`failed` — the bank refused; this account will not become usable.\n`closed` — retired; its history stays readable and new deposits will not credit it.\n"},"created":{"type":"boolean","description":"On the issue response only: whether THIS request opened the account. `false` means it\nalready existed and is being handed back.\n"},"iban":{"type":"string","description":"Euro (SEPA) accounts. Pay-in detail."},"bic":{"type":"string","description":"Euro (SEPA) accounts. Pay-in detail."},"account_number":{"type":"string","description":"Sterling (Faster Payments) accounts. Pay-in detail."},"sort_code":{"type":"string","description":"Sterling (Faster Payments) accounts. Pay-in detail."},"iban_last4":{"type":"string","description":"List views, where the full identifier does not travel."},"account_number_last4":{"type":"string","description":"List views of a sterling account."},"bank_name":{"type":"string","description":"The bank to show the customer."},"holder_name":{"type":"string","description":"The name the account is held in."},"balances":{"type":"array","description":"Single-account view only.","items":{"$ref":"#/components/schemas/FiatBalance"}},"balances_unavailable":{"type":"boolean","description":"Single-account view only. True when the balance read failed — the balances are reported\nas unavailable rather than as zero.\n"},"created_at":{"type":"string","format":"date-time"}}},"FiatBalance":{"type":"object","properties":{"currency":{"type":"string"},"available":{"type":"string"},"pending":{"type":"string"},"total":{"type":"string"}}},"PartnerErrorResponse":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean"},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code. Possible values:\n- `QUOTE_EXPIRED` — quote TTL has passed; for a customer withdrawal, also the customer's forwarder nonce moved or another withdrawal has not executed yet (request a new quote)\n- `QUOTE_NOT_FOUND` — quote ID does not exist\n- `QUOTE_ALREADY_USED` — quote was already consumed by initiate. `details.order_id` names the order it created, so a retried initiate whose first response was lost can continue with that order\n- `PRICE_CHANGED_REQUOTE` — price changed beyond slippage tolerance, partner should request a new quote\n- `ORDER_NOT_FOUND` — order ID does not exist or belongs to another partner\n- `NO_OFFERS_AVAILABLE` — no vendor offers for the requested pair\n- `INVALID_REQUEST` — malformed request or missing fields\n- `INVALID_PAYMENT_DETAILS` — payment details not found or invalid\n- `RAIL_ROUTE_MISMATCH` — rail or route does not match payment details (self-payout only; on a third-party payout a mismatched `rail` is `THIRD_PARTY_CONTEXT_INVALID`)\n- `UNAUTHORIZED` — authentication failed\n- `INTERNAL_ERROR` — unexpected server error\n- `INVALID_STATUS` — order is not in the correct status for the requested action\n- `TRANSACTOR_ERROR` — (502) the relay did not accept a signed request that passed every check, or a refund could not be executed; retry\n- `INSUFFICIENT_BALANCE` — the funding wallet (your partner wallet, or the `external_wallet` customer's address) lacks tokens for the escrow or withdrawal\n- `OPERATION_NOT_ALLOWED` — action is not permitted for the current order state\n- `KYC_NOT_CLEARED` — the customer is not KYC-cleared for this transaction; `error.details.kyc_status` carries their current partner-facing status\n- `FEATURE_NOT_ENABLED` — non-custodial mode is not switched on for your partner account\n- `WALLET_NOT_LINKED` — the `external_wallet` customer has no linked address yet\n- `WALLET_ALREADY_LINKED` — the customer is already linked, the address is linked to another of your customers, or Unigox holds it for an account (a Unigox app wallet, your partner wallet, an escrow) or uses it itself\n- `WALLET_TYPE_MISMATCH` — the call does not apply to this customer's `wallet_type`\n- `INVALID_SIGNATURE` — a wallet challenge signature does not recover to the address, or the message was altered\n- `CHALLENGE_EXPIRED` — no wallet challenge was issued, it is older than 10 minutes, already used, or replaced by a newer one\n- `CUSTOMER_NOT_FOUND` / `WITHDRAWAL_NOT_FOUND` — unknown customer or withdrawal on the customer wallet routes\n- `ADDRESS_CAP_REACHED` — allocating would take the customer past the deposit-address limit for that chain type\n- `BALANCE_UNAVAILABLE` / `DEPOSIT_ADDRESSES_UNAVAILABLE` — a dependency did not answer; safe to retry\n- `AMOUNT_TOO_LOW` — (422) too small to bridge to the destination chain: the bridge refused it (`error.details.reason`), or its fee would exceed 2% (`error.details.bridge_fee`, `estimated_minimum_amount`, `max_fee_pct`)\n- `SENDER_IDENTITY_REQUIRED` — the payout corridor settles consumer-to-consumer and the customer's record cannot name them as the remitter; `error.details.kyc_fields` lists what to send to `PATCH /partner/users/{user_uuid}/kyc`, and `error.details.field_limits` carries the rail's length ceiling on any listed field that has one\n- `RECIPIENT_NOT_FOUND` — (404) the recipient endpoints, and an estimate naming such a recipient or destination: no recipient (or destination) with that id belongs to your partner account, or it was archived. A quote answers the same case `422 THIRD_PARTY_CONTEXT_INVALID`\n- `RECIPIENT_SERVICE_UNAVAILABLE` — (503) the recipient endpoints: the recipient directory could not be reached; retry with backoff\n- `THIRD_PARTY_CONTEXT_INVALID` — (422) the sender, recipient or destination of a third-party payout cannot be used, including a `rail` that is not the destination's and a destination currency that is not `fiat_currency`; the message says which\n- `THIRD_PARTY_RAIL_NOT_SUPPORTED` — (409) the currency is open to recipient payouts, but not over the rail the destination settles on\n- `THIRD_PARTY_PAYOUT_AGENT_NOT_READY` — (409) recipient payouts are switched off on our side; no order is created and the quote stays valid\n- `THIRD_PARTY_RELATIONSHIP_NOT_SUPPORTED` — (422) the rail refuses that beneficiary (a Chinese wallet pays `self` or `family` only)\n- `THIRD_PARTY_SENDER_COUNTRY_NOT_SUPPORTED` — (422) the rail refuses money sent from the country on the customer's verified identity\n- `THIRD_PARTY_PAYOUT_UNDER_REVIEW` — (422, initiate) compliance put the payout in review\n- `THIRD_PARTY_PAYOUT_DECLINED` — (422, initiate) compliance refused the payout\n\nFiat account endpoints (`/partner/fiat-accounts/config` and the `/partner/users/{user_uuid}`\n`identity`, `identification` and `fiat-accounts` routes) answer with their own codes, each\ndescribed on the response that returns it: `FIAT_ACCOUNT_NOT_FOUND`,\n`ACCOUNT_HOLDER_NOT_FOUND`, `ACCOUNT_NOT_PROVISIONED`, `CUSTOMER_NOT_FOUND`,\n`CUSTOMER_NOT_VERIFIED`, `CLIENT_NOT_APPROVED`, `HOLDER_REGISTRATION_IN_PROGRESS`,\n`IDENTIFICATION_MISSING`, `IDENTIFICATION_ALREADY_LINKED`, `INVALID_DOCUMENT_TYPE`,\n`POSTAL_CODE_REQUIRED`, `INVALID_POSTAL_CODE`, `MISSING_FIELDS`, `PRODUCT_NOT_ACTIVATED`,\n`ISSUANCE_NOT_GRANTED`, `ISSUANCE_DISABLED`, `PROVISIONING_IN_PROGRESS`,\n`UNSUPPORTED_CURRENCY`, `UNSUPPORTED_ISSUER_COUNTRY`, `CURRENCY_NOT_PERMITTED`,\n`CURRENCY_NOT_PRICED`, `RECORD_FAILED`, `BANKING_ERROR`, `BANKING_UNAVAILABLE`.\n\nThis list is not closed: codes are added as endpoints grow. Treat a code you do not recognise\nas an error of the kind its HTTP status says, rather than rejecting the response.\n"},"message":{"type":"string","description":"Human-readable error message"},"details":{"type":"object","nullable":true,"additionalProperties":true,"description":"Additional context (e.g., quoted_rate, current_rate for slippage errors)"}}}}}}},"paths":{"/api/v1/partner/fiat-accounts":{"get":{"tags":["Fiat Accounts"],"summary":"List a customer's fiat accounts","operationId":"listFiatAccounts","description":"Every fiat account issued to one of your customers. A customer with none yet answers an\nempty list.\n\nOnly the last four digits of the identifier travel here. Read a single account for the\npay-in details a customer needs.\n","parameters":[{"name":"user_uuid","in":"query","required":true,"description":"The customer whose accounts to list.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Accounts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FiatAccountListResponse"}}}},"404":{"description":"No such customer, or not yours (`CUSTOMER_NOT_FOUND`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorResponse"}}}}}}}}}
```

## Issue a fiat account

> Opens a fiat account for one of your customers. The customer must be KYC-verified by\
> Unigox; everything the bank needs about them comes from that verification, so there is no\
> identity to submit here.\
> \
> The account is opened asynchronously. It answers \`201\` with \`status: "pending"\` and no\
> pay-in details; watch for \`fiat\_account.updated\` — or poll the account — until it reads\
> \`active\`, and only then tell the customer where to transfer.\
> \
> \*\*Idempotent per (user\_uuid, currency, issuer\_country).\*\* A repeat answers \`201\` with the\
> same account and \`created: false\`.\
> \
> When the bank needs a field the KYC record does not have, this answers \`422\
> ISSUANCE\_NOT\_READY\` and names those fields in \`error.details.missing\_fields\`. They are KYC\
> field names: fill them with \`PATCH /api/v1/partner/users/{user\_uuid}/kyc\` and post again.<br>

```json
{"openapi":"3.0.3","info":{"title":"Unigox API Gateway","version":"1.0.0"},"tags":[{"name":"Fiat Accounts","description":"Accounts Unigox issues to your customers, in their own name, for them to be paid into.\n\nA fiat account belongs to a customer you created with `POST /api/v1/partner/users` and put\nthrough KYC, and it is addressed by its own `fiat_account_id`. Open one, show the customer\nwhere to pay in, and read what lands on it. In v1 neither you nor the customer can move money\noff an account through this API, and converting it is an order. EUR and GBP off-ramps are paid\nthrough the customer's account by Unigox itself, on to the bank you named: see\n`payout_via_own_account` on the order.\n\nAn optional product Unigox activates per partner. `GET /api/v1/partner/fiat-accounts/config`\nanswers whether it is on for you, before any customer is in scope.\n"}],"servers":[{"url":"https://api-staging.unigox.com","description":"Sandbox server"},{"url":"https://api.unigox.com","description":"Production server"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Partner API key for authentication. Required for all partner account endpoints."}},"schemas":{"FiatAccountCreateRequest":{"type":"object","required":["user_uuid","currency"],"properties":{"user_uuid":{"type":"string","format":"uuid","description":"One of your customers, KYC-verified by Unigox."},"currency":{"type":"string","description":"One of `config.currencies`."},"issuer_country":{"type":"string","description":"ISO 3166-1 alpha-2, one of `config.issuers[currency]`. Omitted, the currency's default\njurisdiction is used.\n"},"postal_code":{"type":"string","description":"Only needed when the chosen jurisdiction requires one and the customer's KYC record has\nnone. Sent here, it is written onto that KYC record.\n"}}},"FiatAccountResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/FiatAccount"}}},"FiatAccount":{"type":"object","description":"One issued account. The pay-in fields appear once `status` is `active`, and only the ones\nthe account's rail uses.\n\nNothing here names the bank or banking platform Unigox routes through. `bank_name` and\n`bic` describe the account a payer sends money to, which is different — those are for the\ncustomer to see.\n","properties":{"fiat_account_id":{"type":"string","format":"uuid","description":"The account's id, and the only one. It is what every `/fiat-accounts/{fiat_account_id}`\nroute takes, what a webhook names the account by, and what an order funded from this\naccount carries.\n"},"user_uuid":{"type":"string","format":"uuid","description":"The customer who holds the account."},"currency":{"type":"string"},"issuer_country":{"type":"string","description":"The jurisdiction the account was issued in."},"status":{"type":"string","enum":["pending","active","failed","closed"],"description":"`pending` — being opened, no pay-in details yet, do not send the customer to it.\n`active` — ready, and the pay-in details below are on this response.\n`failed` — the bank refused; this account will not become usable.\n`closed` — retired; its history stays readable and new deposits will not credit it.\n"},"created":{"type":"boolean","description":"On the issue response only: whether THIS request opened the account. `false` means it\nalready existed and is being handed back.\n"},"iban":{"type":"string","description":"Euro (SEPA) accounts. Pay-in detail."},"bic":{"type":"string","description":"Euro (SEPA) accounts. Pay-in detail."},"account_number":{"type":"string","description":"Sterling (Faster Payments) accounts. Pay-in detail."},"sort_code":{"type":"string","description":"Sterling (Faster Payments) accounts. Pay-in detail."},"iban_last4":{"type":"string","description":"List views, where the full identifier does not travel."},"account_number_last4":{"type":"string","description":"List views of a sterling account."},"bank_name":{"type":"string","description":"The bank to show the customer."},"holder_name":{"type":"string","description":"The name the account is held in."},"balances":{"type":"array","description":"Single-account view only.","items":{"$ref":"#/components/schemas/FiatBalance"}},"balances_unavailable":{"type":"boolean","description":"Single-account view only. True when the balance read failed — the balances are reported\nas unavailable rather than as zero.\n"},"created_at":{"type":"string","format":"date-time"}}},"FiatBalance":{"type":"object","properties":{"currency":{"type":"string"},"available":{"type":"string"},"pending":{"type":"string"},"total":{"type":"string"}}},"PartnerErrorResponse":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean"},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code. Possible values:\n- `QUOTE_EXPIRED` — quote TTL has passed; for a customer withdrawal, also the customer's forwarder nonce moved or another withdrawal has not executed yet (request a new quote)\n- `QUOTE_NOT_FOUND` — quote ID does not exist\n- `QUOTE_ALREADY_USED` — quote was already consumed by initiate. `details.order_id` names the order it created, so a retried initiate whose first response was lost can continue with that order\n- `PRICE_CHANGED_REQUOTE` — price changed beyond slippage tolerance, partner should request a new quote\n- `ORDER_NOT_FOUND` — order ID does not exist or belongs to another partner\n- `NO_OFFERS_AVAILABLE` — no vendor offers for the requested pair\n- `INVALID_REQUEST` — malformed request or missing fields\n- `INVALID_PAYMENT_DETAILS` — payment details not found or invalid\n- `RAIL_ROUTE_MISMATCH` — rail or route does not match payment details (self-payout only; on a third-party payout a mismatched `rail` is `THIRD_PARTY_CONTEXT_INVALID`)\n- `UNAUTHORIZED` — authentication failed\n- `INTERNAL_ERROR` — unexpected server error\n- `INVALID_STATUS` — order is not in the correct status for the requested action\n- `TRANSACTOR_ERROR` — (502) the relay did not accept a signed request that passed every check, or a refund could not be executed; retry\n- `INSUFFICIENT_BALANCE` — the funding wallet (your partner wallet, or the `external_wallet` customer's address) lacks tokens for the escrow or withdrawal\n- `OPERATION_NOT_ALLOWED` — action is not permitted for the current order state\n- `KYC_NOT_CLEARED` — the customer is not KYC-cleared for this transaction; `error.details.kyc_status` carries their current partner-facing status\n- `FEATURE_NOT_ENABLED` — non-custodial mode is not switched on for your partner account\n- `WALLET_NOT_LINKED` — the `external_wallet` customer has no linked address yet\n- `WALLET_ALREADY_LINKED` — the customer is already linked, the address is linked to another of your customers, or Unigox holds it for an account (a Unigox app wallet, your partner wallet, an escrow) or uses it itself\n- `WALLET_TYPE_MISMATCH` — the call does not apply to this customer's `wallet_type`\n- `INVALID_SIGNATURE` — a wallet challenge signature does not recover to the address, or the message was altered\n- `CHALLENGE_EXPIRED` — no wallet challenge was issued, it is older than 10 minutes, already used, or replaced by a newer one\n- `CUSTOMER_NOT_FOUND` / `WITHDRAWAL_NOT_FOUND` — unknown customer or withdrawal on the customer wallet routes\n- `ADDRESS_CAP_REACHED` — allocating would take the customer past the deposit-address limit for that chain type\n- `BALANCE_UNAVAILABLE` / `DEPOSIT_ADDRESSES_UNAVAILABLE` — a dependency did not answer; safe to retry\n- `AMOUNT_TOO_LOW` — (422) too small to bridge to the destination chain: the bridge refused it (`error.details.reason`), or its fee would exceed 2% (`error.details.bridge_fee`, `estimated_minimum_amount`, `max_fee_pct`)\n- `SENDER_IDENTITY_REQUIRED` — the payout corridor settles consumer-to-consumer and the customer's record cannot name them as the remitter; `error.details.kyc_fields` lists what to send to `PATCH /partner/users/{user_uuid}/kyc`, and `error.details.field_limits` carries the rail's length ceiling on any listed field that has one\n- `RECIPIENT_NOT_FOUND` — (404) the recipient endpoints, and an estimate naming such a recipient or destination: no recipient (or destination) with that id belongs to your partner account, or it was archived. A quote answers the same case `422 THIRD_PARTY_CONTEXT_INVALID`\n- `RECIPIENT_SERVICE_UNAVAILABLE` — (503) the recipient endpoints: the recipient directory could not be reached; retry with backoff\n- `THIRD_PARTY_CONTEXT_INVALID` — (422) the sender, recipient or destination of a third-party payout cannot be used, including a `rail` that is not the destination's and a destination currency that is not `fiat_currency`; the message says which\n- `THIRD_PARTY_RAIL_NOT_SUPPORTED` — (409) the currency is open to recipient payouts, but not over the rail the destination settles on\n- `THIRD_PARTY_PAYOUT_AGENT_NOT_READY` — (409) recipient payouts are switched off on our side; no order is created and the quote stays valid\n- `THIRD_PARTY_RELATIONSHIP_NOT_SUPPORTED` — (422) the rail refuses that beneficiary (a Chinese wallet pays `self` or `family` only)\n- `THIRD_PARTY_SENDER_COUNTRY_NOT_SUPPORTED` — (422) the rail refuses money sent from the country on the customer's verified identity\n- `THIRD_PARTY_PAYOUT_UNDER_REVIEW` — (422, initiate) compliance put the payout in review\n- `THIRD_PARTY_PAYOUT_DECLINED` — (422, initiate) compliance refused the payout\n\nFiat account endpoints (`/partner/fiat-accounts/config` and the `/partner/users/{user_uuid}`\n`identity`, `identification` and `fiat-accounts` routes) answer with their own codes, each\ndescribed on the response that returns it: `FIAT_ACCOUNT_NOT_FOUND`,\n`ACCOUNT_HOLDER_NOT_FOUND`, `ACCOUNT_NOT_PROVISIONED`, `CUSTOMER_NOT_FOUND`,\n`CUSTOMER_NOT_VERIFIED`, `CLIENT_NOT_APPROVED`, `HOLDER_REGISTRATION_IN_PROGRESS`,\n`IDENTIFICATION_MISSING`, `IDENTIFICATION_ALREADY_LINKED`, `INVALID_DOCUMENT_TYPE`,\n`POSTAL_CODE_REQUIRED`, `INVALID_POSTAL_CODE`, `MISSING_FIELDS`, `PRODUCT_NOT_ACTIVATED`,\n`ISSUANCE_NOT_GRANTED`, `ISSUANCE_DISABLED`, `PROVISIONING_IN_PROGRESS`,\n`UNSUPPORTED_CURRENCY`, `UNSUPPORTED_ISSUER_COUNTRY`, `CURRENCY_NOT_PERMITTED`,\n`CURRENCY_NOT_PRICED`, `RECORD_FAILED`, `BANKING_ERROR`, `BANKING_UNAVAILABLE`.\n\nThis list is not closed: codes are added as endpoints grow. Treat a code you do not recognise\nas an error of the kind its HTTP status says, rather than rejecting the response.\n"},"message":{"type":"string","description":"Human-readable error message"},"details":{"type":"object","nullable":true,"additionalProperties":true,"description":"Additional context (e.g., quoted_rate, current_rate for slippage errors)"}}}}}}},"paths":{"/api/v1/partner/fiat-accounts":{"post":{"tags":["Fiat Accounts"],"summary":"Issue a fiat account","operationId":"issueFiatAccount","description":"Opens a fiat account for one of your customers. The customer must be KYC-verified by\nUnigox; everything the bank needs about them comes from that verification, so there is no\nidentity to submit here.\n\nThe account is opened asynchronously. It answers `201` with `status: \"pending\"` and no\npay-in details; watch for `fiat_account.updated` — or poll the account — until it reads\n`active`, and only then tell the customer where to transfer.\n\n**Idempotent per (user_uuid, currency, issuer_country).** A repeat answers `201` with the\nsame account and `created: false`.\n\nWhen the bank needs a field the KYC record does not have, this answers `422\nISSUANCE_NOT_READY` and names those fields in `error.details.missing_fields`. They are KYC\nfield names: fill them with `PATCH /api/v1/partner/users/{user_uuid}/kyc` and post again.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FiatAccountCreateRequest"}}}},"responses":{"201":{"description":"Opened, or the existing account for this (customer, currency, jurisdiction). `created`\ndistinguishes the two.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FiatAccountResponse"}}}},"400":{"description":"`UNSUPPORTED_CURRENCY`, `UNSUPPORTED_ISSUER_COUNTRY` or `POSTAL_CODE_REQUIRED`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorResponse"}}}},"403":{"description":"Not entitled (`PRODUCT_NOT_ACTIVATED`, `ISSUANCE_NOT_GRANTED`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorResponse"}}}},"404":{"description":"No such customer, or not yours (`CUSTOMER_NOT_FOUND`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorResponse"}}}},"409":{"description":"The same account is already being opened (`PROVISIONING_IN_PROGRESS`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorResponse"}}}},"422":{"description":"The customer is not verified (`KYC_NOT_CLEARED`), the bank needs fields the KYC record\ndoes not have (`ISSUANCE_NOT_READY`, with `error.details.missing_fields`), or the\ncurrency has no pricing (`CURRENCY_NOT_PRICED`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorResponse"}}}},"503":{"description":"The bank could not be reached (`BANKING_UNAVAILABLE`). Safe to retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorResponse"}}}}}}}}}
```

## One fiat account

> One account: its status, its live balances, and — once it is \`active\` — the pay-in details\
> to show the customer.\
> \
> Those details are shaped by the rail the account is on: \`iban\` and \`bic\` for a euro (SEPA)\
> account, \`account\_number\` and \`sort\_code\` for a sterling (Faster Payments) one. Keys that\
> do not apply are absent rather than empty.\
> \
> \`balances\_unavailable: true\` means the balance read failed. Balances are reported as\
> unavailable rather than as zero: a zero you act on is worse than a gap.<br>

```json
{"openapi":"3.0.3","info":{"title":"Unigox API Gateway","version":"1.0.0"},"tags":[{"name":"Fiat Accounts","description":"Accounts Unigox issues to your customers, in their own name, for them to be paid into.\n\nA fiat account belongs to a customer you created with `POST /api/v1/partner/users` and put\nthrough KYC, and it is addressed by its own `fiat_account_id`. Open one, show the customer\nwhere to pay in, and read what lands on it. In v1 neither you nor the customer can move money\noff an account through this API, and converting it is an order. EUR and GBP off-ramps are paid\nthrough the customer's account by Unigox itself, on to the bank you named: see\n`payout_via_own_account` on the order.\n\nAn optional product Unigox activates per partner. `GET /api/v1/partner/fiat-accounts/config`\nanswers whether it is on for you, before any customer is in scope.\n"}],"servers":[{"url":"https://api-staging.unigox.com","description":"Sandbox server"},{"url":"https://api.unigox.com","description":"Production server"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Partner API key for authentication. Required for all partner account endpoints."}},"parameters":{"FiatAccountId":{"name":"fiat_account_id","in":"path","required":true,"description":"The account's id, as returned in `fiat_account_id`. An id that names no account and one\nthat is not yours both answer `404`; they are indistinguishable on purpose.\n","schema":{"type":"string","format":"uuid"}}},"schemas":{"FiatAccountResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/FiatAccount"}}},"FiatAccount":{"type":"object","description":"One issued account. The pay-in fields appear once `status` is `active`, and only the ones\nthe account's rail uses.\n\nNothing here names the bank or banking platform Unigox routes through. `bank_name` and\n`bic` describe the account a payer sends money to, which is different — those are for the\ncustomer to see.\n","properties":{"fiat_account_id":{"type":"string","format":"uuid","description":"The account's id, and the only one. It is what every `/fiat-accounts/{fiat_account_id}`\nroute takes, what a webhook names the account by, and what an order funded from this\naccount carries.\n"},"user_uuid":{"type":"string","format":"uuid","description":"The customer who holds the account."},"currency":{"type":"string"},"issuer_country":{"type":"string","description":"The jurisdiction the account was issued in."},"status":{"type":"string","enum":["pending","active","failed","closed"],"description":"`pending` — being opened, no pay-in details yet, do not send the customer to it.\n`active` — ready, and the pay-in details below are on this response.\n`failed` — the bank refused; this account will not become usable.\n`closed` — retired; its history stays readable and new deposits will not credit it.\n"},"created":{"type":"boolean","description":"On the issue response only: whether THIS request opened the account. `false` means it\nalready existed and is being handed back.\n"},"iban":{"type":"string","description":"Euro (SEPA) accounts. Pay-in detail."},"bic":{"type":"string","description":"Euro (SEPA) accounts. Pay-in detail."},"account_number":{"type":"string","description":"Sterling (Faster Payments) accounts. Pay-in detail."},"sort_code":{"type":"string","description":"Sterling (Faster Payments) accounts. Pay-in detail."},"iban_last4":{"type":"string","description":"List views, where the full identifier does not travel."},"account_number_last4":{"type":"string","description":"List views of a sterling account."},"bank_name":{"type":"string","description":"The bank to show the customer."},"holder_name":{"type":"string","description":"The name the account is held in."},"balances":{"type":"array","description":"Single-account view only.","items":{"$ref":"#/components/schemas/FiatBalance"}},"balances_unavailable":{"type":"boolean","description":"Single-account view only. True when the balance read failed — the balances are reported\nas unavailable rather than as zero.\n"},"created_at":{"type":"string","format":"date-time"}}},"FiatBalance":{"type":"object","properties":{"currency":{"type":"string"},"available":{"type":"string"},"pending":{"type":"string"},"total":{"type":"string"}}},"PartnerErrorResponse":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean"},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code. Possible values:\n- `QUOTE_EXPIRED` — quote TTL has passed; for a customer withdrawal, also the customer's forwarder nonce moved or another withdrawal has not executed yet (request a new quote)\n- `QUOTE_NOT_FOUND` — quote ID does not exist\n- `QUOTE_ALREADY_USED` — quote was already consumed by initiate. `details.order_id` names the order it created, so a retried initiate whose first response was lost can continue with that order\n- `PRICE_CHANGED_REQUOTE` — price changed beyond slippage tolerance, partner should request a new quote\n- `ORDER_NOT_FOUND` — order ID does not exist or belongs to another partner\n- `NO_OFFERS_AVAILABLE` — no vendor offers for the requested pair\n- `INVALID_REQUEST` — malformed request or missing fields\n- `INVALID_PAYMENT_DETAILS` — payment details not found or invalid\n- `RAIL_ROUTE_MISMATCH` — rail or route does not match payment details (self-payout only; on a third-party payout a mismatched `rail` is `THIRD_PARTY_CONTEXT_INVALID`)\n- `UNAUTHORIZED` — authentication failed\n- `INTERNAL_ERROR` — unexpected server error\n- `INVALID_STATUS` — order is not in the correct status for the requested action\n- `TRANSACTOR_ERROR` — (502) the relay did not accept a signed request that passed every check, or a refund could not be executed; retry\n- `INSUFFICIENT_BALANCE` — the funding wallet (your partner wallet, or the `external_wallet` customer's address) lacks tokens for the escrow or withdrawal\n- `OPERATION_NOT_ALLOWED` — action is not permitted for the current order state\n- `KYC_NOT_CLEARED` — the customer is not KYC-cleared for this transaction; `error.details.kyc_status` carries their current partner-facing status\n- `FEATURE_NOT_ENABLED` — non-custodial mode is not switched on for your partner account\n- `WALLET_NOT_LINKED` — the `external_wallet` customer has no linked address yet\n- `WALLET_ALREADY_LINKED` — the customer is already linked, the address is linked to another of your customers, or Unigox holds it for an account (a Unigox app wallet, your partner wallet, an escrow) or uses it itself\n- `WALLET_TYPE_MISMATCH` — the call does not apply to this customer's `wallet_type`\n- `INVALID_SIGNATURE` — a wallet challenge signature does not recover to the address, or the message was altered\n- `CHALLENGE_EXPIRED` — no wallet challenge was issued, it is older than 10 minutes, already used, or replaced by a newer one\n- `CUSTOMER_NOT_FOUND` / `WITHDRAWAL_NOT_FOUND` — unknown customer or withdrawal on the customer wallet routes\n- `ADDRESS_CAP_REACHED` — allocating would take the customer past the deposit-address limit for that chain type\n- `BALANCE_UNAVAILABLE` / `DEPOSIT_ADDRESSES_UNAVAILABLE` — a dependency did not answer; safe to retry\n- `AMOUNT_TOO_LOW` — (422) too small to bridge to the destination chain: the bridge refused it (`error.details.reason`), or its fee would exceed 2% (`error.details.bridge_fee`, `estimated_minimum_amount`, `max_fee_pct`)\n- `SENDER_IDENTITY_REQUIRED` — the payout corridor settles consumer-to-consumer and the customer's record cannot name them as the remitter; `error.details.kyc_fields` lists what to send to `PATCH /partner/users/{user_uuid}/kyc`, and `error.details.field_limits` carries the rail's length ceiling on any listed field that has one\n- `RECIPIENT_NOT_FOUND` — (404) the recipient endpoints, and an estimate naming such a recipient or destination: no recipient (or destination) with that id belongs to your partner account, or it was archived. A quote answers the same case `422 THIRD_PARTY_CONTEXT_INVALID`\n- `RECIPIENT_SERVICE_UNAVAILABLE` — (503) the recipient endpoints: the recipient directory could not be reached; retry with backoff\n- `THIRD_PARTY_CONTEXT_INVALID` — (422) the sender, recipient or destination of a third-party payout cannot be used, including a `rail` that is not the destination's and a destination currency that is not `fiat_currency`; the message says which\n- `THIRD_PARTY_RAIL_NOT_SUPPORTED` — (409) the currency is open to recipient payouts, but not over the rail the destination settles on\n- `THIRD_PARTY_PAYOUT_AGENT_NOT_READY` — (409) recipient payouts are switched off on our side; no order is created and the quote stays valid\n- `THIRD_PARTY_RELATIONSHIP_NOT_SUPPORTED` — (422) the rail refuses that beneficiary (a Chinese wallet pays `self` or `family` only)\n- `THIRD_PARTY_SENDER_COUNTRY_NOT_SUPPORTED` — (422) the rail refuses money sent from the country on the customer's verified identity\n- `THIRD_PARTY_PAYOUT_UNDER_REVIEW` — (422, initiate) compliance put the payout in review\n- `THIRD_PARTY_PAYOUT_DECLINED` — (422, initiate) compliance refused the payout\n\nFiat account endpoints (`/partner/fiat-accounts/config` and the `/partner/users/{user_uuid}`\n`identity`, `identification` and `fiat-accounts` routes) answer with their own codes, each\ndescribed on the response that returns it: `FIAT_ACCOUNT_NOT_FOUND`,\n`ACCOUNT_HOLDER_NOT_FOUND`, `ACCOUNT_NOT_PROVISIONED`, `CUSTOMER_NOT_FOUND`,\n`CUSTOMER_NOT_VERIFIED`, `CLIENT_NOT_APPROVED`, `HOLDER_REGISTRATION_IN_PROGRESS`,\n`IDENTIFICATION_MISSING`, `IDENTIFICATION_ALREADY_LINKED`, `INVALID_DOCUMENT_TYPE`,\n`POSTAL_CODE_REQUIRED`, `INVALID_POSTAL_CODE`, `MISSING_FIELDS`, `PRODUCT_NOT_ACTIVATED`,\n`ISSUANCE_NOT_GRANTED`, `ISSUANCE_DISABLED`, `PROVISIONING_IN_PROGRESS`,\n`UNSUPPORTED_CURRENCY`, `UNSUPPORTED_ISSUER_COUNTRY`, `CURRENCY_NOT_PERMITTED`,\n`CURRENCY_NOT_PRICED`, `RECORD_FAILED`, `BANKING_ERROR`, `BANKING_UNAVAILABLE`.\n\nThis list is not closed: codes are added as endpoints grow. Treat a code you do not recognise\nas an error of the kind its HTTP status says, rather than rejecting the response.\n"},"message":{"type":"string","description":"Human-readable error message"},"details":{"type":"object","nullable":true,"additionalProperties":true,"description":"Additional context (e.g., quoted_rate, current_rate for slippage errors)"}}}}}}},"paths":{"/api/v1/partner/fiat-accounts/{fiat_account_id}":{"get":{"tags":["Fiat Accounts"],"summary":"One fiat account","operationId":"getFiatAccount","description":"One account: its status, its live balances, and — once it is `active` — the pay-in details\nto show the customer.\n\nThose details are shaped by the rail the account is on: `iban` and `bic` for a euro (SEPA)\naccount, `account_number` and `sort_code` for a sterling (Faster Payments) one. Keys that\ndo not apply are absent rather than empty.\n\n`balances_unavailable: true` means the balance read failed. Balances are reported as\nunavailable rather than as zero: a zero you act on is worse than a gap.\n","parameters":[{"$ref":"#/components/parameters/FiatAccountId"}],"responses":{"200":{"description":"Account","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FiatAccountResponse"}}}},"404":{"description":"No such account, or not yours (`FIAT_ACCOUNT_NOT_FOUND`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorResponse"}}}}}}}}}
```

## Money that moved on a fiat account

> One page of the money that moved on the account, newest first. v1 is receive-only, so every\
> row is a \`credit\`: a transfer the customer's payer sent to the account.\
> \
> A credit that funded an on-ramp carries that order in \`order\_id\`; one that matched no order\
> carries \`null\` and simply sits on the account.\
> \
> Paging is \`page\`. \`has\_more\` says whether another page exists.<br>

```json
{"openapi":"3.0.3","info":{"title":"Unigox API Gateway","version":"1.0.0"},"tags":[{"name":"Fiat Accounts","description":"Accounts Unigox issues to your customers, in their own name, for them to be paid into.\n\nA fiat account belongs to a customer you created with `POST /api/v1/partner/users` and put\nthrough KYC, and it is addressed by its own `fiat_account_id`. Open one, show the customer\nwhere to pay in, and read what lands on it. In v1 neither you nor the customer can move money\noff an account through this API, and converting it is an order. EUR and GBP off-ramps are paid\nthrough the customer's account by Unigox itself, on to the bank you named: see\n`payout_via_own_account` on the order.\n\nAn optional product Unigox activates per partner. `GET /api/v1/partner/fiat-accounts/config`\nanswers whether it is on for you, before any customer is in scope.\n"}],"servers":[{"url":"https://api-staging.unigox.com","description":"Sandbox server"},{"url":"https://api.unigox.com","description":"Production server"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Partner API key for authentication. Required for all partner account endpoints."}},"parameters":{"FiatAccountId":{"name":"fiat_account_id","in":"path","required":true,"description":"The account's id, as returned in `fiat_account_id`. An id that names no account and one\nthat is not yours both answer `404`; they are indistinguishable on purpose.\n","schema":{"type":"string","format":"uuid"}}},"schemas":{"FiatTransactionsResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"transactions":{"type":"array","items":{"$ref":"#/components/schemas/FiatTransaction"}},"has_more":{"type":"boolean","description":"Whether another page exists after this one."}}}}},"FiatTransaction":{"type":"object","description":"One movement of money on a fiat account.","properties":{"transaction_id":{"type":"string","description":"The transaction's id, and the id a deposit webhook names it by."},"type":{"type":"string","enum":["credit"],"description":"`credit` — money arrived on the account. v1 is receive-only, so this is the only value.\n"},"amount":{"type":"string"},"currency":{"type":"string"},"order_id":{"type":"string","nullable":true,"description":"The on-ramp order this credit funded, or `null` when it matched no order and simply\nstays on the account.\n"},"description":{"type":"string","description":"What the payer sent the transfer with, when it carried anything."},"created_at":{"type":"string","format":"date-time"}}},"PartnerErrorResponse":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean"},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code. Possible values:\n- `QUOTE_EXPIRED` — quote TTL has passed; for a customer withdrawal, also the customer's forwarder nonce moved or another withdrawal has not executed yet (request a new quote)\n- `QUOTE_NOT_FOUND` — quote ID does not exist\n- `QUOTE_ALREADY_USED` — quote was already consumed by initiate. `details.order_id` names the order it created, so a retried initiate whose first response was lost can continue with that order\n- `PRICE_CHANGED_REQUOTE` — price changed beyond slippage tolerance, partner should request a new quote\n- `ORDER_NOT_FOUND` — order ID does not exist or belongs to another partner\n- `NO_OFFERS_AVAILABLE` — no vendor offers for the requested pair\n- `INVALID_REQUEST` — malformed request or missing fields\n- `INVALID_PAYMENT_DETAILS` — payment details not found or invalid\n- `RAIL_ROUTE_MISMATCH` — rail or route does not match payment details (self-payout only; on a third-party payout a mismatched `rail` is `THIRD_PARTY_CONTEXT_INVALID`)\n- `UNAUTHORIZED` — authentication failed\n- `INTERNAL_ERROR` — unexpected server error\n- `INVALID_STATUS` — order is not in the correct status for the requested action\n- `TRANSACTOR_ERROR` — (502) the relay did not accept a signed request that passed every check, or a refund could not be executed; retry\n- `INSUFFICIENT_BALANCE` — the funding wallet (your partner wallet, or the `external_wallet` customer's address) lacks tokens for the escrow or withdrawal\n- `OPERATION_NOT_ALLOWED` — action is not permitted for the current order state\n- `KYC_NOT_CLEARED` — the customer is not KYC-cleared for this transaction; `error.details.kyc_status` carries their current partner-facing status\n- `FEATURE_NOT_ENABLED` — non-custodial mode is not switched on for your partner account\n- `WALLET_NOT_LINKED` — the `external_wallet` customer has no linked address yet\n- `WALLET_ALREADY_LINKED` — the customer is already linked, the address is linked to another of your customers, or Unigox holds it for an account (a Unigox app wallet, your partner wallet, an escrow) or uses it itself\n- `WALLET_TYPE_MISMATCH` — the call does not apply to this customer's `wallet_type`\n- `INVALID_SIGNATURE` — a wallet challenge signature does not recover to the address, or the message was altered\n- `CHALLENGE_EXPIRED` — no wallet challenge was issued, it is older than 10 minutes, already used, or replaced by a newer one\n- `CUSTOMER_NOT_FOUND` / `WITHDRAWAL_NOT_FOUND` — unknown customer or withdrawal on the customer wallet routes\n- `ADDRESS_CAP_REACHED` — allocating would take the customer past the deposit-address limit for that chain type\n- `BALANCE_UNAVAILABLE` / `DEPOSIT_ADDRESSES_UNAVAILABLE` — a dependency did not answer; safe to retry\n- `AMOUNT_TOO_LOW` — (422) too small to bridge to the destination chain: the bridge refused it (`error.details.reason`), or its fee would exceed 2% (`error.details.bridge_fee`, `estimated_minimum_amount`, `max_fee_pct`)\n- `SENDER_IDENTITY_REQUIRED` — the payout corridor settles consumer-to-consumer and the customer's record cannot name them as the remitter; `error.details.kyc_fields` lists what to send to `PATCH /partner/users/{user_uuid}/kyc`, and `error.details.field_limits` carries the rail's length ceiling on any listed field that has one\n- `RECIPIENT_NOT_FOUND` — (404) the recipient endpoints, and an estimate naming such a recipient or destination: no recipient (or destination) with that id belongs to your partner account, or it was archived. A quote answers the same case `422 THIRD_PARTY_CONTEXT_INVALID`\n- `RECIPIENT_SERVICE_UNAVAILABLE` — (503) the recipient endpoints: the recipient directory could not be reached; retry with backoff\n- `THIRD_PARTY_CONTEXT_INVALID` — (422) the sender, recipient or destination of a third-party payout cannot be used, including a `rail` that is not the destination's and a destination currency that is not `fiat_currency`; the message says which\n- `THIRD_PARTY_RAIL_NOT_SUPPORTED` — (409) the currency is open to recipient payouts, but not over the rail the destination settles on\n- `THIRD_PARTY_PAYOUT_AGENT_NOT_READY` — (409) recipient payouts are switched off on our side; no order is created and the quote stays valid\n- `THIRD_PARTY_RELATIONSHIP_NOT_SUPPORTED` — (422) the rail refuses that beneficiary (a Chinese wallet pays `self` or `family` only)\n- `THIRD_PARTY_SENDER_COUNTRY_NOT_SUPPORTED` — (422) the rail refuses money sent from the country on the customer's verified identity\n- `THIRD_PARTY_PAYOUT_UNDER_REVIEW` — (422, initiate) compliance put the payout in review\n- `THIRD_PARTY_PAYOUT_DECLINED` — (422, initiate) compliance refused the payout\n\nFiat account endpoints (`/partner/fiat-accounts/config` and the `/partner/users/{user_uuid}`\n`identity`, `identification` and `fiat-accounts` routes) answer with their own codes, each\ndescribed on the response that returns it: `FIAT_ACCOUNT_NOT_FOUND`,\n`ACCOUNT_HOLDER_NOT_FOUND`, `ACCOUNT_NOT_PROVISIONED`, `CUSTOMER_NOT_FOUND`,\n`CUSTOMER_NOT_VERIFIED`, `CLIENT_NOT_APPROVED`, `HOLDER_REGISTRATION_IN_PROGRESS`,\n`IDENTIFICATION_MISSING`, `IDENTIFICATION_ALREADY_LINKED`, `INVALID_DOCUMENT_TYPE`,\n`POSTAL_CODE_REQUIRED`, `INVALID_POSTAL_CODE`, `MISSING_FIELDS`, `PRODUCT_NOT_ACTIVATED`,\n`ISSUANCE_NOT_GRANTED`, `ISSUANCE_DISABLED`, `PROVISIONING_IN_PROGRESS`,\n`UNSUPPORTED_CURRENCY`, `UNSUPPORTED_ISSUER_COUNTRY`, `CURRENCY_NOT_PERMITTED`,\n`CURRENCY_NOT_PRICED`, `RECORD_FAILED`, `BANKING_ERROR`, `BANKING_UNAVAILABLE`.\n\nThis list is not closed: codes are added as endpoints grow. Treat a code you do not recognise\nas an error of the kind its HTTP status says, rather than rejecting the response.\n"},"message":{"type":"string","description":"Human-readable error message"},"details":{"type":"object","nullable":true,"additionalProperties":true,"description":"Additional context (e.g., quoted_rate, current_rate for slippage errors)"}}}}}}},"paths":{"/api/v1/partner/fiat-accounts/{fiat_account_id}/transactions":{"get":{"tags":["Fiat Accounts"],"summary":"Money that moved on a fiat account","operationId":"getFiatAccountTransactions","description":"One page of the money that moved on the account, newest first. v1 is receive-only, so every\nrow is a `credit`: a transfer the customer's payer sent to the account.\n\nA credit that funded an on-ramp carries that order in `order_id`; one that matched no order\ncarries `null` and simply sits on the account.\n\nPaging is `page`. `has_more` says whether another page exists.\n","parameters":[{"$ref":"#/components/parameters/FiatAccountId"},{"name":"page","in":"query","required":false,"description":"1-based page number. Omitted or unparseable means the first page.","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Transactions page","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FiatTransactionsResponse"}}}},"404":{"description":"No such account, or not yours (`FIAT_ACCOUNT_NOT_FOUND`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorResponse"}}}},"503":{"description":"The bank could not be read (`BANKING_UNAVAILABLE`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerErrorResponse"}}}}}}}}}
```
