{"openapi":"3.1.0","info":{"title":"AnonChange partner API","version":"1","description":"Private, no-KYC crypto swaps for wallets, aggregators and sites. Every request is a signed JSON POST: see https://anonchange.com/docs#authentication for the signature (the four X-API-* headers are all required)."},"externalDocs":{"url":"https://anonchange.com/docs"},"servers":[{"url":"https://anonchange.com/api/partner/v1"}],"security":[{"x_api_key":[],"x_api_timestamp":[],"x_api_nonce":[],"x_api_sign":[]}],"paths":{"/currencies":{"post":{"operationId":"currencies","summary":"All coins with their limits","description":"120 requests per minute per API key. https://anonchange.com/docs#currencies","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{}},"example":{}}}},"responses":{"200":{"description":"All coins with their limits","content":{"application/json":{"example":[{"coin":"BTC","name":"Bitcoin","decimals":8,"enabled":true,"minDeposit":"0.0002","confirmations":2,"networkFee":"0.00003","usd":"67012.4","reserve":"1.84213"},{"coin":"XMR","name":"Monero","decimals":12,"enabled":true,"minDeposit":"0.02","confirmations":10,"networkFee":"0.0002","usd":"163.21","reserve":"412.5"}]}}},"400":{"description":"Invalid input: unknown or missing field, bad amount or address, pair not available, body not JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"400-1":{"summary":"Send valid JSON. An endpoint without fields takes {}.","value":{"error":"Body is not valid JSON but content-type is set to 'application/json'"}},"400-2":{"summary":"Send a JSON object as the body, at least {}.","value":{"error":"body must be object"}},"400-3":{"summary":"A field name is wrong or unknown: amount (not amountIn) in price and create, id (not orderId) in status, continue and refund.","value":{"error":"body must NOT have additional properties"}},"400-4":{"summary":"Add the named field. Names are case-sensitive.","value":{"error":"body must have required property 'rateType'"}},"400-5":{"summary":"Amounts are strings like \"0.01\", never JSON numbers, with a dot and no thousands separators. Also for amountOut (\"body/amountOut must be string\").","value":{"error":"Enter a valid amount (digits and up to 12 decimals)"}},"400-6":{"summary":"Round to the coin's decimals from currencies.","value":{"error":"Invalid BTC amount (at most 8 decimals)"}},"400-7":{"summary":"Use the coin code from currencies, in capitals: BTC, XMR, USDT_SOL.","value":{"error":"body/from must be equal to one of the allowed values"}},"400-8":{"summary":"from and to must differ.","value":{"error":"Choose two different coins"}},"400-9":{"summary":"One of the coins is disabled right now (enabled: false in currencies). Hide it and check again later.","value":{"error":"This pair is not available"}},"400-10":{"summary":"Pick one: what the customer sends (amount) or receives (amountOut).","value":{"error":"Send either amount or amountOut, not both"}},"400-11":{"summary":"Every order needs amount or amountOut.","value":{"error":"Orders need an amount"}},"400-12":{"summary":"The deposit must be at least minDeposit (from price or currencies).","value":{"error":"Amount must be within the deposit limits"}},"400-13":{"summary":"payoutAddress is for the to coin, refundAddress for the from coin (\"Invalid BTC refund address\"). Mainnet addresses only, as the customer gave them.","value":{"error":"Invalid XMR payout address"}},"400-14":{"summary":"payoutAddress is missing or shorter than 20 characters.","value":{"error":"Enter a valid payout address"}},"400-15":{"summary":"A deposit address of ours was pasted as the payout address. Ask the customer for their own.","value":{"error":"That XMR payout address belongs to this exchange; use an address from your own wallet"}},"400-16":{"summary":"Stay within the cap shown in your dashboard. It is a number (0.5), not a string, with at most 2 decimals.","value":{"error":"markupPercent can be at most 2"}},"400-17":{"summary":"Only https URLs on port 443 with a public host name or address (also \"must use the default https port (443)\", \"must be a public address\").","value":{"error":"webhookUrl must use https"}},"400-18":{"summary":"For example your checkout id, or a UUID.","value":{"error":"Idempotency-Key must be 8-128 letters, digits, - or _"}}}}}},"401":{"description":"Missing or invalid authentication headers, expired timestamp, reused nonce or wrong signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"401-1":{"summary":"Send all four headers on every request, including currencies and pairs.","value":{"error":"X-API-KEY, X-API-TIMESTAMP, X-API-NONCE and X-API-SIGN headers are required"}},"401-2":{"summary":"Use seconds (10 digits), not milliseconds, and keep your server clock synced (NTP): we accept 60 seconds either way.","value":{"error":"X-API-TIMESTAMP must be the current unix time in seconds"}},"401-3":{"summary":"For example 32 random hex characters (openssl rand -hex 16).","value":{"error":"X-API-NONCE must be 16-64 letters, digits, - or _"}},"401-4":{"summary":"Make a new nonce for every request, retries included.","value":{"error":"X-API-NONCE was already used"}},"401-5":{"summary":"Usually the signed string differs from the request: the path must include /api/partner/v1 and nothing after it (no query string, no trailing slash); hash the exact body bytes you send, not a re-serialized copy; the method is POST in capitals; no newline at the end; hex digests, not base64. Also check you use the current secret (rotating it ends the old one).","value":{"error":"Invalid API key or signature"}}}}}},"403":{"description":"Your partner account is disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"403-1":{"summary":"Contact support.","value":{"error":"This partner account is disabled"}}}}}},"404":{"description":"Order not found (or not one of yours), or no such endpoint (every endpoint is a POST).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"404-1":{"summary":"Use POST, the exact endpoint name and no trailing slash.","value":{"error":"Unknown endpoint GET /api/partner/v1/…: every endpoint is a POST, see /docs"}},"404-2":{"summary":"The id is not one of your orders (orders made with another API key or on the site are not visible). In orders, before must be one of your order ids.","value":{"error":"Order not found"}}}}}},"409":{"description":"The order is not in a state that allows this action, or it has to wait a moment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"409-1":{"summary":"Only when the order's actions.continue is true (after a price move). Check status first.","value":{"error":"This order cannot be continued"}},"409-2":{"summary":"Only when actions.refund is true. Otherwise support handles the order.","value":{"error":"This order cannot be refunded by you; please contact support"}},"409-3":{"summary":"Also \"No fresh market rate, try again shortly\". Retry after a minute; the customer's choice is kept.","value":{"error":"Payouts are paused right now, try again later"}}}}}},"413":{"description":"Body larger than 16 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{}}}},"415":{"description":"Content-Type is not application/json.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"415-1":{"summary":"Set Content-Type: application/json.","value":{"error":"Unsupported Media Type"}}}}}},"429":{"description":"Rate limit reached. Wait for the Retry-After header's seconds and retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"429-1":{"summary":"Wait Retry-After seconds. Cache currencies and pairs (they change slowly), poll status every 15-30 seconds or use webhooks.","value":{"error":"Rate limit exceeded, retry in 1 minute"}}}}}},"500":{"description":"Our error. Retry later; for create, retry with the same Idempotency-Key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{}}}},"503":{"description":"Temporarily unavailable: no fresh rates, not enough reserve, exchange paused or too many unpaid orders.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"503-1":{"summary":"Also \"Exchange is temporarily disabled\" and \"BTC deposits are temporarily unavailable, try again later\". Show the pair as unavailable and retry later.","value":{"error":"Rates temporarily unavailable"}},"503-2":{"summary":"The amount is above what we can pay out right now: stay within maxDeposit from price. Also \"Fixed-rate exposure limit reached\" (try float) and \"Payout liquidity is not verified; try again shortly\".","value":{"error":"Insufficient payout liquidity for this amount"}},"503-3":{"summary":"Create an order only when the customer is ready to pay; unpaid ones expire.","value":{"error":"Too many unpaid orders open for this API key"}},"503-4":{"summary":"Also \"Too many open orders right now, try again later\". Retry with the same Idempotency-Key.","value":{"error":"No deposit address available, try again in a minute"}}}}}}}}},"/pairs":{"post":{"operationId":"pairs","summary":"Every pair of enabled coins","description":"120 requests per minute per API key. https://anonchange.com/docs#pairs","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{}},"example":{}}}},"responses":{"200":{"description":"Every pair of enabled coins","content":{"application/json":{"example":[{"from":"BTC","to":"XMR","rateTypes":["float","fixed"]},{"from":"XMR","to":"BTC","rateTypes":["float","fixed"]}]}}},"400":{"description":"Invalid input: unknown or missing field, bad amount or address, pair not available, body not JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"400-1":{"summary":"Send valid JSON. An endpoint without fields takes {}.","value":{"error":"Body is not valid JSON but content-type is set to 'application/json'"}},"400-2":{"summary":"Send a JSON object as the body, at least {}.","value":{"error":"body must be object"}},"400-3":{"summary":"A field name is wrong or unknown: amount (not amountIn) in price and create, id (not orderId) in status, continue and refund.","value":{"error":"body must NOT have additional properties"}},"400-4":{"summary":"Add the named field. Names are case-sensitive.","value":{"error":"body must have required property 'rateType'"}},"400-5":{"summary":"Amounts are strings like \"0.01\", never JSON numbers, with a dot and no thousands separators. Also for amountOut (\"body/amountOut must be string\").","value":{"error":"Enter a valid amount (digits and up to 12 decimals)"}},"400-6":{"summary":"Round to the coin's decimals from currencies.","value":{"error":"Invalid BTC amount (at most 8 decimals)"}},"400-7":{"summary":"Use the coin code from currencies, in capitals: BTC, XMR, USDT_SOL.","value":{"error":"body/from must be equal to one of the allowed values"}},"400-8":{"summary":"from and to must differ.","value":{"error":"Choose two different coins"}},"400-9":{"summary":"One of the coins is disabled right now (enabled: false in currencies). Hide it and check again later.","value":{"error":"This pair is not available"}},"400-10":{"summary":"Pick one: what the customer sends (amount) or receives (amountOut).","value":{"error":"Send either amount or amountOut, not both"}},"400-11":{"summary":"Every order needs amount or amountOut.","value":{"error":"Orders need an amount"}},"400-12":{"summary":"The deposit must be at least minDeposit (from price or currencies).","value":{"error":"Amount must be within the deposit limits"}},"400-13":{"summary":"payoutAddress is for the to coin, refundAddress for the from coin (\"Invalid BTC refund address\"). Mainnet addresses only, as the customer gave them.","value":{"error":"Invalid XMR payout address"}},"400-14":{"summary":"payoutAddress is missing or shorter than 20 characters.","value":{"error":"Enter a valid payout address"}},"400-15":{"summary":"A deposit address of ours was pasted as the payout address. Ask the customer for their own.","value":{"error":"That XMR payout address belongs to this exchange; use an address from your own wallet"}},"400-16":{"summary":"Stay within the cap shown in your dashboard. It is a number (0.5), not a string, with at most 2 decimals.","value":{"error":"markupPercent can be at most 2"}},"400-17":{"summary":"Only https URLs on port 443 with a public host name or address (also \"must use the default https port (443)\", \"must be a public address\").","value":{"error":"webhookUrl must use https"}},"400-18":{"summary":"For example your checkout id, or a UUID.","value":{"error":"Idempotency-Key must be 8-128 letters, digits, - or _"}}}}}},"401":{"description":"Missing or invalid authentication headers, expired timestamp, reused nonce or wrong signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"401-1":{"summary":"Send all four headers on every request, including currencies and pairs.","value":{"error":"X-API-KEY, X-API-TIMESTAMP, X-API-NONCE and X-API-SIGN headers are required"}},"401-2":{"summary":"Use seconds (10 digits), not milliseconds, and keep your server clock synced (NTP): we accept 60 seconds either way.","value":{"error":"X-API-TIMESTAMP must be the current unix time in seconds"}},"401-3":{"summary":"For example 32 random hex characters (openssl rand -hex 16).","value":{"error":"X-API-NONCE must be 16-64 letters, digits, - or _"}},"401-4":{"summary":"Make a new nonce for every request, retries included.","value":{"error":"X-API-NONCE was already used"}},"401-5":{"summary":"Usually the signed string differs from the request: the path must include /api/partner/v1 and nothing after it (no query string, no trailing slash); hash the exact body bytes you send, not a re-serialized copy; the method is POST in capitals; no newline at the end; hex digests, not base64. Also check you use the current secret (rotating it ends the old one).","value":{"error":"Invalid API key or signature"}}}}}},"403":{"description":"Your partner account is disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"403-1":{"summary":"Contact support.","value":{"error":"This partner account is disabled"}}}}}},"404":{"description":"Order not found (or not one of yours), or no such endpoint (every endpoint is a POST).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"404-1":{"summary":"Use POST, the exact endpoint name and no trailing slash.","value":{"error":"Unknown endpoint GET /api/partner/v1/…: every endpoint is a POST, see /docs"}},"404-2":{"summary":"The id is not one of your orders (orders made with another API key or on the site are not visible). In orders, before must be one of your order ids.","value":{"error":"Order not found"}}}}}},"409":{"description":"The order is not in a state that allows this action, or it has to wait a moment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"409-1":{"summary":"Only when the order's actions.continue is true (after a price move). Check status first.","value":{"error":"This order cannot be continued"}},"409-2":{"summary":"Only when actions.refund is true. Otherwise support handles the order.","value":{"error":"This order cannot be refunded by you; please contact support"}},"409-3":{"summary":"Also \"No fresh market rate, try again shortly\". Retry after a minute; the customer's choice is kept.","value":{"error":"Payouts are paused right now, try again later"}}}}}},"413":{"description":"Body larger than 16 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{}}}},"415":{"description":"Content-Type is not application/json.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"415-1":{"summary":"Set Content-Type: application/json.","value":{"error":"Unsupported Media Type"}}}}}},"429":{"description":"Rate limit reached. Wait for the Retry-After header's seconds and retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"429-1":{"summary":"Wait Retry-After seconds. Cache currencies and pairs (they change slowly), poll status every 15-30 seconds or use webhooks.","value":{"error":"Rate limit exceeded, retry in 1 minute"}}}}}},"500":{"description":"Our error. Retry later; for create, retry with the same Idempotency-Key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{}}}},"503":{"description":"Temporarily unavailable: no fresh rates, not enough reserve, exchange paused or too many unpaid orders.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"503-1":{"summary":"Also \"Exchange is temporarily disabled\" and \"BTC deposits are temporarily unavailable, try again later\". Show the pair as unavailable and retry later.","value":{"error":"Rates temporarily unavailable"}},"503-2":{"summary":"The amount is above what we can pay out right now: stay within maxDeposit from price. Also \"Fixed-rate exposure limit reached\" (try float) and \"Payout liquidity is not verified; try again shortly\".","value":{"error":"Insufficient payout liquidity for this amount"}},"503-3":{"summary":"Create an order only when the customer is ready to pay; unpaid ones expire.","value":{"error":"Too many unpaid orders open for this API key"}},"503-4":{"summary":"Also \"Too many open orders right now, try again later\". Retry with the same Idempotency-Key.","value":{"error":"No deposit address available, try again in a minute"}}}}}}}}},"/price":{"post":{"operationId":"price","summary":"A quote for a pair","description":"600 requests per minute per API key. https://anonchange.com/docs#price","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"from":{"type":"string","description":"Coin the customer sends."},"to":{"type":"string","description":"Coin the customer receives."},"rateType":{"type":"string","description":"float or fixed.","enum":["float","fixed"]},"amount":{"type":"string","description":"Amount of the from coin the customer sends. Without it (and without amountOut), amountIn and amountOut are null."},"amountOut":{"type":"string","description":"Quote by the amount to receive instead: amountIn becomes the smallest deposit that receives at least this. Not together with amount."},"markupPercent":{"type":"number","description":"Your markup for this request, 0 up to the cap shown in your dashboard, at most 2 decimals. Without it, your dashboard markup applies.","minimum":0}},"required":["from","to","rateType"]},"example":{"from":"BTC","to":"XMR","rateType":"fixed","amount":"0.01"}}}},"responses":{"200":{"description":"A quote for a pair","content":{"application/json":{"example":{"from":"BTC","to":"XMR","rateType":"fixed","amountIn":"0.01","amountOut":"4.044423745","rate":"410.6217","feePercent":1.5,"networkFee":"0.0002","minDeposit":"0.0002","maxDeposit":"0.45","rateLockMinutes":10,"maxRateDriftPercent":1.2}}}},"400":{"description":"Invalid input: unknown or missing field, bad amount or address, pair not available, body not JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"400-1":{"summary":"Send valid JSON. An endpoint without fields takes {}.","value":{"error":"Body is not valid JSON but content-type is set to 'application/json'"}},"400-2":{"summary":"Send a JSON object as the body, at least {}.","value":{"error":"body must be object"}},"400-3":{"summary":"A field name is wrong or unknown: amount (not amountIn) in price and create, id (not orderId) in status, continue and refund.","value":{"error":"body must NOT have additional properties"}},"400-4":{"summary":"Add the named field. Names are case-sensitive.","value":{"error":"body must have required property 'rateType'"}},"400-5":{"summary":"Amounts are strings like \"0.01\", never JSON numbers, with a dot and no thousands separators. Also for amountOut (\"body/amountOut must be string\").","value":{"error":"Enter a valid amount (digits and up to 12 decimals)"}},"400-6":{"summary":"Round to the coin's decimals from currencies.","value":{"error":"Invalid BTC amount (at most 8 decimals)"}},"400-7":{"summary":"Use the coin code from currencies, in capitals: BTC, XMR, USDT_SOL.","value":{"error":"body/from must be equal to one of the allowed values"}},"400-8":{"summary":"from and to must differ.","value":{"error":"Choose two different coins"}},"400-9":{"summary":"One of the coins is disabled right now (enabled: false in currencies). Hide it and check again later.","value":{"error":"This pair is not available"}},"400-10":{"summary":"Pick one: what the customer sends (amount) or receives (amountOut).","value":{"error":"Send either amount or amountOut, not both"}},"400-11":{"summary":"Every order needs amount or amountOut.","value":{"error":"Orders need an amount"}},"400-12":{"summary":"The deposit must be at least minDeposit (from price or currencies).","value":{"error":"Amount must be within the deposit limits"}},"400-13":{"summary":"payoutAddress is for the to coin, refundAddress for the from coin (\"Invalid BTC refund address\"). Mainnet addresses only, as the customer gave them.","value":{"error":"Invalid XMR payout address"}},"400-14":{"summary":"payoutAddress is missing or shorter than 20 characters.","value":{"error":"Enter a valid payout address"}},"400-15":{"summary":"A deposit address of ours was pasted as the payout address. Ask the customer for their own.","value":{"error":"That XMR payout address belongs to this exchange; use an address from your own wallet"}},"400-16":{"summary":"Stay within the cap shown in your dashboard. It is a number (0.5), not a string, with at most 2 decimals.","value":{"error":"markupPercent can be at most 2"}},"400-17":{"summary":"Only https URLs on port 443 with a public host name or address (also \"must use the default https port (443)\", \"must be a public address\").","value":{"error":"webhookUrl must use https"}},"400-18":{"summary":"For example your checkout id, or a UUID.","value":{"error":"Idempotency-Key must be 8-128 letters, digits, - or _"}}}}}},"401":{"description":"Missing or invalid authentication headers, expired timestamp, reused nonce or wrong signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"401-1":{"summary":"Send all four headers on every request, including currencies and pairs.","value":{"error":"X-API-KEY, X-API-TIMESTAMP, X-API-NONCE and X-API-SIGN headers are required"}},"401-2":{"summary":"Use seconds (10 digits), not milliseconds, and keep your server clock synced (NTP): we accept 60 seconds either way.","value":{"error":"X-API-TIMESTAMP must be the current unix time in seconds"}},"401-3":{"summary":"For example 32 random hex characters (openssl rand -hex 16).","value":{"error":"X-API-NONCE must be 16-64 letters, digits, - or _"}},"401-4":{"summary":"Make a new nonce for every request, retries included.","value":{"error":"X-API-NONCE was already used"}},"401-5":{"summary":"Usually the signed string differs from the request: the path must include /api/partner/v1 and nothing after it (no query string, no trailing slash); hash the exact body bytes you send, not a re-serialized copy; the method is POST in capitals; no newline at the end; hex digests, not base64. Also check you use the current secret (rotating it ends the old one).","value":{"error":"Invalid API key or signature"}}}}}},"403":{"description":"Your partner account is disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"403-1":{"summary":"Contact support.","value":{"error":"This partner account is disabled"}}}}}},"404":{"description":"Order not found (or not one of yours), or no such endpoint (every endpoint is a POST).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"404-1":{"summary":"Use POST, the exact endpoint name and no trailing slash.","value":{"error":"Unknown endpoint GET /api/partner/v1/…: every endpoint is a POST, see /docs"}},"404-2":{"summary":"The id is not one of your orders (orders made with another API key or on the site are not visible). In orders, before must be one of your order ids.","value":{"error":"Order not found"}}}}}},"409":{"description":"The order is not in a state that allows this action, or it has to wait a moment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"409-1":{"summary":"Only when the order's actions.continue is true (after a price move). Check status first.","value":{"error":"This order cannot be continued"}},"409-2":{"summary":"Only when actions.refund is true. Otherwise support handles the order.","value":{"error":"This order cannot be refunded by you; please contact support"}},"409-3":{"summary":"Also \"No fresh market rate, try again shortly\". Retry after a minute; the customer's choice is kept.","value":{"error":"Payouts are paused right now, try again later"}}}}}},"413":{"description":"Body larger than 16 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{}}}},"415":{"description":"Content-Type is not application/json.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"415-1":{"summary":"Set Content-Type: application/json.","value":{"error":"Unsupported Media Type"}}}}}},"429":{"description":"Rate limit reached. Wait for the Retry-After header's seconds and retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"429-1":{"summary":"Wait Retry-After seconds. Cache currencies and pairs (they change slowly), poll status every 15-30 seconds or use webhooks.","value":{"error":"Rate limit exceeded, retry in 1 minute"}}}}}},"500":{"description":"Our error. Retry later; for create, retry with the same Idempotency-Key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{}}}},"503":{"description":"Temporarily unavailable: no fresh rates, not enough reserve, exchange paused or too many unpaid orders.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"503-1":{"summary":"Also \"Exchange is temporarily disabled\" and \"BTC deposits are temporarily unavailable, try again later\". Show the pair as unavailable and retry later.","value":{"error":"Rates temporarily unavailable"}},"503-2":{"summary":"The amount is above what we can pay out right now: stay within maxDeposit from price. Also \"Fixed-rate exposure limit reached\" (try float) and \"Payout liquidity is not verified; try again shortly\".","value":{"error":"Insufficient payout liquidity for this amount"}},"503-3":{"summary":"Create an order only when the customer is ready to pay; unpaid ones expire.","value":{"error":"Too many unpaid orders open for this API key"}},"503-4":{"summary":"Also \"Too many open orders right now, try again later\". Retry with the same Idempotency-Key.","value":{"error":"No deposit address available, try again in a minute"}}}}}}}}},"/create":{"post":{"operationId":"create","summary":"Create an order","description":"60 requests per minute per API key. https://anonchange.com/docs#create","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8,128}$"},"description":"Your own id for the order: a retry with the same key returns the order made the first time (200 instead of 201)."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"from":{"type":"string","description":"As for price."},"to":{"type":"string","description":"As for price."},"rateType":{"type":"string","description":"As for price.","enum":["float","fixed"]},"amount":{"type":"string","description":"Required (or amountOut instead). At least minDeposit."},"amountOut":{"type":"string","description":"Instead of amount: the amount the customer should receive. The deposit amount is worked out from it, as in price."},"markupPercent":{"type":"number","description":"Your markup for this order, as in price. Saved with the order.","minimum":0},"webhookUrl":{"type":"string","description":"https URL that gets a signed POST whenever the order's status changes (see Webhooks).","format":"uri","maxLength":500},"payoutAddress":{"type":"string","description":"The customer's address for the to coin.","minLength":20,"maxLength":120},"refundAddress":{"type":"string","description":"The customer's address for the from coin. Strongly recommended: without it, refunds go through support.","maxLength":120}},"required":["from","to","rateType","amount","payoutAddress"]},"example":{"from":"BTC","to":"XMR","rateType":"fixed","amount":"0.01","payoutAddress":"<customer's XMR address>","refundAddress":"<customer's BTC address>"}}}},"responses":{"201":{"description":"Create an order","content":{"application/json":{"example":{"id":"3f6c1a52-8d1e-4b7a-9c35-2f0e6b9d4a17","status":"awaiting_deposit","from":"BTC","to":"XMR","rateType":"fixed","depositAddress":"<BTC deposit address>","payoutAddress":"<customer's XMR address>","refundAddress":"<customer's BTC address>","quote":{"amountIn":"0.01","amountOut":"4.044423745","rate":"410.6217"},"amountIn":null,"amountOut":null,"rate":null,"feePercent":1.5,"networkFee":"0.0002","requiredConfirmations":2,"deposits":[],"payout":null,"pendingDeposit":null,"continuing":false,"actions":{"continue":false,"refund":false},"refund":null,"note":null,"guarantee":"-----BEGIN PGP SIGNED MESSAGE-----\n…\n-----END PGP SIGNATURE-----","rateLockedUntil":"2026-10-19T12:10:00.000Z","expiresAt":"2026-10-19T12:10:00.000Z","createdAt":"2026-10-19T12:00:00.000Z","completedAt":null,"viewKey":"<view key>","url":"https://anonchange.com/order/3f6c1a52-8d1e-4b7a-9c35-2f0e6b9d4a17#key=<view key>"},"schema":{"allOf":[{"$ref":"#/components/schemas/Order"},{"type":"object","properties":{"viewKey":{"type":"string","description":"Shows the order's addresses and transactions on its page. Returned only here, once."},"url":{"type":"string","description":"The customer's order page, with the view key in the fragment."}}}]}}}},"400":{"description":"Invalid input: unknown or missing field, bad amount or address, pair not available, body not JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"400-1":{"summary":"Send valid JSON. An endpoint without fields takes {}.","value":{"error":"Body is not valid JSON but content-type is set to 'application/json'"}},"400-2":{"summary":"Send a JSON object as the body, at least {}.","value":{"error":"body must be object"}},"400-3":{"summary":"A field name is wrong or unknown: amount (not amountIn) in price and create, id (not orderId) in status, continue and refund.","value":{"error":"body must NOT have additional properties"}},"400-4":{"summary":"Add the named field. Names are case-sensitive.","value":{"error":"body must have required property 'rateType'"}},"400-5":{"summary":"Amounts are strings like \"0.01\", never JSON numbers, with a dot and no thousands separators. Also for amountOut (\"body/amountOut must be string\").","value":{"error":"Enter a valid amount (digits and up to 12 decimals)"}},"400-6":{"summary":"Round to the coin's decimals from currencies.","value":{"error":"Invalid BTC amount (at most 8 decimals)"}},"400-7":{"summary":"Use the coin code from currencies, in capitals: BTC, XMR, USDT_SOL.","value":{"error":"body/from must be equal to one of the allowed values"}},"400-8":{"summary":"from and to must differ.","value":{"error":"Choose two different coins"}},"400-9":{"summary":"One of the coins is disabled right now (enabled: false in currencies). Hide it and check again later.","value":{"error":"This pair is not available"}},"400-10":{"summary":"Pick one: what the customer sends (amount) or receives (amountOut).","value":{"error":"Send either amount or amountOut, not both"}},"400-11":{"summary":"Every order needs amount or amountOut.","value":{"error":"Orders need an amount"}},"400-12":{"summary":"The deposit must be at least minDeposit (from price or currencies).","value":{"error":"Amount must be within the deposit limits"}},"400-13":{"summary":"payoutAddress is for the to coin, refundAddress for the from coin (\"Invalid BTC refund address\"). Mainnet addresses only, as the customer gave them.","value":{"error":"Invalid XMR payout address"}},"400-14":{"summary":"payoutAddress is missing or shorter than 20 characters.","value":{"error":"Enter a valid payout address"}},"400-15":{"summary":"A deposit address of ours was pasted as the payout address. Ask the customer for their own.","value":{"error":"That XMR payout address belongs to this exchange; use an address from your own wallet"}},"400-16":{"summary":"Stay within the cap shown in your dashboard. It is a number (0.5), not a string, with at most 2 decimals.","value":{"error":"markupPercent can be at most 2"}},"400-17":{"summary":"Only https URLs on port 443 with a public host name or address (also \"must use the default https port (443)\", \"must be a public address\").","value":{"error":"webhookUrl must use https"}},"400-18":{"summary":"For example your checkout id, or a UUID.","value":{"error":"Idempotency-Key must be 8-128 letters, digits, - or _"}}}}}},"401":{"description":"Missing or invalid authentication headers, expired timestamp, reused nonce or wrong signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"401-1":{"summary":"Send all four headers on every request, including currencies and pairs.","value":{"error":"X-API-KEY, X-API-TIMESTAMP, X-API-NONCE and X-API-SIGN headers are required"}},"401-2":{"summary":"Use seconds (10 digits), not milliseconds, and keep your server clock synced (NTP): we accept 60 seconds either way.","value":{"error":"X-API-TIMESTAMP must be the current unix time in seconds"}},"401-3":{"summary":"For example 32 random hex characters (openssl rand -hex 16).","value":{"error":"X-API-NONCE must be 16-64 letters, digits, - or _"}},"401-4":{"summary":"Make a new nonce for every request, retries included.","value":{"error":"X-API-NONCE was already used"}},"401-5":{"summary":"Usually the signed string differs from the request: the path must include /api/partner/v1 and nothing after it (no query string, no trailing slash); hash the exact body bytes you send, not a re-serialized copy; the method is POST in capitals; no newline at the end; hex digests, not base64. Also check you use the current secret (rotating it ends the old one).","value":{"error":"Invalid API key or signature"}}}}}},"403":{"description":"Your partner account is disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"403-1":{"summary":"Contact support.","value":{"error":"This partner account is disabled"}}}}}},"404":{"description":"Order not found (or not one of yours), or no such endpoint (every endpoint is a POST).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"404-1":{"summary":"Use POST, the exact endpoint name and no trailing slash.","value":{"error":"Unknown endpoint GET /api/partner/v1/…: every endpoint is a POST, see /docs"}},"404-2":{"summary":"The id is not one of your orders (orders made with another API key or on the site are not visible). In orders, before must be one of your order ids.","value":{"error":"Order not found"}}}}}},"409":{"description":"The order is not in a state that allows this action, or it has to wait a moment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"409-1":{"summary":"Only when the order's actions.continue is true (after a price move). Check status first.","value":{"error":"This order cannot be continued"}},"409-2":{"summary":"Only when actions.refund is true. Otherwise support handles the order.","value":{"error":"This order cannot be refunded by you; please contact support"}},"409-3":{"summary":"Also \"No fresh market rate, try again shortly\". Retry after a minute; the customer's choice is kept.","value":{"error":"Payouts are paused right now, try again later"}}}}}},"413":{"description":"Body larger than 16 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{}}}},"415":{"description":"Content-Type is not application/json.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"415-1":{"summary":"Set Content-Type: application/json.","value":{"error":"Unsupported Media Type"}}}}}},"429":{"description":"Rate limit reached. Wait for the Retry-After header's seconds and retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"429-1":{"summary":"Wait Retry-After seconds. Cache currencies and pairs (they change slowly), poll status every 15-30 seconds or use webhooks.","value":{"error":"Rate limit exceeded, retry in 1 minute"}}}}}},"500":{"description":"Our error. Retry later; for create, retry with the same Idempotency-Key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{}}}},"503":{"description":"Temporarily unavailable: no fresh rates, not enough reserve, exchange paused or too many unpaid orders.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"503-1":{"summary":"Also \"Exchange is temporarily disabled\" and \"BTC deposits are temporarily unavailable, try again later\". Show the pair as unavailable and retry later.","value":{"error":"Rates temporarily unavailable"}},"503-2":{"summary":"The amount is above what we can pay out right now: stay within maxDeposit from price. Also \"Fixed-rate exposure limit reached\" (try float) and \"Payout liquidity is not verified; try again shortly\".","value":{"error":"Insufficient payout liquidity for this amount"}},"503-3":{"summary":"Create an order only when the customer is ready to pay; unpaid ones expire.","value":{"error":"Too many unpaid orders open for this API key"}},"503-4":{"summary":"Also \"Too many open orders right now, try again later\". Retry with the same Idempotency-Key.","value":{"error":"No deposit address available, try again in a minute"}}}}}}}}},"/status":{"post":{"operationId":"status","summary":"One of your orders","description":"600 requests per minute per API key. https://anonchange.com/docs#status","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["id"],"properties":{"id":{"type":"string","format":"uuid"}}},"example":{"id":"3f6c1a52-8d1e-4b7a-9c35-2f0e6b9d4a17"}}}},"responses":{"200":{"description":"One of your orders","content":{"application/json":{"example":{"id":"3f6c1a52-8d1e-4b7a-9c35-2f0e6b9d4a17","status":"completed","from":"BTC","to":"XMR","rateType":"fixed","depositAddress":"<BTC deposit address>","payoutAddress":"<customer's XMR address>","refundAddress":"<customer's BTC address>","quote":{"amountIn":"0.01","amountOut":"4.044423745","rate":"410.6217"},"amountIn":"0.01","amountOut":"4.044423745","rate":"410.6217","feePercent":1.5,"networkFee":"0.0002","requiredConfirmations":2,"deposits":[{"txid":"<deposit txid>","amount":"0.01","confirmations":2,"credited":true,"seenAt":"2026-10-19T12:04:12.000Z"}],"payout":{"status":"confirmed","amount":"4.044423745","txid":"<payout txid>","broadcastAt":"2026-10-19T12:31:40.000Z","confirmedAt":"2026-10-19T12:52:03.000Z"},"pendingDeposit":null,"continuing":false,"actions":{"continue":false,"refund":false},"refund":null,"note":null,"guarantee":"-----BEGIN PGP SIGNED MESSAGE-----\n…\n-----END PGP SIGNATURE-----","rateLockedUntil":"2026-10-19T12:10:00.000Z","expiresAt":"2026-10-19T12:10:00.000Z","createdAt":"2026-10-19T12:00:00.000Z","completedAt":"2026-10-19T12:52:03.000Z"},"schema":{"$ref":"#/components/schemas/Order"}}}},"400":{"description":"Invalid input: unknown or missing field, bad amount or address, pair not available, body not JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"400-1":{"summary":"Send valid JSON. An endpoint without fields takes {}.","value":{"error":"Body is not valid JSON but content-type is set to 'application/json'"}},"400-2":{"summary":"Send a JSON object as the body, at least {}.","value":{"error":"body must be object"}},"400-3":{"summary":"A field name is wrong or unknown: amount (not amountIn) in price and create, id (not orderId) in status, continue and refund.","value":{"error":"body must NOT have additional properties"}},"400-4":{"summary":"Add the named field. Names are case-sensitive.","value":{"error":"body must have required property 'rateType'"}},"400-5":{"summary":"Amounts are strings like \"0.01\", never JSON numbers, with a dot and no thousands separators. Also for amountOut (\"body/amountOut must be string\").","value":{"error":"Enter a valid amount (digits and up to 12 decimals)"}},"400-6":{"summary":"Round to the coin's decimals from currencies.","value":{"error":"Invalid BTC amount (at most 8 decimals)"}},"400-7":{"summary":"Use the coin code from currencies, in capitals: BTC, XMR, USDT_SOL.","value":{"error":"body/from must be equal to one of the allowed values"}},"400-8":{"summary":"from and to must differ.","value":{"error":"Choose two different coins"}},"400-9":{"summary":"One of the coins is disabled right now (enabled: false in currencies). Hide it and check again later.","value":{"error":"This pair is not available"}},"400-10":{"summary":"Pick one: what the customer sends (amount) or receives (amountOut).","value":{"error":"Send either amount or amountOut, not both"}},"400-11":{"summary":"Every order needs amount or amountOut.","value":{"error":"Orders need an amount"}},"400-12":{"summary":"The deposit must be at least minDeposit (from price or currencies).","value":{"error":"Amount must be within the deposit limits"}},"400-13":{"summary":"payoutAddress is for the to coin, refundAddress for the from coin (\"Invalid BTC refund address\"). Mainnet addresses only, as the customer gave them.","value":{"error":"Invalid XMR payout address"}},"400-14":{"summary":"payoutAddress is missing or shorter than 20 characters.","value":{"error":"Enter a valid payout address"}},"400-15":{"summary":"A deposit address of ours was pasted as the payout address. Ask the customer for their own.","value":{"error":"That XMR payout address belongs to this exchange; use an address from your own wallet"}},"400-16":{"summary":"Stay within the cap shown in your dashboard. It is a number (0.5), not a string, with at most 2 decimals.","value":{"error":"markupPercent can be at most 2"}},"400-17":{"summary":"Only https URLs on port 443 with a public host name or address (also \"must use the default https port (443)\", \"must be a public address\").","value":{"error":"webhookUrl must use https"}},"400-18":{"summary":"For example your checkout id, or a UUID.","value":{"error":"Idempotency-Key must be 8-128 letters, digits, - or _"}}}}}},"401":{"description":"Missing or invalid authentication headers, expired timestamp, reused nonce or wrong signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"401-1":{"summary":"Send all four headers on every request, including currencies and pairs.","value":{"error":"X-API-KEY, X-API-TIMESTAMP, X-API-NONCE and X-API-SIGN headers are required"}},"401-2":{"summary":"Use seconds (10 digits), not milliseconds, and keep your server clock synced (NTP): we accept 60 seconds either way.","value":{"error":"X-API-TIMESTAMP must be the current unix time in seconds"}},"401-3":{"summary":"For example 32 random hex characters (openssl rand -hex 16).","value":{"error":"X-API-NONCE must be 16-64 letters, digits, - or _"}},"401-4":{"summary":"Make a new nonce for every request, retries included.","value":{"error":"X-API-NONCE was already used"}},"401-5":{"summary":"Usually the signed string differs from the request: the path must include /api/partner/v1 and nothing after it (no query string, no trailing slash); hash the exact body bytes you send, not a re-serialized copy; the method is POST in capitals; no newline at the end; hex digests, not base64. Also check you use the current secret (rotating it ends the old one).","value":{"error":"Invalid API key or signature"}}}}}},"403":{"description":"Your partner account is disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"403-1":{"summary":"Contact support.","value":{"error":"This partner account is disabled"}}}}}},"404":{"description":"Order not found (or not one of yours), or no such endpoint (every endpoint is a POST).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"404-1":{"summary":"Use POST, the exact endpoint name and no trailing slash.","value":{"error":"Unknown endpoint GET /api/partner/v1/…: every endpoint is a POST, see /docs"}},"404-2":{"summary":"The id is not one of your orders (orders made with another API key or on the site are not visible). In orders, before must be one of your order ids.","value":{"error":"Order not found"}}}}}},"409":{"description":"The order is not in a state that allows this action, or it has to wait a moment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"409-1":{"summary":"Only when the order's actions.continue is true (after a price move). Check status first.","value":{"error":"This order cannot be continued"}},"409-2":{"summary":"Only when actions.refund is true. Otherwise support handles the order.","value":{"error":"This order cannot be refunded by you; please contact support"}},"409-3":{"summary":"Also \"No fresh market rate, try again shortly\". Retry after a minute; the customer's choice is kept.","value":{"error":"Payouts are paused right now, try again later"}}}}}},"413":{"description":"Body larger than 16 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{}}}},"415":{"description":"Content-Type is not application/json.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"415-1":{"summary":"Set Content-Type: application/json.","value":{"error":"Unsupported Media Type"}}}}}},"429":{"description":"Rate limit reached. Wait for the Retry-After header's seconds and retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"429-1":{"summary":"Wait Retry-After seconds. Cache currencies and pairs (they change slowly), poll status every 15-30 seconds or use webhooks.","value":{"error":"Rate limit exceeded, retry in 1 minute"}}}}}},"500":{"description":"Our error. Retry later; for create, retry with the same Idempotency-Key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{}}}},"503":{"description":"Temporarily unavailable: no fresh rates, not enough reserve, exchange paused or too many unpaid orders.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"503-1":{"summary":"Also \"Exchange is temporarily disabled\" and \"BTC deposits are temporarily unavailable, try again later\". Show the pair as unavailable and retry later.","value":{"error":"Rates temporarily unavailable"}},"503-2":{"summary":"The amount is above what we can pay out right now: stay within maxDeposit from price. Also \"Fixed-rate exposure limit reached\" (try float) and \"Payout liquidity is not verified; try again shortly\".","value":{"error":"Insufficient payout liquidity for this amount"}},"503-3":{"summary":"Create an order only when the customer is ready to pay; unpaid ones expire.","value":{"error":"Too many unpaid orders open for this API key"}},"503-4":{"summary":"Also \"Too many open orders right now, try again later\". Retry with the same Idempotency-Key.","value":{"error":"No deposit address available, try again in a minute"}}}}}}}}},"/orders":{"post":{"operationId":"orders","summary":"Your orders, newest first","description":"60 requests per minute per API key. https://anonchange.com/docs#orders","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"limit":{"type":"integer","description":"1-100 orders, default 50.","minimum":1,"maximum":100},"before":{"type":"string","description":"An order id from the previous page: returns the orders older than it.","format":"uuid"},"status":{"type":"string","description":"Only orders in this status (see Order lifecycle).","enum":["awaiting_deposit","confirming","exchanging","sending","completed","expired","review","refund_required","refunding","refunded","failed"]}}},"example":{"limit":2}}}},"responses":{"200":{"description":"Your orders, newest first","content":{"application/json":{"example":{"orders":[{"id":"3f6c1a52-8d1e-4b7a-9c35-2f0e6b9d4a17","status":"completed","from":"BTC","to":"XMR","rateType":"fixed","amountIn":"0.01","amountOut":"2.93811204","feePercent":1.5,"markupPercent":0.5,"source":"api","earningUsd":"4.84","createdAt":"2026-10-19T10:02:11.000Z","completedAt":"2026-10-19T10:31:40.000Z"},{"id":"9b2e7c40-1f3a-4d6e-8a51-7c0d2e4f6a18","status":"awaiting_deposit","from":"LTC","to":"XMR","rateType":"float","amountIn":null,"amountOut":null,"feePercent":1.5,"markupPercent":0,"source":"api","earningUsd":null,"createdAt":"2026-10-19T09:48:03.000Z","completedAt":null}],"more":true}}}},"400":{"description":"Invalid input: unknown or missing field, bad amount or address, pair not available, body not JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"400-1":{"summary":"Send valid JSON. An endpoint without fields takes {}.","value":{"error":"Body is not valid JSON but content-type is set to 'application/json'"}},"400-2":{"summary":"Send a JSON object as the body, at least {}.","value":{"error":"body must be object"}},"400-3":{"summary":"A field name is wrong or unknown: amount (not amountIn) in price and create, id (not orderId) in status, continue and refund.","value":{"error":"body must NOT have additional properties"}},"400-4":{"summary":"Add the named field. Names are case-sensitive.","value":{"error":"body must have required property 'rateType'"}},"400-5":{"summary":"Amounts are strings like \"0.01\", never JSON numbers, with a dot and no thousands separators. Also for amountOut (\"body/amountOut must be string\").","value":{"error":"Enter a valid amount (digits and up to 12 decimals)"}},"400-6":{"summary":"Round to the coin's decimals from currencies.","value":{"error":"Invalid BTC amount (at most 8 decimals)"}},"400-7":{"summary":"Use the coin code from currencies, in capitals: BTC, XMR, USDT_SOL.","value":{"error":"body/from must be equal to one of the allowed values"}},"400-8":{"summary":"from and to must differ.","value":{"error":"Choose two different coins"}},"400-9":{"summary":"One of the coins is disabled right now (enabled: false in currencies). Hide it and check again later.","value":{"error":"This pair is not available"}},"400-10":{"summary":"Pick one: what the customer sends (amount) or receives (amountOut).","value":{"error":"Send either amount or amountOut, not both"}},"400-11":{"summary":"Every order needs amount or amountOut.","value":{"error":"Orders need an amount"}},"400-12":{"summary":"The deposit must be at least minDeposit (from price or currencies).","value":{"error":"Amount must be within the deposit limits"}},"400-13":{"summary":"payoutAddress is for the to coin, refundAddress for the from coin (\"Invalid BTC refund address\"). Mainnet addresses only, as the customer gave them.","value":{"error":"Invalid XMR payout address"}},"400-14":{"summary":"payoutAddress is missing or shorter than 20 characters.","value":{"error":"Enter a valid payout address"}},"400-15":{"summary":"A deposit address of ours was pasted as the payout address. Ask the customer for their own.","value":{"error":"That XMR payout address belongs to this exchange; use an address from your own wallet"}},"400-16":{"summary":"Stay within the cap shown in your dashboard. It is a number (0.5), not a string, with at most 2 decimals.","value":{"error":"markupPercent can be at most 2"}},"400-17":{"summary":"Only https URLs on port 443 with a public host name or address (also \"must use the default https port (443)\", \"must be a public address\").","value":{"error":"webhookUrl must use https"}},"400-18":{"summary":"For example your checkout id, or a UUID.","value":{"error":"Idempotency-Key must be 8-128 letters, digits, - or _"}}}}}},"401":{"description":"Missing or invalid authentication headers, expired timestamp, reused nonce or wrong signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"401-1":{"summary":"Send all four headers on every request, including currencies and pairs.","value":{"error":"X-API-KEY, X-API-TIMESTAMP, X-API-NONCE and X-API-SIGN headers are required"}},"401-2":{"summary":"Use seconds (10 digits), not milliseconds, and keep your server clock synced (NTP): we accept 60 seconds either way.","value":{"error":"X-API-TIMESTAMP must be the current unix time in seconds"}},"401-3":{"summary":"For example 32 random hex characters (openssl rand -hex 16).","value":{"error":"X-API-NONCE must be 16-64 letters, digits, - or _"}},"401-4":{"summary":"Make a new nonce for every request, retries included.","value":{"error":"X-API-NONCE was already used"}},"401-5":{"summary":"Usually the signed string differs from the request: the path must include /api/partner/v1 and nothing after it (no query string, no trailing slash); hash the exact body bytes you send, not a re-serialized copy; the method is POST in capitals; no newline at the end; hex digests, not base64. Also check you use the current secret (rotating it ends the old one).","value":{"error":"Invalid API key or signature"}}}}}},"403":{"description":"Your partner account is disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"403-1":{"summary":"Contact support.","value":{"error":"This partner account is disabled"}}}}}},"404":{"description":"Order not found (or not one of yours), or no such endpoint (every endpoint is a POST).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"404-1":{"summary":"Use POST, the exact endpoint name and no trailing slash.","value":{"error":"Unknown endpoint GET /api/partner/v1/…: every endpoint is a POST, see /docs"}},"404-2":{"summary":"The id is not one of your orders (orders made with another API key or on the site are not visible). In orders, before must be one of your order ids.","value":{"error":"Order not found"}}}}}},"409":{"description":"The order is not in a state that allows this action, or it has to wait a moment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"409-1":{"summary":"Only when the order's actions.continue is true (after a price move). Check status first.","value":{"error":"This order cannot be continued"}},"409-2":{"summary":"Only when actions.refund is true. Otherwise support handles the order.","value":{"error":"This order cannot be refunded by you; please contact support"}},"409-3":{"summary":"Also \"No fresh market rate, try again shortly\". Retry after a minute; the customer's choice is kept.","value":{"error":"Payouts are paused right now, try again later"}}}}}},"413":{"description":"Body larger than 16 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{}}}},"415":{"description":"Content-Type is not application/json.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"415-1":{"summary":"Set Content-Type: application/json.","value":{"error":"Unsupported Media Type"}}}}}},"429":{"description":"Rate limit reached. Wait for the Retry-After header's seconds and retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"429-1":{"summary":"Wait Retry-After seconds. Cache currencies and pairs (they change slowly), poll status every 15-30 seconds or use webhooks.","value":{"error":"Rate limit exceeded, retry in 1 minute"}}}}}},"500":{"description":"Our error. Retry later; for create, retry with the same Idempotency-Key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{}}}},"503":{"description":"Temporarily unavailable: no fresh rates, not enough reserve, exchange paused or too many unpaid orders.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"503-1":{"summary":"Also \"Exchange is temporarily disabled\" and \"BTC deposits are temporarily unavailable, try again later\". Show the pair as unavailable and retry later.","value":{"error":"Rates temporarily unavailable"}},"503-2":{"summary":"The amount is above what we can pay out right now: stay within maxDeposit from price. Also \"Fixed-rate exposure limit reached\" (try float) and \"Payout liquidity is not verified; try again shortly\".","value":{"error":"Insufficient payout liquidity for this amount"}},"503-3":{"summary":"Create an order only when the customer is ready to pay; unpaid ones expire.","value":{"error":"Too many unpaid orders open for this API key"}},"503-4":{"summary":"Also \"Too many open orders right now, try again later\". Retry with the same Idempotency-Key.","value":{"error":"No deposit address available, try again in a minute"}}}}}}}}},"/continue":{"post":{"operationId":"continue","summary":"Continue at the market rate after a price move","description":"30 requests per minute per API key. https://anonchange.com/docs#continue-refund","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["id"],"properties":{"id":{"type":"string","format":"uuid"}}},"example":{"id":"3f6c1a52-8d1e-4b7a-9c35-2f0e6b9d4a17"}}}},"responses":{"200":{"description":"Continue at the market rate after a price move","content":{"application/json":{"example":{"id":"3f6c1a52-8d1e-4b7a-9c35-2f0e6b9d4a17","status":"awaiting_deposit","from":"BTC","to":"XMR","rateType":"fixed","depositAddress":"<BTC deposit address>","payoutAddress":"<customer's XMR address>","refundAddress":"<customer's BTC address>","quote":{"amountIn":"0.01","amountOut":"4.044423745","rate":"410.6217"},"amountIn":null,"amountOut":null,"rate":null,"feePercent":1.5,"networkFee":"0.0002","requiredConfirmations":2,"deposits":[],"payout":null,"pendingDeposit":null,"continuing":false,"actions":{"continue":false,"refund":false},"refund":null,"note":null,"guarantee":"-----BEGIN PGP SIGNED MESSAGE-----\n…\n-----END PGP SIGNATURE-----","rateLockedUntil":"2026-10-19T12:10:00.000Z","expiresAt":"2026-10-19T12:10:00.000Z","createdAt":"2026-10-19T12:00:00.000Z","completedAt":null},"schema":{"$ref":"#/components/schemas/Order"}}}},"400":{"description":"Invalid input: unknown or missing field, bad amount or address, pair not available, body not JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"400-1":{"summary":"Send valid JSON. An endpoint without fields takes {}.","value":{"error":"Body is not valid JSON but content-type is set to 'application/json'"}},"400-2":{"summary":"Send a JSON object as the body, at least {}.","value":{"error":"body must be object"}},"400-3":{"summary":"A field name is wrong or unknown: amount (not amountIn) in price and create, id (not orderId) in status, continue and refund.","value":{"error":"body must NOT have additional properties"}},"400-4":{"summary":"Add the named field. Names are case-sensitive.","value":{"error":"body must have required property 'rateType'"}},"400-5":{"summary":"Amounts are strings like \"0.01\", never JSON numbers, with a dot and no thousands separators. Also for amountOut (\"body/amountOut must be string\").","value":{"error":"Enter a valid amount (digits and up to 12 decimals)"}},"400-6":{"summary":"Round to the coin's decimals from currencies.","value":{"error":"Invalid BTC amount (at most 8 decimals)"}},"400-7":{"summary":"Use the coin code from currencies, in capitals: BTC, XMR, USDT_SOL.","value":{"error":"body/from must be equal to one of the allowed values"}},"400-8":{"summary":"from and to must differ.","value":{"error":"Choose two different coins"}},"400-9":{"summary":"One of the coins is disabled right now (enabled: false in currencies). Hide it and check again later.","value":{"error":"This pair is not available"}},"400-10":{"summary":"Pick one: what the customer sends (amount) or receives (amountOut).","value":{"error":"Send either amount or amountOut, not both"}},"400-11":{"summary":"Every order needs amount or amountOut.","value":{"error":"Orders need an amount"}},"400-12":{"summary":"The deposit must be at least minDeposit (from price or currencies).","value":{"error":"Amount must be within the deposit limits"}},"400-13":{"summary":"payoutAddress is for the to coin, refundAddress for the from coin (\"Invalid BTC refund address\"). Mainnet addresses only, as the customer gave them.","value":{"error":"Invalid XMR payout address"}},"400-14":{"summary":"payoutAddress is missing or shorter than 20 characters.","value":{"error":"Enter a valid payout address"}},"400-15":{"summary":"A deposit address of ours was pasted as the payout address. Ask the customer for their own.","value":{"error":"That XMR payout address belongs to this exchange; use an address from your own wallet"}},"400-16":{"summary":"Stay within the cap shown in your dashboard. It is a number (0.5), not a string, with at most 2 decimals.","value":{"error":"markupPercent can be at most 2"}},"400-17":{"summary":"Only https URLs on port 443 with a public host name or address (also \"must use the default https port (443)\", \"must be a public address\").","value":{"error":"webhookUrl must use https"}},"400-18":{"summary":"For example your checkout id, or a UUID.","value":{"error":"Idempotency-Key must be 8-128 letters, digits, - or _"}}}}}},"401":{"description":"Missing or invalid authentication headers, expired timestamp, reused nonce or wrong signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"401-1":{"summary":"Send all four headers on every request, including currencies and pairs.","value":{"error":"X-API-KEY, X-API-TIMESTAMP, X-API-NONCE and X-API-SIGN headers are required"}},"401-2":{"summary":"Use seconds (10 digits), not milliseconds, and keep your server clock synced (NTP): we accept 60 seconds either way.","value":{"error":"X-API-TIMESTAMP must be the current unix time in seconds"}},"401-3":{"summary":"For example 32 random hex characters (openssl rand -hex 16).","value":{"error":"X-API-NONCE must be 16-64 letters, digits, - or _"}},"401-4":{"summary":"Make a new nonce for every request, retries included.","value":{"error":"X-API-NONCE was already used"}},"401-5":{"summary":"Usually the signed string differs from the request: the path must include /api/partner/v1 and nothing after it (no query string, no trailing slash); hash the exact body bytes you send, not a re-serialized copy; the method is POST in capitals; no newline at the end; hex digests, not base64. Also check you use the current secret (rotating it ends the old one).","value":{"error":"Invalid API key or signature"}}}}}},"403":{"description":"Your partner account is disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"403-1":{"summary":"Contact support.","value":{"error":"This partner account is disabled"}}}}}},"404":{"description":"Order not found (or not one of yours), or no such endpoint (every endpoint is a POST).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"404-1":{"summary":"Use POST, the exact endpoint name and no trailing slash.","value":{"error":"Unknown endpoint GET /api/partner/v1/…: every endpoint is a POST, see /docs"}},"404-2":{"summary":"The id is not one of your orders (orders made with another API key or on the site are not visible). In orders, before must be one of your order ids.","value":{"error":"Order not found"}}}}}},"409":{"description":"The order is not in a state that allows this action, or it has to wait a moment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"409-1":{"summary":"Only when the order's actions.continue is true (after a price move). Check status first.","value":{"error":"This order cannot be continued"}},"409-2":{"summary":"Only when actions.refund is true. Otherwise support handles the order.","value":{"error":"This order cannot be refunded by you; please contact support"}},"409-3":{"summary":"Also \"No fresh market rate, try again shortly\". Retry after a minute; the customer's choice is kept.","value":{"error":"Payouts are paused right now, try again later"}}}}}},"413":{"description":"Body larger than 16 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{}}}},"415":{"description":"Content-Type is not application/json.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"415-1":{"summary":"Set Content-Type: application/json.","value":{"error":"Unsupported Media Type"}}}}}},"429":{"description":"Rate limit reached. Wait for the Retry-After header's seconds and retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"429-1":{"summary":"Wait Retry-After seconds. Cache currencies and pairs (they change slowly), poll status every 15-30 seconds or use webhooks.","value":{"error":"Rate limit exceeded, retry in 1 minute"}}}}}},"500":{"description":"Our error. Retry later; for create, retry with the same Idempotency-Key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{}}}},"503":{"description":"Temporarily unavailable: no fresh rates, not enough reserve, exchange paused or too many unpaid orders.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"503-1":{"summary":"Also \"Exchange is temporarily disabled\" and \"BTC deposits are temporarily unavailable, try again later\". Show the pair as unavailable and retry later.","value":{"error":"Rates temporarily unavailable"}},"503-2":{"summary":"The amount is above what we can pay out right now: stay within maxDeposit from price. Also \"Fixed-rate exposure limit reached\" (try float) and \"Payout liquidity is not verified; try again shortly\".","value":{"error":"Insufficient payout liquidity for this amount"}},"503-3":{"summary":"Create an order only when the customer is ready to pay; unpaid ones expire.","value":{"error":"Too many unpaid orders open for this API key"}},"503-4":{"summary":"Also \"Too many open orders right now, try again later\". Retry with the same Idempotency-Key.","value":{"error":"No deposit address available, try again in a minute"}}}}}}}}},"/refund":{"post":{"operationId":"refund","summary":"Refund after a price move","description":"30 requests per minute per API key. https://anonchange.com/docs#continue-refund","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["id"],"properties":{"id":{"type":"string","format":"uuid"}}},"example":{"id":"3f6c1a52-8d1e-4b7a-9c35-2f0e6b9d4a17"}}}},"responses":{"200":{"description":"Refund after a price move","content":{"application/json":{"example":{"id":"3f6c1a52-8d1e-4b7a-9c35-2f0e6b9d4a17","status":"awaiting_deposit","from":"BTC","to":"XMR","rateType":"fixed","depositAddress":"<BTC deposit address>","payoutAddress":"<customer's XMR address>","refundAddress":"<customer's BTC address>","quote":{"amountIn":"0.01","amountOut":"4.044423745","rate":"410.6217"},"amountIn":null,"amountOut":null,"rate":null,"feePercent":1.5,"networkFee":"0.0002","requiredConfirmations":2,"deposits":[],"payout":null,"pendingDeposit":null,"continuing":false,"actions":{"continue":false,"refund":false},"refund":null,"note":null,"guarantee":"-----BEGIN PGP SIGNED MESSAGE-----\n…\n-----END PGP SIGNATURE-----","rateLockedUntil":"2026-10-19T12:10:00.000Z","expiresAt":"2026-10-19T12:10:00.000Z","createdAt":"2026-10-19T12:00:00.000Z","completedAt":null},"schema":{"$ref":"#/components/schemas/Order"}}}},"400":{"description":"Invalid input: unknown or missing field, bad amount or address, pair not available, body not JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"400-1":{"summary":"Send valid JSON. An endpoint without fields takes {}.","value":{"error":"Body is not valid JSON but content-type is set to 'application/json'"}},"400-2":{"summary":"Send a JSON object as the body, at least {}.","value":{"error":"body must be object"}},"400-3":{"summary":"A field name is wrong or unknown: amount (not amountIn) in price and create, id (not orderId) in status, continue and refund.","value":{"error":"body must NOT have additional properties"}},"400-4":{"summary":"Add the named field. Names are case-sensitive.","value":{"error":"body must have required property 'rateType'"}},"400-5":{"summary":"Amounts are strings like \"0.01\", never JSON numbers, with a dot and no thousands separators. Also for amountOut (\"body/amountOut must be string\").","value":{"error":"Enter a valid amount (digits and up to 12 decimals)"}},"400-6":{"summary":"Round to the coin's decimals from currencies.","value":{"error":"Invalid BTC amount (at most 8 decimals)"}},"400-7":{"summary":"Use the coin code from currencies, in capitals: BTC, XMR, USDT_SOL.","value":{"error":"body/from must be equal to one of the allowed values"}},"400-8":{"summary":"from and to must differ.","value":{"error":"Choose two different coins"}},"400-9":{"summary":"One of the coins is disabled right now (enabled: false in currencies). Hide it and check again later.","value":{"error":"This pair is not available"}},"400-10":{"summary":"Pick one: what the customer sends (amount) or receives (amountOut).","value":{"error":"Send either amount or amountOut, not both"}},"400-11":{"summary":"Every order needs amount or amountOut.","value":{"error":"Orders need an amount"}},"400-12":{"summary":"The deposit must be at least minDeposit (from price or currencies).","value":{"error":"Amount must be within the deposit limits"}},"400-13":{"summary":"payoutAddress is for the to coin, refundAddress for the from coin (\"Invalid BTC refund address\"). Mainnet addresses only, as the customer gave them.","value":{"error":"Invalid XMR payout address"}},"400-14":{"summary":"payoutAddress is missing or shorter than 20 characters.","value":{"error":"Enter a valid payout address"}},"400-15":{"summary":"A deposit address of ours was pasted as the payout address. Ask the customer for their own.","value":{"error":"That XMR payout address belongs to this exchange; use an address from your own wallet"}},"400-16":{"summary":"Stay within the cap shown in your dashboard. It is a number (0.5), not a string, with at most 2 decimals.","value":{"error":"markupPercent can be at most 2"}},"400-17":{"summary":"Only https URLs on port 443 with a public host name or address (also \"must use the default https port (443)\", \"must be a public address\").","value":{"error":"webhookUrl must use https"}},"400-18":{"summary":"For example your checkout id, or a UUID.","value":{"error":"Idempotency-Key must be 8-128 letters, digits, - or _"}}}}}},"401":{"description":"Missing or invalid authentication headers, expired timestamp, reused nonce or wrong signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"401-1":{"summary":"Send all four headers on every request, including currencies and pairs.","value":{"error":"X-API-KEY, X-API-TIMESTAMP, X-API-NONCE and X-API-SIGN headers are required"}},"401-2":{"summary":"Use seconds (10 digits), not milliseconds, and keep your server clock synced (NTP): we accept 60 seconds either way.","value":{"error":"X-API-TIMESTAMP must be the current unix time in seconds"}},"401-3":{"summary":"For example 32 random hex characters (openssl rand -hex 16).","value":{"error":"X-API-NONCE must be 16-64 letters, digits, - or _"}},"401-4":{"summary":"Make a new nonce for every request, retries included.","value":{"error":"X-API-NONCE was already used"}},"401-5":{"summary":"Usually the signed string differs from the request: the path must include /api/partner/v1 and nothing after it (no query string, no trailing slash); hash the exact body bytes you send, not a re-serialized copy; the method is POST in capitals; no newline at the end; hex digests, not base64. Also check you use the current secret (rotating it ends the old one).","value":{"error":"Invalid API key or signature"}}}}}},"403":{"description":"Your partner account is disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"403-1":{"summary":"Contact support.","value":{"error":"This partner account is disabled"}}}}}},"404":{"description":"Order not found (or not one of yours), or no such endpoint (every endpoint is a POST).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"404-1":{"summary":"Use POST, the exact endpoint name and no trailing slash.","value":{"error":"Unknown endpoint GET /api/partner/v1/…: every endpoint is a POST, see /docs"}},"404-2":{"summary":"The id is not one of your orders (orders made with another API key or on the site are not visible). In orders, before must be one of your order ids.","value":{"error":"Order not found"}}}}}},"409":{"description":"The order is not in a state that allows this action, or it has to wait a moment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"409-1":{"summary":"Only when the order's actions.continue is true (after a price move). Check status first.","value":{"error":"This order cannot be continued"}},"409-2":{"summary":"Only when actions.refund is true. Otherwise support handles the order.","value":{"error":"This order cannot be refunded by you; please contact support"}},"409-3":{"summary":"Also \"No fresh market rate, try again shortly\". Retry after a minute; the customer's choice is kept.","value":{"error":"Payouts are paused right now, try again later"}}}}}},"413":{"description":"Body larger than 16 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{}}}},"415":{"description":"Content-Type is not application/json.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"415-1":{"summary":"Set Content-Type: application/json.","value":{"error":"Unsupported Media Type"}}}}}},"429":{"description":"Rate limit reached. Wait for the Retry-After header's seconds and retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"429-1":{"summary":"Wait Retry-After seconds. Cache currencies and pairs (they change slowly), poll status every 15-30 seconds or use webhooks.","value":{"error":"Rate limit exceeded, retry in 1 minute"}}}}}},"500":{"description":"Our error. Retry later; for create, retry with the same Idempotency-Key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{}}}},"503":{"description":"Temporarily unavailable: no fresh rates, not enough reserve, exchange paused or too many unpaid orders.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"503-1":{"summary":"Also \"Exchange is temporarily disabled\" and \"BTC deposits are temporarily unavailable, try again later\". Show the pair as unavailable and retry later.","value":{"error":"Rates temporarily unavailable"}},"503-2":{"summary":"The amount is above what we can pay out right now: stay within maxDeposit from price. Also \"Fixed-rate exposure limit reached\" (try float) and \"Payout liquidity is not verified; try again shortly\".","value":{"error":"Insufficient payout liquidity for this amount"}},"503-3":{"summary":"Create an order only when the customer is ready to pay; unpaid ones expire.","value":{"error":"Too many unpaid orders open for this API key"}},"503-4":{"summary":"Also \"Too many open orders right now, try again later\". Retry with the same Idempotency-Key.","value":{"error":"No deposit address available, try again in a minute"}}}}}}}}}},"components":{"securitySchemes":{"x_api_key":{"type":"apiKey","in":"header","name":"X-API-KEY","description":"Your API key."},"x_api_timestamp":{"type":"apiKey","in":"header","name":"X-API-TIMESTAMP","description":"Current unix time in seconds. Must be within 60 seconds of our clock."},"x_api_nonce":{"type":"apiKey","in":"header","name":"X-API-NONCE","description":"A random string of 16-64 characters (A-Z, a-z, 0-9, - and _). Each nonce works once within 120 seconds."},"x_api_sign":{"type":"apiKey","in":"header","name":"X-API-SIGN","description":"Lowercase hex HMAC-SHA256 of the signed string, keyed with your API secret."}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]},"Order":{"type":"object","description":"An order, as status returns it.","properties":{"id":{"description":"Order ID (UUID). Use it with status, continue and refund."},"status":{"description":"Current state, see the order lifecycle below."},"from":{"description":"As given at creation."},"to":{"description":"As given at creation."},"rateType":{"description":"As given at creation."},"depositAddress":{"description":"Where the customer sends the coins. Show it while the status is awaiting_deposit."},"payoutAddress":{"description":"As given at creation (refundAddress may be null)."},"refundAddress":{"description":"As given at creation (refundAddress may be null)."},"quote":{"description":"The quoted amountIn, amountOut and rate at creation."},"amountIn":{"description":"What was actually received, paid out and applied. Null until the deposit is credited."},"amountOut":{"description":"What was actually received, paid out and applied. Null until the deposit is credited."},"rate":{"description":"What was actually received, paid out and applied. Null until the deposit is credited."},"feePercent":{"description":"Total fee in percent (your markup included) and the network fee taken from the payout."},"networkFee":{"description":"Total fee in percent (your markup included) and the network fee taken from the payout."},"requiredConfirmations":{"description":"Confirmations a deposit needs before it is credited."},"deposits":{"description":"Deposits counted for this order: txid, amount, confirmations, credited, seenAt."},"pendingDeposit":{"description":"A deposit seen on the network but not counted yet (display only), or null."},"payout":{"description":"The outgoing transaction, or null: status (pending, broadcast, confirmed, failed), amount, txid, broadcastAt, confirmedAt."},"refund":{"description":"The outgoing transaction, or null: status (pending, broadcast, confirmed, failed), amount, txid, broadcastAt, confirmedAt."},"continuing":{"description":"true after the customer chose continue, until the order settles at a fresh price (usually within a minute)."},"actions":{"description":"continue / refund: true when the customer may choose (see Continue or refund)."},"note":{"description":"A short message for the customer, or null."},"guarantee":{"description":"The PGP-signed letter of guarantee, or null if signing failed."},"rateLockedUntil":{"description":"Fixed rate: the locked rate applies to a deposit detected before this time (coins whose deposits are only seen once mined, like Bitcoin, get a few extra minutes). Null for float, and after a late deposit."},"expiresAt":{"description":"Until when the order waits for the deposit: the rate lock for fixed, 60 minutes (by default) for float. A later deposit is still exchanged."},"createdAt":{"description":"ISO 8601 timestamps (UTC). completedAt is null until completed."},"completedAt":{"description":"ISO 8601 timestamps (UTC). completedAt is null until completed."}}}}}}