# ARP Digital API Documentation — Full Content > This file contains the complete text of all ARP Digital API documentation pages and OpenAPI specifications for LLM context. ## api-catalog Source: https://docs.arpdigital.io/api-catalog import ApiCatalog from "../src/ApiCatalog" --- ## API Reference Source: https://docs.arpdigital.io/api-reference --- title: API Reference --- ARP Digital exposes five product APIs. Each has full interactive documentation with request builders, schema explorers, and code examples in cURL, JavaScript, and Python. :::tip{title="New to ARP Digital?"} Start with the [Getting Started](/getting-started) guide to generate sandbox credentials, then come back here to explore endpoints. ::: ## API Products | Product | Description | Interactive Docs | | --- | --- | --- | | **Remittance** | Recipient onboarding, quote generation, and cross-border payout execution | [Explore endpoints →](/remittance-api) | | **Trade** | OTC fiat/crypto quote and trade execution workflows | [Explore endpoints →](/trade-api) | | **Checkout** | Hosted checkout flows, broker checkout, and completion APIs | [Explore endpoints →](/checkout-api) | | **Wallet** | Balances, wallets, bank accounts, deposits, and withdrawals | [Explore endpoints →](/wallet-api) | | **Payout** | Destination wallet registration and outbound USDT/USDC crypto payouts on Ethereum and TRON | [Explore endpoints →](/payout-api) | ## Base URLs All requests use HTTPS. Append the product path to the platform base: ``` https://platform.arpdigital.io/services/{product}/api/v1 ``` | Product | Path segment | | --- | --- | | Remittance | `gps` | | Trade | `otc` | | Checkout | `gate` | | Wallet | `wallet` | | Payout | `payout` | :::info{title="Environment"} Pass `X-Environment: sandbox` or `X-Environment: production` to target the correct environment. Default is sandbox. ::: ## Shared Authentication Every authenticated endpoint requires four headers: | Header | Purpose | | --- | --- | | `X-API-Key` | Your API key | | `X-Timestamp` | Unix epoch timestamp (seconds) | | `X-Signature` | HMAC-SHA256 of `apiKey + body + timestamp` | | `X-Environment` | `sandbox` or `production` | See [Authentication](/authentication) for full signing details and the interactive signature generator. ## Public Endpoints These metadata endpoints are unauthenticated and available at: ``` https://platform.arpdigital.io/services/wallet/public/ ``` - `GET /currencies` — Supported fiat currencies - `GET /cryptocurrencies` — Supported crypto assets - `GET /blockchains` — Supported blockchain networks Each resource also supports `GET /{id}` for individual lookup. --- ## Authentication Source: https://docs.arpdigital.io/authentication import SignatureGenerator from "../src/SignatureGenerator"; # Authentication All API requests are authenticated with a signed HMAC SHA256 request. ## Required Headers - `X-API-Key`: your API key - `X-Timestamp`: Unix timestamp in seconds - `X-Signature`: HMAC SHA256 digest as hex - `X-Environment`: `sandbox` or `production` ## Signature Formula ```text signature = HMAC_SHA256(apiSecret, apiKey + requestBody + timestamp) ``` Rules that must match exactly: - `requestBody` is the exact payload string sent over HTTP. - For GET requests with no body, use an empty string (`""`). - `timestamp` must be current Unix seconds. - Timestamp skew is validated tightly (around ±30 seconds). ## Node.js Example ```javascript import crypto from "crypto"; function signRequest({ apiKey, apiSecret, body, timestamp }) { const requestBody = body ?? ""; const message = `${apiKey}${requestBody}${timestamp}`; return crypto.createHmac("sha256", apiSecret).update(message).digest("hex"); } const apiKey = process.env.ARP_API_KEY; const apiSecret = process.env.ARP_API_SECRET; const timestamp = Math.floor(Date.now() / 1000).toString(); const body = ""; const signature = signRequest({ apiKey, apiSecret, body, timestamp, }); console.log({ timestamp, signature }); ``` ## Python Example ```python import hmac import hashlib import time def sign_request(api_key: str, api_secret: str, body: str, timestamp: str) -> str: message = f"{api_key}{body}{timestamp}" return hmac.new( api_secret.encode("utf-8"), message.encode("utf-8"), hashlib.sha256, ).hexdigest() api_key = "YOUR_API_KEY" api_secret = "YOUR_API_SECRET" timestamp = str(int(time.time())) body = "" signature = sign_request(api_key, api_secret, body, timestamp) print(signature) ``` ## cURL Example ```bash API_KEY="YOUR_API_KEY" API_SECRET="YOUR_API_SECRET" TIMESTAMP=$(date +%s) BODY='' MESSAGE="${API_KEY}${BODY}${TIMESTAMP}" SIGNATURE=$(printf "%s" "$MESSAGE" | openssl dgst -sha256 -hmac "$API_SECRET" -hex | sed 's/^.* //') curl -X GET "https://platform.arpdigital.io/services/gps/api/v1/transactions" \ -H "X-API-Key: $API_KEY" \ -H "X-Timestamp: $TIMESTAMP" \ -H "X-Signature: $SIGNATURE" \ -H "X-Environment: sandbox" ``` ## Interactive Signature Generator ## Common Authentication Errors | HTTP | Code | Meaning | Typical Fix | | --- | --- | --- | --- | | `401` | `AUTH_001` | Missing/invalid auth credentials | Include all required auth headers | | `403` | `AUTH_002` | Invalid API key | Verify key, environment, key status | | `403` | `AUTH_003` | Invalid signature | Rebuild signature from exact body string | | `403` | `AUTH_004` | Timestamp invalid/too old | Resync server clock and retry | ## Debug Checklist for Signature Failures - Confirm the body string used for signing exactly matches HTTP payload bytes. - Confirm no extra whitespace/newlines were introduced before signing. - Confirm timestamp is in seconds (not milliseconds). - Confirm `X-Environment` matches key/environment setup. - Confirm API secret belongs to the exact API key used. --- ## Bank Verification — AED (UAE Dirham) Source: https://docs.arpdigital.io/bank-verification-aed # Bank Account Verification for AED (UAE Dirham) Use this guide for AED remittance recipients (`country=ARE`, payment method `BANK_ACCOUNT`). ## Recommended Approach Do not hardcode field definitions. Fetch them dynamically: - `GET /recipients/paymentMethodFields?country=ARE` ## Common Required Fields | Field | Description | Validation | | --------------- | --------------------- | ------------------------------------- | | `fullName` | Beneficiary full name | 2 to 35 chars, at least 2 words | | `accountNumber` | UAE IBAN | Must start with `AE`, 23 chars total | | `bankName` | Destination bank | Must be one of supported bank options | | `bankCode` | Bank code | Read-only/system-mapped based on bank | ## Example Payment Method Metadata ```json { "type": "BANK_ACCOUNT", "metadata": { "fullName": "Aisha Rahman", "accountNumber": "AE070331234567890123456", "bankName": "Emirates NBD", "bankCode": "EBILAEAD" } } ``` ## Validation Notes - Bank options can change over time by corridor configuration. - Always validate using live field definitions from the API response. - For remittance recipient creation, this data is sent inside `paymentMethods[].metadata`. --- ## Bank Verification — BHD (Bahraini Dinar) Source: https://docs.arpdigital.io/bank-verification-bhd # Bank Account Verification for BHD (Bahraini Dinar) This corridor is configuration-driven. Treat this page as implementation guidance and always verify live API support first. ## Verify Corridor Availability Call: - `GET /recipients/paymentMethodFields?country=BHR` If the API returns an unsupported-country error, the corridor is not currently enabled for your organization/environment. ## Recommended Data Model (When Enabled) For BHD bank payouts, collect and validate: | Field | Description | | --------------- | ------------------------------------------------ | | `fullName` | Beneficiary/account holder name | | `accountNumber` | Local account number or IBAN-based account value | | `bankName` | Beneficiary bank name | | `swiftCode` | Bank SWIFT/BIC | | `iban` | IBAN where required by payout rail | ## Example Metadata Shape ```json { "type": "BANK_ACCOUNT", "metadata": { "fullName": "Noor Al Khalifa", "accountNumber": "123456789012", "bankName": "Bank of Bahrain and Kuwait", "swiftCode": "BBKBHBM1", "iban": "BH67BMAG00001299123456" } } ``` ## Integration Guidance - Rely on `paymentMethodFields` response for final required fields and constraints. - Keep your form schema configurable by country/method response data. --- ## Bank Verification — SAR (Saudi Riyal) Source: https://docs.arpdigital.io/bank-verification-sar # Bank Account Verification for SAR (Saudi Riyal) Use this guide for SAR remittance recipients (`country=SAU`, payment method `BANK_ACCOUNT`). ## Recommended Approach Fetch live requirements before rendering forms: - `GET /recipients/paymentMethodFields?country=SAU` ## Common Required Fields | Field | Description | Validation | | --------------- | --------------------- | ------------------------------------ | | `fullName` | Beneficiary full name | 2 to 35 chars, at least 2 words | | `accountNumber` | Saudi IBAN | Must start with `SA`, 24 chars total | | `bankName` | Destination bank | Must match supported bank list | | `bankCode` | Bank code | Read-only/system-mapped | ## Example Payment Method Metadata ```json { "type": "BANK_ACCOUNT", "metadata": { "fullName": "Fahad Al Qahtani", "accountNumber": "SA0380000000608010167519", "bankName": "Al Rajhi Bank", "bankCode": "RJHISARI" } } ``` ## Validation Notes - `bankName` options are controlled by corridor configuration and can be updated. - Use dynamic field discovery instead of static bank lists in your app. --- ## Bank Verification — USD (US Dollar) Source: https://docs.arpdigital.io/bank-verification-usd # Bank Account Verification for USD Corridors Use this guide for USD remittance recipients (`payment method = BANK_ACCOUNT`). USD availability is corridor-specific. Your target recipient country code determines the exact field model. ## Recommended Approach Fetch live field definitions for the corridor you are onboarding: - `GET /recipients/paymentMethodFields?country=` Example for a US corridor: - `GET /recipients/paymentMethodFields?country=USA` ## Common Required Fields | Field | Description | Validation | | --------------- | -------------------------------------------- | ----------------------------------------- | | `fullName` | Beneficiary/account owner name | 2+ words, legal name format | | `accountNumber` | Local account number or IBAN equivalent | Corridor-specific format | | `routingNumber` | Domestic routing identifier where applicable | Numeric format by payout rail | | `bankName` | Beneficiary bank name | Must match supported payout bank metadata | | `swiftCode` | SWIFT/BIC when required | 8 or 11-character bank identifier | ## Example Payment Method Metadata ```json { "type": "BANK_ACCOUNT", "metadata": { "fullName": "Olivia Bennett", "accountNumber": "9876543210", "routingNumber": "021000021", "bankName": "JPMorgan Chase Bank", "swiftCode": "CHASUS33" } } ``` ## Validation Notes - Do not hardcode assumptions from one USD corridor to another. - Some corridors require local clearing codes instead of `swiftCode`. - Always trust live `paymentMethodFields` response as the source of truth. --- ## documentation Source: https://docs.arpdigital.io/documentation --- sidebar_label: General Information sidebar_icon: heart-handshake --- # ARP Digital Welcome to ARP Digital. We provide a powerful suite of cross-border settlement services that enable businesses to integrate global money movement directly into their applications. Our API offers end-to-end tools for fast transfers, secure transactions, and intelligent routing—giving you everything you need to build seamless, compliant financial experiences at scale. ## Services ### Remittance Send money across borders quickly and securely. ARP Digital provides compliant, real-time remittance capabilities designed for global transfers at scale. ### Trading Seamlessly trade between fiat and cryptocurrencies with unified APIs. Execute conversions, manage liquidity, and enable asset swaps with reliable pricing and low latency. ### Checkout Create secure external settlement links for frictionless monetary transactions. Perfect for merchants, platforms, and applications that need fast, compliant funds collection without building a full checkout flow. ### Payout Register destination wallets and send outbound USDT/USDC crypto payouts on Ethereum and TRON. ## API ### Authentication All API requests require authentication using API key and signature. You must include the following headers with each request: **X-API-Key:** Your API key **X-Timestamp:** Current Unix timestamp in seconds **X-Signature:** HMAC SHA256 signature of apiKey + requestBody + timestamp using your API secret as the key **Note:** The API secret is stored securely on the server and is not transmitted in headers. API keys can be created through the client dashboard. ## Signature Generation The signature is generated using HMAC SHA256 with the following steps: 1. Concatenate: `apiKey + requestBody + timestamp` 2. Create HMAC SHA256 hash using your API secret as the key 3. Convert to lowercase hexadecimal string **Important Notes** - For GET requests, use an empty string as the request body - Timestamps must be within 1000 seconds of the server time - All signatures are case-sensitive - Request body must be the exact JSON string sent in the request ## Servers - **Sandbox Environment:** `https://platform.arpdigital.io/api/v1` --- ## API Error Codes Reference Source: https://docs.arpdigital.io/error-codes ## API Error Codes Reference This page provides a comprehensive list of all error codes that can be returned by the ARP Digital APIs, organized by HTTP status code and error category. --- ### 400 - Bad Request Error Codes #### Common Errors (All Services: GATE, OTC, GPS) ##### VAL_001 - VALIDATION_ERROR **Description:** Request validation failed ```json { "success": false, "error": "Request validation failed", "errorDetails": { "type": "VALIDATION_ERROR", "code": "VAL_001", "message": "Request validation failed" } } ``` ##### VAL_002 - INVALID_FORMAT **Description:** Invalid data format ```json { "success": false, "error": "Invalid data format", "errorDetails": { "type": "INVALID_FORMAT", "code": "VAL_002", "message": "Invalid data format" } } ``` ##### VAL_003 - MISSING_REQUIRED_FIELD **Description:** Required field missing ```json { "success": false, "error": "Required field missing", "errorDetails": { "type": "MISSING_REQUIRED_FIELD", "code": "VAL_003", "message": "Required field missing" } } ``` ##### ORG_001 - INVALID_INVITATION **Description:** Invalid invitation ```json { "success": false, "error": "Invalid invitation", "errorDetails": { "type": "INVALID_INVITATION", "code": "ORG_001", "message": "Invalid invitation" } } ``` ##### RES_002 - BAD_REQUEST **Description:** Bad request ```json { "success": false, "error": "Bad request", "errorDetails": { "type": "BAD_REQUEST", "code": "RES_002", "message": "Bad request" } } ``` ##### ACC_003 - INVALID_COIN_NETWORK **Description:** Invalid coin or network combination ```json { "success": false, "error": "Invalid coin or network combination", "errorDetails": { "type": "INVALID_COIN_NETWORK", "code": "ACC_003", "message": "Invalid coin or network combination" } } ``` ##### ACC_008 - INVALID_AMOUNT **Description:** Invalid deposit amount ```json { "success": false, "error": "Invalid deposit amount", "errorDetails": { "type": "INVALID_AMOUNT", "code": "ACC_008", "message": "Invalid deposit amount" } } ``` ##### AUTH_009 - INVALID_TOKEN **Description:** Invalid token ```json { "success": false, "error": "Invalid token", "errorDetails": { "type": "INVALID_TOKEN", "code": "AUTH_009", "message": "Invalid token" } } ``` ### Product-Specific Errors (OTC & GPS) ##### TXN_001 - INVALID_CURRENCY_PAIR **Description:** Invalid currency pair ```json { "success": false, "error": "Invalid currency pair", "errorDetails": { "type": "INVALID_CURRENCY_PAIR", "code": "TXN_001", "message": "Invalid currency pair" } } ``` ##### TXN_002 - INVALID_AMOUNT **Description:** Invalid transaction amount ```json { "success": false, "error": "Invalid transaction amount", "errorDetails": { "type": "INVALID_AMOUNT", "code": "TXN_002", "message": "Invalid transaction amount" } } ``` ##### TXN_005 - QUOTE_EXPIRED **Description:** Quote has expired ```json { "success": false, "error": "Quote has expired", "errorDetails": { "type": "QUOTE_EXPIRED", "code": "TXN_005", "message": "Quote has expired" } } ``` ##### TXN_006 - INSUFFICIENT_BALANCE **Description:** Insufficient balance ```json { "success": false, "error": "Insufficient balance", "errorDetails": { "type": "INSUFFICIENT_BALANCE", "code": "TXN_006", "message": "Insufficient balance" } } ``` ##### TXN_012 - SLA_BELOW_MINIMUM **Description:** Transfer amount is below minimum SLA requirement ```json { "success": false, "error": "Transfer amount is below the minimum SLA requirement", "errorDetails": { "type": "SLA_BELOW_MINIMUM", "code": "TXN_012", "message": "Transfer amount is below the minimum SLA requirement" } } ``` ##### TXN_013 - SLA_ABOVE_MAXIMUM **Description:** Transfer amount exceeds maximum SLA limit ```json { "success": false, "error": "Transfer amount exceeds the maximum SLA limit", "errorDetails": { "type": "SLA_ABOVE_MAXIMUM", "code": "TXN_013", "message": "Transfer amount exceeds the maximum SLA limit" } } ``` ##### CUR_001 - INVALID_CURRENCY **Description:** The provided currency is invalid or not supported ```json { "success": false, "error": "The provided currency is invalid or not supported", "errorDetails": { "type": "INVALID_CURRENCY", "code": "CUR_001", "message": "The provided currency is invalid or not supported" } } ``` --- ### 401 - Unauthorized Error Codes #### Common Errors (All Services: GATE, OTC, GPS) ##### AUTH_001 - UNAUTHORIZED **Description:** Authentication credentials missing or invalid ```json { "success": false, "error": "Authentication credentials missing or invalid", "errorDetails": { "type": "UNAUTHORIZED", "code": "AUTH_001", "message": "Authentication credentials missing or invalid" } } ``` ##### AUTH_006 - INCORRECT_PASSWORD **Description:** Current password is incorrect ```json { "success": false, "error": "Current password is incorrect", "errorDetails": { "type": "INCORRECT_PASSWORD", "code": "AUTH_006", "message": "Current password is incorrect" } } ``` --- ### 403 - Forbidden Error Codes #### Common Errors (All Services: GATE, OTC, GPS) ##### AUTH_002 - INVALID_API_KEY **Description:** Invalid API key provided ```json { "success": false, "error": "Invalid API key provided", "errorDetails": { "type": "INVALID_API_KEY", "code": "AUTH_002", "message": "Invalid API key provided" } } ``` ##### AUTH_003 - INVALID_SIGNATURE **Description:** Invalid request signature ```json { "success": false, "error": "Invalid request signature", "errorDetails": { "type": "INVALID_SIGNATURE", "code": "AUTH_003", "message": "Invalid request signature" } } ``` ##### AUTH_004 - TIMESTAMP_ERROR **Description:** Request timestamp is invalid or too old ```json { "success": false, "error": "Request timestamp is invalid or too old", "errorDetails": { "type": "TIMESTAMP_ERROR", "code": "AUTH_004", "message": "Request timestamp is invalid or too old" } } ``` ##### AUTH_005 - RATE_LIMIT_EXCEEDED **Description:** API rate limit exceeded ```json { "success": false, "error": "API rate limit exceeded", "errorDetails": { "type": "RATE_LIMIT_EXCEEDED", "code": "AUTH_005", "message": "API rate limit exceeded" } } ``` ##### AUTH_007 - BLOCK_MFA_DISABLE **Description:** Cannot disable this auth method; at least one other authenticator must remain enabled ```json { "success": false, "error": "Cannot disable this auth method; at least one other authenticator must remain enabled", "errorDetails": { "type": "BLOCK_MFA_DISABLE", "code": "AUTH_007", "message": "Cannot disable this auth method; at least one other authenticator must remain enabled" } } ``` ##### AUTH_010 - FORBIDDEN **Description:** Forbidden ```json { "success": false, "error": "Forbidden", "errorDetails": { "type": "FORBIDDEN", "code": "AUTH_010", "message": "Forbidden" } } ``` ##### KYC_001 - KYC_NOT_STARTED **Description:** KYC verification not started ```json { "success": false, "error": "KYC verification not started", "errorDetails": { "type": "KYC_NOT_STARTED", "code": "KYC_001", "message": "KYC verification not started" } } ``` ##### KYC_002 - KYC_IN_PROGRESS **Description:** KYC verification is in progress ```json { "success": false, "error": "KYC verification is in progress", "errorDetails": { "type": "KYC_IN_PROGRESS", "code": "KYC_002", "message": "KYC verification is in progress" } } ``` ##### KYC_003 - KYC_UNDER_REVIEW **Description:** KYC verification is under review ```json { "success": false, "error": "KYC verification is under review", "errorDetails": { "type": "KYC_UNDER_REVIEW", "code": "KYC_003", "message": "KYC verification is under review" } } ``` ##### KYC_004 - KYC_UPDATE_REQUIRED **Description:** KYC verification requires updates ```json { "success": false, "error": "KYC verification requires updates", "errorDetails": { "type": "KYC_UPDATE_REQUIRED", "code": "KYC_004", "message": "KYC verification requires updates" } } ``` ##### KYC_005 - KYC_REJECTED **Description:** KYC verification rejected ```json { "success": false, "error": "KYC verification rejected", "errorDetails": { "type": "KYC_REJECTED", "code": "KYC_005", "message": "KYC verification rejected" } } ``` ##### KYC_006 - KYC_FAILED **Description:** KYC verification failed ```json { "success": false, "error": "KYC verification failed", "errorDetails": { "type": "KYC_FAILED", "code": "KYC_006", "message": "KYC verification failed" } } ``` --- ### 404 - Not Found Error Codes #### Common Errors (All Services: GATE, OTC, GPS) ##### AUTH_008 - NOT_FOUND **Description:** Authenticator not found ```json { "success": false, "error": "Authenticator not found", "errorDetails": { "type": "NOT_FOUND", "code": "AUTH_008", "message": "Authenticator not found" } } ``` ##### RES_001 - RESOURCE_NOT_FOUND **Description:** Requested resource not found ```json { "success": false, "error": "Requested resource not found", "errorDetails": { "type": "RESOURCE_NOT_FOUND", "code": "RES_001", "message": "Requested resource not found" } } ``` ##### ACC_004 - VAULT_NOT_FOUND **Description:** Vault not found for user ```json { "success": false, "error": "Vault not found for user", "errorDetails": { "type": "VAULT_NOT_FOUND", "code": "ACC_004", "message": "Vault not found for user" } } ``` #### Product-Specific Errors (OTC & GPS) ##### TXN_007 - QUOTE_NOT_FOUND **Description:** Quote not found ```json { "success": false, "error": "Quote not found", "errorDetails": { "type": "QUOTE_NOT_FOUND", "code": "TXN_007", "message": "Quote not found" } } ``` ##### TXN_009 - TRANSACTION_NOT_FOUND **Description:** Transaction not found ```json { "success": false, "error": "Transaction not found", "errorDetails": { "type": "TRANSACTION_NOT_FOUND", "code": "TXN_009", "message": "Transaction not found" } } ``` --- ### 409 - Conflict Error Codes #### Common Errors (All Services: GATE, OTC, GPS) ##### ACC_009 - DUPLICATE_REQUEST **Description:** Duplicate request ```json { "success": false, "error": "Duplicate request", "errorDetails": { "type": "DUPLICATE_REQUEST", "code": "ACC_009", "message": "Duplicate request" } } ``` ### Product-Specific Errors (OTC & GPS) ##### TXN_008 - TRANSACTION_ALREADY_EXECUTED **Description:** Transaction already executed ```json { "success": false, "error": "Transaction already executed", "errorDetails": { "type": "TRANSACTION_ALREADY_EXECUTED", "code": "TXN_008", "message": "Transaction already executed" } } ``` --- ### 422 - Unprocessable Entity Error Codes #### Common Errors (All Services: GATE, OTC, GPS) ##### VAL_004 - UNPROCESSABLE_ENTITY **Description:** Request data is invalid ```json { "success": false, "error": "Request data is invalid", "errorDetails": { "type": "UNPROCESSABLE_ENTITY", "code": "VAL_004", "message": "Request data is invalid" } } ``` --- ### 429 - Rate Limit Exceeded Error Codes #### Common Errors (All Services: GATE, OTC, GPS) ##### AUTH_005 - RATE_LIMIT_EXCEEDED **Description:** API rate limit exceeded ```json { "success": false, "error": "API rate limit exceeded", "errorDetails": { "type": "RATE_LIMIT_EXCEEDED", "code": "AUTH_005", "message": "API rate limit exceeded" } } ``` --- ### 500 - Internal Server Error Codes #### Common Errors (All Services: GATE, OTC, GPS) ##### SRV_001 - INTERNAL_SERVER_ERROR **Description:** Internal server error occurred ```json { "success": false, "error": "Internal server error occurred", "errorDetails": { "type": "INTERNAL_SERVER_ERROR", "code": "SRV_001", "message": "Internal server error occurred" } } ``` --- ### 502 - Bad Gateway Error Codes #### Common Errors (All Services: GATE, OTC, GPS) ##### ACC_005 - VAULT_SERVICE_ERROR **Description:** Vault service error ```json { "success": false, "error": "Vault service error", "errorDetails": { "type": "VAULT_SERVICE_ERROR", "code": "ACC_005", "message": "Vault service error" } } ``` ##### SRV_004 - BAD_GATEWAY **Description:** Bad gateway error ```json { "success": false, "error": "Bad gateway error", "errorDetails": { "type": "BAD_GATEWAY", "code": "SRV_004", "message": "Bad gateway error" } } ``` #### Product-Specific Errors (OTC & GPS) ##### TXN_010 - QUOTE_FAILED **Description:** Failed to fetch quote from provider ```json { "success": false, "error": "Failed to fetch quote from provider", "errorDetails": { "type": "QUOTE_FAILED", "code": "TXN_010", "message": "Failed to fetch quote from provider" } } ``` ##### TXN_011 - EXECUTION_FAILED **Description:** Failed to execute transaction ```json { "success": false, "error": "Failed to execute transaction", "errorDetails": { "type": "EXECUTION_FAILED", "code": "TXN_011", "message": "Failed to execute transaction" } } ``` --- ### 503 - Service Unavailable Error Codes #### Common Errors (All Services: GATE, OTC, GPS) ##### SRV_002 - SERVICE_UNAVAILABLE **Description:** Service temporarily unavailable ```json { "success": false, "error": "Service temporarily unavailable", "errorDetails": { "type": "SERVICE_UNAVAILABLE", "code": "SRV_002", "message": "Service temporarily unavailable" } } ``` --- ### 504 - Gateway Timeout Error Codes #### Common Errors (All Services: GATE, OTC, GPS) ##### SRV_003 - GATEWAY_TIMEOUT **Description:** Gateway timeout occurred ```json { "success": false, "error": "Gateway timeout occurred", "errorDetails": { "type": "GATEWAY_TIMEOUT", "code": "SRV_003", "message": "Gateway timeout occurred" } } ``` --- ### Error Code Categories #### Common Errors These errors apply to **all services** (GATE, OTC, GPS): - **Authentication Errors** (401, 403): AUTH\_\* codes - **KYC Errors** (403): KYC\_\* codes - **Organization Errors** (400): ORG\_\* codes - **Validation Errors** (400, 422): VAL\_\* codes - **Resource Errors** (400, 404): RES\_\* codes - **Account Errors** (400, 404, 409, 502): ACC\_\* codes - **Server Errors** (500, 502, 503, 504): SRV\_\* codes #### Product-Specific Errors These errors apply only to specific products: - **OTC & GPS**: Transaction errors (TXN\_\*) and Currency errors (CUR\_\*) --- ## Error Handling and Retries Source: https://docs.arpdigital.io/errors-and-retries # Error Handling and Retries A robust integration separates permanent failures from retriable failures. ## API Error Envelope Authenticated API errors return: ```json { "success": false, "error": "Request timestamp is invalid or too old", "errorDetails": { "type": "TIMESTAMP_ERROR", "code": "AUTH_004", "message": "Request timestamp is invalid or too old" } } ``` Use `errorDetails.code` as your primary machine-readable decision key. ## Retry Policy | Response Class | Retry? | Notes | | -------------- | ------------ | -------------------------------------------- | | `429` | Yes | Exponential backoff + jitter | | `5xx` | Yes | Retry with bounded attempts | | `401`/`403` | No (usually) | Fix auth/signature/key/KYC first | | `400`/`422` | No | Correct request payload/business constraints | ## Recommended Backoff - Initial delay: `500ms` - Multiplier: `2x` - Jitter: random 0-30% - Max delay: `15s` - Max attempts: `4-6` depending on endpoint criticality ## High-Value Error Codes | Code | Meaning | | ---------- | ----------------------------------------------- | | `AUTH_003` | Invalid request signature | | `AUTH_004` | Invalid or stale timestamp | | `TXN_005` | Quote expired | | `TXN_006` | Insufficient balance | | `TXN_008` | Transaction already executed | | `VAL_004` | Unprocessable entity (validation/business rule) | ## Quote + Transaction Reliability - Create quote and execute transaction quickly (quote lifetime is short). - If you get quote-expired errors, regenerate quote instead of retrying transaction blindly. - `TXN_ALREADY_EXECUTED` indicates duplicate execution attempt for an already-used quote. ## Safe Integration Practices - Persist every outbound request with timestamp and payload hash input. - Use unique `externalReference` values for partner-side reconciliation. - Build alerting on spikes in `AUTH_003`, `AUTH_004`, and `429`. - Prefer webhooks for lifecycle updates; use polling as a fallback. --- ## Fees, Processing Times & Cut-Off Times Source: https://docs.arpdigital.io/fees-and-processing --- title: Fees, Processing Times & Cut-Off Times sidebar_label: Fees & Processing --- This page provides a comprehensive overview of ARP Digital's transaction processing times, for payouts / offramps to various countries. --- ## Collections Collection information coming soon. Please contact [support@arpdigital.io](mailto:support@arpdigital.io) for collection options. --- ## Payout / Off Ramp | Country | Currency | Delivery | Payment Rail | |---|---|---|---| | Saudi Arabia | SAR | Instant (<20k SAR) / T+0 (>20k SAR) | Local Bank Transfer | | United Arab Emirates | AED | T+0 | Local Bank Transfer | | India | INR | Instant (IMPS 24/7) / Real-time (RTGS) | IMPS / RTGS | | Philippines | PHP | Instant (Instapay 24/7) / T+0 (Pesonet) | Instapay / Pesonet / Direct | | Europe | EUR | Instant (SEPA Instant) / T+0 (SEPA) | SEPA / SEPA Instant | --- ## Country-Specific Payment Details ### India (INR) - **Account types supported:** NRO, NRE, Savings accounts - **IMPS:** Instant transfers available 24/7 including weekends and holidays, up to 500k INR - **RTGS:** Real-time transfers available during banking hours (typically 7 AM - 6 PM IST, Monday-Saturday) - **Minimum:** 1,000 INR | **Maximum:** 1M INR per transaction ### Philippines (PHP) - **Pesonet:** No maximum transaction limit. Can settle same-day if within the 3 clearing times. If outside clearing times, settles next business day. Only available on weekdays (excluding holidays) - **Instapay:** PHP 50,000 per transaction limit. Available 24/7 - **Direct cash-in/out:** Only available during business days and hours, no limit. Settles within 1-2 hours --- ## Account Funding Methods ### Wire Transfer vs ACH Transfer | | Wire Transfer | ACH Transfer | |---|---|---| | **Speed** | Same business day (T+0) | Next business day (T+1) | | **Availability** | Business hours only | Business days only | | **Fees** | Higher cost (bank-dependent) | Lower cost | | **Confirmation** | Typically same day | Next day or delayed | | **Use Case** | Urgent or high-value transfers | Recurring or non-urgent transfers | ### SEPA Instant (SCT Inst) vs SEPA Credit Transfer (SCT) | | SEPA Instant (SCT Inst) | SEPA Credit Transfer (SCT) | |---|---|---| | **Speed** | Within seconds (typically <10s) | Typically 1 business day (T+1) | | **Availability** | 24/7/365 (including weekends and holidays) | Bank business hours only | | **Amount Limit** | Up to 100,000 EUR per transaction (2024) | No strict limit (varies by bank) | | **Confirmation** | Real-time success/failure | Confirmation may be delayed | | **Use Case** | Urgent, real-time payments (e.g., suppliers) | Regular, non-urgent payments (e.g., salaries) | --- ## Understanding Delivery Terms | Term | Meaning | |---|---| | **T+0** | Funds are delivered on the same business day | | **T+1** | Funds are delivered the next business day | | **Instant** | Funds arrive in real time, typically within minutes | --- ## Important Information - **Compliance review:** All transactions are subject to review by the ARP Digital compliance team. Transactions requiring additional documentation may be temporarily placed on hold while under review. This may result in processing times deviating from the standards listed above. --- ## Getting Started Source: https://docs.arpdigital.io/getting-started # Welcome Welcome to ARP Digital API documentation. This page gives you both: - a product-level orientation (what you can build) - a concrete integration path (first authenticated request to first remittance) ## What You Can Build with ARP Digital - **Global remittance flows**: onboard recipients, generate quotes, and execute payouts. - **Wallet operations**: manage balances, wallets, deposits, and withdrawals. - **Trading integrations**: request quotes and execute OTC trades. - **Checkout journeys**: create and complete hosted settlement flows. - **Crypto payouts**: register destination wallets and send outbound USDT/USDC payouts on Ethereum and TRON. - **Event-driven backends**: consume webhooks for transaction and lifecycle updates. ## Start Here Use this sequence to get productive quickly: 1. [Platform Overview](/platform-overview): understand product boundaries and environments. 2. [Authentication](/authentication): implement request signing correctly. 3. [Error Handling and Retries](/errors-and-retries): make your integration resilient. 4. [Recipient Verification](/recipient-verification): build dynamic recipient forms by corridor. 5. [Send Money (Remittance Flow)](/remittance-verification): run quote-to-transaction execution. ## Core API Components | Component | Why it matters | Reference | | ---------------- | ----------------------------------------------- | --------------------------------- | | Remittance (GPS) | Recipient onboarding, quoting, payout execution | [Remittance API](/remittance-api) | | Wallet | Funding and balance operations | [Wallet API](/wallet-api) | | Trade (OTC) | Exchange and trading workflows | [Trade API](/trade-api) | | Checkout (Gate) | Hosted checkout and vault flows | [Checkout API](/checkout-api) | | Payout | Destination wallets and outbound crypto payouts | [Payout API](/payout-api) | ## Before You Start You need: - An ARP Digital organization account - An API key and secret generated from the dashboard - Ability to make HTTPS requests from your backend - Your server clock synced with NTP (timestamp validation is strict) ## API Base URLs Use the platform host and service-specific path: | Product | Base URL | | ---------------- | ------------------------------------------------------- | | Remittance (GPS) | `https://platform.arpdigital.io/services/gps/api/v1` | | Trade (OTC) | `https://platform.arpdigital.io/services/otc/api/v1` | | Checkout (Gate) | `https://platform.arpdigital.io/services/gate/api/v1` | | Wallet | `https://platform.arpdigital.io/services/wallet/api/v1` | | Payout | `https://platform.arpdigital.io/services/payout/api/v1` | ## Required Authentication Headers Every authenticated API call requires: - `X-API-Key` - `X-Timestamp` (Unix seconds) - `X-Signature` (`HMAC_SHA256(apiSecret, apiKey + requestBody + timestamp)`) - `X-Environment` (`sandbox` or `production`) ## Quick Start in 10 Minutes ### 1. Generate a timestamp and signature ```bash API_KEY="YOUR_API_KEY" API_SECRET="YOUR_API_SECRET" TIMESTAMP=$(date +%s) BODY='' MESSAGE="${API_KEY}${BODY}${TIMESTAMP}" SIGNATURE=$(printf "%s" "$MESSAGE" | openssl dgst -sha256 -hmac "$API_SECRET" -hex | sed 's/^.* //') ``` ### 2. Make your first authenticated request ```bash curl -X GET "https://platform.arpdigital.io/services/gps/api/v1/transactions" \ -H "X-API-Key: $API_KEY" \ -H "X-Timestamp: $TIMESTAMP" \ -H "X-Signature: $SIGNATURE" \ -H "X-Environment: sandbox" ``` ### 3. Expected success envelope ```json { "success": true, "data": [] } ``` ## First Remittance Flow Use this sequence for production-ready integration: 1. Discover recipient requirements: - `GET /recipients/verificationFields?country=IND&type=INDIVIDUAL` - `GET /recipients/paymentMethodFields?country=IND` 2. Create recipient: - `POST /recipients` 3. Generate quote: - `POST /quote` (with `recipientId`) 4. Create transaction: - `POST /transaction` (with `quoteId` and `recipientId`) 5. Track status: - `GET /transactions/{id}` ## Go-Live Checklist - Use unique `externalReference` values for reconciliation. - Handle quote expiration (quotes currently expire in about 3 minutes). - Implement webhook ingestion before moving to production. - Add retry logic for `429` and `5xx` responses. - Monitor for `AUTH_003` (signature) and `AUTH_004` (timestamp) failures. ## Next Reading - [Platform Overview](/platform-overview) - [Authentication](/authentication) - [Error Handling and Retries](/errors-and-retries) - [Recipient Verification](/recipient-verification) - [Send Money (Remittance Flow)](/remittance-verification) --- ## Platform Overview Source: https://docs.arpdigital.io/platform-overview --- title: Platform Overview --- ARP Digital provides API products for remittance, trading, wallet operations, hosted checkout flows, and crypto payouts. ## Product Surface | Product | Core Use Case | Base URL | | ---------------- | ------------------------------------------------------- | ------------------------------------------------------- | | GPS (Remittance) | Recipient management, quoting, payout execution | `https://platform.arpdigital.io/services/gps/api/v1` | | OTC (Trade) | Quote + trade execution | `https://platform.arpdigital.io/services/otc/api/v1` | | Gate (Checkout) | Hosted checkout and vault APIs | `https://platform.arpdigital.io/services/gate/api/v1` | | Wallet | Balances, wallets, bank accounts, deposits, withdrawals | `https://platform.arpdigital.io/services/wallet/api/v1` | | Payout | Destination wallets and outbound USDT/USDC payouts | `https://platform.arpdigital.io/services/payout/api/v1` | ## Environment Model Set `X-Environment` on every API request: - `sandbox`: test safely with isolated data - `production`: live money movement Important: - Sandbox and production data are fully isolated. - API keys are environment-specific. - Do not reuse sandbox assumptions (limits, routes, counterparties) without production validation. ## Authentication Model ARP Digital API authentication is request-signing based (HMAC SHA256), not bearer-token based. Required headers: - `X-API-Key` - `X-Timestamp` - `X-Signature` - `X-Environment` Signature input format: `apiKey + requestBody + timestamp` `requestBody` must match the exact byte sequence sent over the wire. ## Standard API Response Envelope Success: ```json { "success": true, "data": {} } ``` API error: ```json { "success": false, "error": "Invalid request signature", "errorDetails": { "type": "INVALID_SIGNATURE", "code": "AUTH_003", "message": "Invalid request signature" } } ``` ## KYC and Permission Gates Production requests can be blocked by: - Organization KYC state - API key status (inactive/invalid) - Permission checks on certain product endpoints - Optional API key IP whitelisting Design your integration to treat `401`, `403`, and `422` as actionable business responses, not generic transient errors. ## Reliability Patterns - Use short quote-to-execution windows (quotes are time-bound). - Log every `X-Timestamp` and payload hashable body for debugging signature mismatches. - Use webhooks for status updates instead of aggressive polling. - Keep retry policies endpoint-aware; do not blindly retry all `4xx` responses. ## Recommended Read Order 1. [Getting Started](/getting-started) 2. [Authentication](/authentication) 3. [Error Handling and Retries](/errors-and-retries) 4. Product references under API docs --- ## Recipient Verification Source: https://docs.arpdigital.io/recipient-verification # Recipient Verification This guide explains how to build a robust recipient onboarding flow for remittance. ## Why This Matters Recipient fields and payout method requirements are corridor-dependent. Do not hardcode one static form for all countries. ## Integration Pattern (Recommended) 1. Select recipient country and recipient type (`INDIVIDUAL` or `BUSINESS`). 2. Fetch verification fields: - `GET /recipients/verificationFields?country=&type=` 3. Fetch payment method fields: - `GET /recipients/paymentMethodFields?country=` 4. Render dynamic forms from returned definitions. 5. Submit recipient: - `POST /recipients` ## Supported Remittance Destination Mapping | Destination Country (ISO3) | Typical Receiving Currency | | -------------------------- | -------------------------- | | `IND` | `INR` | | `PHL` | `PHP` | | `HKG` | `HKD` | | `ARE` | `AED` | | `SAU` | `SAR` | | `EEE` | `EUR` | ## Example: Fetch Dynamic Verification Fields ```bash curl -X GET "https://platform.arpdigital.io/services/gps/api/v1/recipients/verificationFields?country=IND&type=INDIVIDUAL" \ -H "X-API-Key: $API_KEY" \ -H "X-Timestamp: $TIMESTAMP" \ -H "X-Signature: $SIGNATURE" \ -H "X-Environment: sandbox" ``` Example response shape: ```json { "success": true, "data": [ { "fieldName": "firstName", "displayName": "First Name", "required": true, "type": "STRING" } ] } ``` ## Example: Create Recipient (India) ```json { "type": "INDIVIDUAL", "country": "IND", "verificationInfo": { "firstName": "Rohan", "lastName": "Sharma", "email": "rohan@example.com" }, "paymentMethods": [ { "type": "BANK_ACCOUNT", "metadata": { "accountNumber": "123456789012", "ifscCode": "HDFC0001234", "bankName": "HDFC Bank", "accountHolderName": "Rohan Sharma", "branch": "Mumbai" } } ] } ``` ## Example: Create Recipient (Philippines, Instapay) ```json { "type": "INDIVIDUAL", "country": "PHL", "verificationInfo": { "firstName": "Juan", "lastName": "Dela Cruz" }, "paymentMethods": [ { "type": "INSTAPAY", "metadata": { "channel": "BPI", "name": "Juan Dela Cruz", "accountNumber": "123456789012" } } ] } ``` ## Validation Behavior - Request-level validation uses country/type-specific rules. - Unsupported country/type combinations return validation errors. - Missing required fields return `422` (`VAL_004`). - In production, some bank details are verified through upstream providers for applicable corridors. ## Bank Detail Validation Endpoint Before creating a recipient or executing a remittance to India, call this endpoint to verify that the destination bank account exists and is eligible to receive funds. This avoids failed transactions caused by incorrect account details. **Endpoint:** `POST /api/v1/recipients/validate` > This endpoint currently supports **India bank account validation only** (IFSC-based). For other corridors, validation happens automatically during transaction execution. ### When to Call Call this endpoint: - After a user enters their bank details, before you call `POST /recipients`. - Before executing a remittance, if you want to give the user an early error rather than waiting for transaction failure. ### Request ```bash curl -X POST "https://platform.arpdigital.io/services/gps/api/v1/recipients/validate" \ -H "X-API-Key: $API_KEY" \ -H "X-Timestamp: $TIMESTAMP" \ -H "X-Signature: $SIGNATURE" \ -H "X-Environment: production" \ -H "Content-Type: application/json" \ -d '{ "accountNumber": "123456789012", "ifscCode": "HDFC0001234", "accountHolderName": "Rohan Sharma" }' ``` | Field | Type | Required | Description | | ------------------- | ------ | -------- | ----------------------------------------------------------- | | `accountNumber` | string | Yes | Bank account number of the recipient | | `ifscCode` | string | Yes | IFSC code identifying the recipient's bank branch | | `accountHolderName` | string | Yes | Full name of the account holder as registered with the bank | ### Responses **Valid account** ```json { "success": true, "isNreAccount": false, "status": "valid", "message": "Bank account verification completed" } ``` **Invalid account** ```json { "success": false, "isNreAccount": false, "status": "invalid", "message": "Bank account is invalid" } ``` **NRE account (Non-Resident External)** ```json { "success": true, "isNreAccount": true, "status": "valid", "message": "Bank account verification completed" } ``` **NRO account (Non-Resident Ordinary)** ```json { "success": true, "isNreAccount": false, "status": "valid", "message": "Bank account verification completed" } ``` > Use `isNreAccount` to distinguish account type in your integration layer. **Validation error — missing fields (422)** ```json { "success": false, "error": "Unprocessable Entity", "message": "accountNumber, ifscCode, and accountHolderName are required", "code": "VAL_UNPROCESSABLE" } ``` ### Sandbox Behavior In non-production environments, upstream bank verification is bypassed. The endpoint always returns: ```json { "success": true, "isNreAccount": false, "status": "valid", "message": "Sandbox environment - skipping bank account validation" } ``` Use `X-Environment: production` to trigger real validation. See also the [Remittance API Reference](/remittance-api#tag/Recipients/operation/validateRecipient) for the full OpenAPI spec of this endpoint. --- ## Send Money (Remittance Flow) Source: https://docs.arpdigital.io/remittance-verification # Send Money (Remittance Flow) This guide covers the end-to-end GPS remittance flow from quote to transaction completion. ## Canonical Flow 1. Create or reuse recipient (`POST /recipients`) 2. Generate quote (`POST /quote`) 3. Create transaction (`POST /transaction`) 4. Track transaction (`GET /transactions/{id}`) ## Quote Creation Endpoint: `POST /quote` Required fields: - `recipientId` - `fromCurrency` - `toCurrency` - exactly one of `fromAmount` or `toAmount` Important behavior: - Quote is corridor-aware (partner availability + limits). - Quote can fail with SLA-limit errors when outside min/max corridor range. - Quote has an expiry window (currently short, around 3 minutes). Example request: ```json { "recipientId": "8f2b7d8a-4d8e-4a6e-a9de-0b8f4c6ff8a2", "fromCurrency": "USD", "toCurrency": "PHP", "fromAmount": 100 } ``` ## Transaction Creation Endpoint: `POST /transaction` Required fields: - `quoteId` - `recipientId` Optional fields: - `paymentMethodId` — UUID of the recipient's payment method to use (defaults to first) - `senderDetails` — Object of sender identity fields. **Required when the destination country has `hasSenderFields: true`** (see [Country Config](#optional-metadata-endpoints)). Fetch the expected fields first via `GET /public/senderFields?country={ISO3}&type={INDIVIDUAL|BUSINESS}`. - `purposeOfPayment` — Purpose code string. Fetch valid codes via `GET /public/purposeOfPayments?countryId={ISO3}`. Example values: `FMNT` (Family Maintenance), `SAVG` (Savings), `EDUC` (Education Fee). - `notes` — Free-text note attached to the transaction. - `externalReference` — Your own reference ID (must be unique per organisation). Important behavior: - Recipient on transaction must match recipient tied to quote. - A quote cannot be executed more than once. - Execution fails if source balance is insufficient. - When `hasSenderFields` is `true` for the destination country, `senderDetails` with all required fields must be provided. Example request (minimal): ```json { "quoteId": "f72d9fcb-73ea-4e4a-b1f0-45f537a9cfb9", "recipientId": "8f2b7d8a-4d8e-4a6e-a9de-0b8f4c6ff8a2" } ``` Example request (with sender details for India — individual): ```json { "quoteId": "f72d9fcb-73ea-4e4a-b1f0-45f537a9cfb9", "recipientId": "8f2b7d8a-4d8e-4a6e-a9de-0b8f4c6ff8a2", "purposeOfPayment": "FMNT", "senderDetails": { "type": "INDIVIDUAL", "firstName": "Ahmed", "lastName": "Al Mansouri", "nationality": "ARE", "countryCode": "ARE", "address1": "ICD Brookfield Place, Dubai, UAE", "dateOfBirth": "1985-06-15", "gender": "M", "idType": "PP", "idNo": "A12345678", "idExpiryDate": "2030-01-01", "fundSource": "SLRY", "relationship": "FMLY" } } ``` Example request (with sender details for India — business): ```json { "quoteId": "f72d9fcb-73ea-4e4a-b1f0-45f537a9cfb9", "recipientId": "8f2b7d8a-4d8e-4a6e-a9de-0b8f4c6ff8a2", "purposeOfPayment": "BSNS", "senderDetails": { "type": "BUSINESS", "businessName": "ARP Digital Trading LLC", "countryCode": "ARE", "mobileNoCountry": "+971", "mobileNo": "501234567", "address1": "ICD Brookfield Place, Dubai, UAE", "fundSource": "BUSN" } } ``` ## Sender Details Field Reference The `senderDetails` object accepts the following fields. Which fields are **required** vs optional depends on the destination country and sender `type`. Always call `GET /public/senderFields?country={ISO3}&type={INDIVIDUAL|BUSINESS}` to get the exact field requirements at runtime. | Field | Type | Description | | ----------------- | -------------------------- | ----------------------------------------------------------- | | `type` | `INDIVIDUAL` \| `BUSINESS` | Sender type — drives which fields are collected | | `firstName` | string | First name (INDIVIDUAL only) | | `lastName` | string | Last name (INDIVIDUAL only) | | `businessName` | string | Registered business name (BUSINESS only) | | `countryCode` | string (ISO3) | Sender's country of residence | | `address1` | string | Street address | | `dateOfBirth` | string (YYYY-MM-DD) | Date of birth (INDIVIDUAL only) | | `gender` | `M` \| `F` \| `O` | Gender (INDIVIDUAL only) | | `nationality` | string (ISO3) | Nationality (INDIVIDUAL only) | | `mobileNoCountry` | string | Phone dial code e.g. `+971` | | `mobileNo` | string | Phone number without dial code | | `zipCode` | string | Postal/ZIP code | | `idType` | string (code) | ID document type — see `GET /public/idTypes` | | `idNo` | string | ID document number | | `idExpiryDate` | string (YYYY-MM-DD) | ID expiry date | | `fundSource` | string (code) | Source of funds — see `GET /public/fundSources` | | `relationship` | string (code) | Relationship to recipient — see `GET /public/relationships` | ### Required fields by country and type **India (IND) — INDIVIDUAL** Required: `firstName`, `lastName`, `countryCode`, `address1` Optional (but improve compliance): `dateOfBirth`, `gender`, `nationality`, `mobileNoCountry`, `mobileNo`, `zipCode`, `idType`, `idNo`, `idExpiryDate`, `fundSource`, `relationship` **India (IND) — BUSINESS** Required: `businessName`, `countryCode`, `mobileNoCountry`, `mobileNo`, `address1`, `fundSource` **UAE (ARE) — INDIVIDUAL** Required: `firstName`, `lastName` Optional: `countryCode`, `address1`, `dateOfBirth`, `gender` **UAE (ARE) — BUSINESS** Required: `businessName` Optional: `countryCode`, `address1` ## Transaction Status Tracking Use: - `GET /transactions` - `GET /transactions/{id}` Common lifecycle statuses: - `CONFIRMING` - `PROCESSING` - `COMPLETED` - `FAILED` ## Integration Guardrails - Do not reuse old quotes for delayed execution. - Handle `TXN_005` (quote expired) by regenerating quote. - Handle `TXN_006` (insufficient balance) before retrying. - Treat `TXN_008` (already executed) as non-retriable. ## Optional Metadata Endpoints ### Sender Fields (Public — no auth required) Before rendering a sender form, fetch the required fields for the sender's country and type: ``` GET /public/senderFields?country=IND&type=INDIVIDUAL ``` Returns an array of field definitions: ```json { "success": true, "data": [ { "fieldName": "firstName", "displayName": "First Name", "required": true, "type": "STRING", "regex": "^[A-Za-z\\s.'.\\-]{1,35}$", "errorMessage": "Please enter a valid first name (1-35 letters)" } ] } ``` - `type` can be `STRING`, `DATE` (expect `YYYY-MM-DD`), or `MULTI_CHOICE` - Only `required: true` fields are mandatory; optional fields improve compliance - Supported countries: `IND`, `ARE`; supported types: `INDIVIDUAL`, `BUSINESS` ### Country Configuration (Public — no auth required) ``` GET /public/countryConfig ``` Returns a map of enabled destination countries. Use `hasSenderFields` to decide whether to collect and send `senderDetails`: ```json { "success": true, "data": { "IND": { "hasSenderFields": true }, "PHL": { "hasSenderFields": false } } } ``` ### Purpose of Payment Codes ``` GET /public/purposeOfPayments?countryId=IND GET /transactions/purpose?countryId=IND ``` Both endpoints return the same `{ code, name }` array. Use the `code` value as `purposeOfPayment` on the transaction. ### Fund Sources ``` GET /public/fundSources?countryId=IND GET /transactions/fundSources?countryId=IND ``` Returns `{ code, name }` pairs. Use `code` as `senderDetails.fundSource`. ### ID Types ``` GET /public/idTypes?countryId=IND GET /transactions/idTypes?countryId=IND ``` Returns `{ code, name }` pairs. Use `code` as `senderDetails.idType`. ### Relationship Codes (Public — no auth required) ``` GET /public/relationships ``` Returns `{ code, name }` pairs. Use `code` as `senderDetails.relationship`. --- ## Webhooks Source: https://docs.arpdigital.io/webhooks # Webhooks Use webhooks for near-real-time status updates across remittance, wallet, trade, checkout, and payout events. ## Delivery Model - Method: `POST` - Content-Type: `application/json` - Success condition: any `2xx` response from your endpoint - Retries: enabled (default max retries: `5`, exponential backoff) - Default timeout per attempt: `30` seconds ## Delivery Headers Every delivery includes: - `X-Webhook-Signature` - `X-Webhook-ID` - `X-Delivery-ID` - `X-Event` - `User-Agent` Signature format depends on webhook version: - Version 1: raw hex digest - Version 2: `sha256=` ## Signature Verification Signature is generated over raw JSON body: ```text HMAC_SHA256(webhookSecret, rawRequestBody) ``` ### Node.js Verification Example ```javascript import crypto from "crypto"; export function verifyWebhookSignature({ rawBody, headerSignature, secret }) { const computed = crypto .createHmac("sha256", secret) .update(rawBody) .digest("hex"); const received = headerSignature.startsWith("sha256=") ? headerSignature.slice("sha256=".length) : headerSignature; const a = Buffer.from(received, "hex"); const b = Buffer.from(computed, "hex"); if (a.length !== b.length) return false; return crypto.timingSafeEqual(a, b); } ``` ## Payload Formats ### Version 2 Payload ```json { "id": "3f19f594-2b01-48f5-8fdb-851a96a4f063", "eventType": "gps.transaction.completed", "timestamp": "2026-02-09T08:30:22.424Z", "data": { "id": "transaction_id", "status": "COMPLETED" }, "referenceId": "transaction_id" } ``` ### Version 1 Payload (Legacy) ```json { "event": "transaction.completed", "data": { "id": "transaction_id", "status": "COMPLETED" }, "timestamp": "2026-02-09T08:30:22.424Z", "webhook_id": "webhook_id" } ``` ## Common Event Types - `gps.transaction.created` - `gps.transaction.completed` - `gps.transaction.failed` - `wallet.deposit.created` - `wallet.deposit.completed` - `wallet.deposit.failed` - `wallet.withdraw.created` - `wallet.withdraw.completed` - `wallet.withdraw.failed` - `otc.trade.created` - `otc.trade.updated` - `otc.trade.completed` - `pay.checkout.created` - `pay.checkout.updated` - `payout.wallet.created` - `payout.wallet.status_updated` - `payout.transaction.created` - `payout.transaction.status_updated` ## Endpoint Requirements (Your Side) Your webhook endpoint should: 1. Read the raw request body. 2. Verify signature before parsing business payload. 3. Return `2xx` quickly. 4. Process asynchronously after acknowledgment. 5. Deduplicate by `X-Delivery-ID` and/or payload `id`. ## Operational Recommendations - Log `X-Delivery-ID`, `X-Event`, and response status. - Alert on repeated non-2xx responses. - Rotate webhook secrets during incident response. --- ## ARP Digital GATE API Source: https://docs.arpdigital.io/checkout-api Description: GATE API for checkout and vault management services Version: 1.0.0 ### POST /checkout **Summary:** Create checkout Create a new checkout session **Parameters:** - `X-API-Key` (header, required): Your API key - `X-Timestamp` (header, required): Current Unix timestamp in seconds - `X-Signature` (header, required): HMAC SHA256 signature of apiKey + requestBody + timestamp using your API secret - `X-Environment` (header, required): Environment where the request is executed **Request Body:** JSON ```json { "type": "object", "required": [ "externalClientId", "externalCheckoutId", "fromAmount", "fromCurrencyId" ], "properties": { "successUrl": { "type": "string", "nullable": true, "description": "Users will be redirected to this URL after a successfully completed transaction." }, "externalClientId": { "type": "string", "description": "Identifier for the client creating the checkout." }, "externalCheckoutId": { "type": "string", "description": "External reference for the checkout." }, "vaultId": { "type": "string", "nullable": true, "description": "Optional vault ID linked to the checkout." }, "subAccountId": { "type": "string", "nullable": true, "description": "Optional sub-account ID to attribute the checkout's balance to." }, "fromAmount": { "type": "number", "description": "Amount to process." }, "fromCurrencyId": { ``` **Responses:** - `200`: Checkout created successfully. `checkoutUrl` carries a `/s` path segment (e.g. `/checkout/s/{checkoutId}`) when `X-Environment` is `sandbox`. - `400`: - `401`: - `403`: - `404`: - `500`: ### GET /checkout **Summary:** List checkouts Retrieve a list of checkouts **Parameters:** - `X-API-Key` (header, required): Your API key - `X-Timestamp` (header, required): Current Unix timestamp in seconds - `X-Signature` (header, required): HMAC SHA256 signature of apiKey + requestBody + timestamp using your API secret - `X-Environment` (header, required): Environment where the request is executed - `page` (query): Page number for pagination - `pageSize` (query): Number of checkouts per page - `search` (query): Search query to filter checkouts by ID, External Checkout ID, or External Client ID - `status` (query): Filter checkouts by their status **Responses:** - `200`: List of checkouts with detailed information and pagination metadata. - `400`: - `401`: - `403`: - `500`: ### POST /checkout/broker **Summary:** Create broker checkout Create a new broker checkout session **Parameters:** - `X-API-Key` (header, required): Your API key - `X-Timestamp` (header, required): Current Unix timestamp in seconds - `X-Signature` (header, required): HMAC SHA256 signature of apiKey + requestBody + timestamp using your API secret - `X-Environment` (header, required): Environment where the request is executed **Request Body:** JSON ```json { "type": "object", "required": [ "externalClientId", "externalCheckoutId", "fromAmount", "fromCurrencyId" ], "properties": { "externalClientId": { "type": "string", "description": "Identifier for the client creating the checkout." }, "externalCheckoutId": { "type": "string", "description": "External reference for the checkout." }, "fromAmount": { "type": "number", "description": "Amount to convert or process." }, "fromCurrencyId": { "type": "string", "description": "Currency ID (FIAT or CRYPTO). To get available currencies, use the Wallet API endpoint: https://docs.platform.arpdigital.io/wallet-api/currencies#list-currencies" }, "vaultId": { "type": "string", "nullable": true, "description": "Optional vault ID linked to the checkout." }, "subAccountId": { "type": "string", "nullable": true, "description": "Optional sub-account ID to at ``` **Responses:** - `200`: Checkout created successfully. `buyerUrl`/`sellerUrl` carry a `/s` path segment when `X-Environment` is `sandbox`, and resolve to the org's configured custom domain (a subdomain of the dashboard host) instead of the plain dashboard host when one is set. - `400`: - `401`: - `403`: - `404`: - `500`: ### GET /checkout/{checkoutId} **Summary:** Get checkout Retrieve a specific checkout by ID **Parameters:** - `X-API-Key` (header, required): Your API key - `X-Timestamp` (header, required): Current Unix timestamp in seconds - `X-Signature` (header, required): HMAC SHA256 signature of apiKey + requestBody + timestamp using your API secret - `X-Environment` (header, required): Environment where the request is executed - `checkoutId` (path, required): Checkout ID **Responses:** - `200`: Checkout details - `400`: - `401`: - `403`: - `500`: ### GET /checkout/{checkoutId}/completion-url **Summary:** Get checkout completion URL Retrieve the completion URL for a checkout **Parameters:** - `X-API-Key` (header, required): Your API key - `X-Timestamp` (header, required): Current Unix timestamp in seconds - `X-Signature` (header, required): HMAC SHA256 signature of apiKey + requestBody + timestamp using your API secret - `X-Environment` (header, required): Environment where the request is executed - `checkoutId` (path, required): Checkout ID **Responses:** - `200`: Completion URL - `400`: - `401`: - `403`: - `404`: - `500`: ### GET /checkout/{checkoutId}/receipt **Summary:** Get checkout receipt Retrieve the receipt for a completed checkout **Parameters:** - `X-Environment` (header, required): Environment where the request is executed - `checkoutId` (path, required): Checkout ID **Responses:** - `200`: Receipt data - `404`: - `500`: ### GET /checkout/buyer/{checkoutId} **Summary:** Get buyer checkout Retrieve checkout details for the buyer **Parameters:** - `X-Environment` (header, required): Environment where the request is executed - `checkoutId` (path, required): Checkout ID **Responses:** - `200`: Returns checkout details. If buyer KYC is required, returns minimal details. Otherwise, returns full checkout object including optional QR code data. - `404`: - `500`: ### GET /checkout/seller/{checkoutId} **Summary:** Get seller checkout Retrieve checkout details for the seller **Parameters:** - `X-Environment` (header, required): Environment where the request is executed - `checkoutId` (path, required): Checkout ID **Responses:** - `200`: Returns checkout details. If seller KYC is required, returns minimal details. Otherwise, returns full checkout object. - `404`: - `500`: ### POST /checkout/complete **Summary:** Complete checkout Proceed to complete checkout **Parameters:** - `X-Environment` (header, required): Environment where the request is executed **Request Body:** JSON ```json { "type": "object", "properties": { "checkoutId": { "type": "string", "description": "The ID of the checkout to complete" }, "toCryptocurrencyId": { "type": "string", "description": "The ID of the cryptocurrency that will be used to complete the checkout. To get available cryptocurrencies, use the Wallet API endpoint: https://docs.platform.arpdigital.io/wallet-api/cryptocurrencies#list-cryptocurrencies" } } } ``` **Responses:** - `200`: Checkout completed successfully - `404`: - `500`: ### POST /checkout/penny-test **Summary:** Create penny test Create a penny test for a checkout **Parameters:** - `X-Environment` (header, required): Environment where the request is executed **Request Body:** JSON ```json { "type": "object", "required": [ "checkoutId", "amount" ], "properties": { "checkoutId": { "type": "string", "description": "The ID of the checkout to run the penny test against" }, "amount": { "type": "number", "description": "Amount to test (in units of the chosen cryptocurrency)" } } } ``` **Responses:** - `200`: Penny test started successfully. `pennyTestId`/`address`/`amount` duplicate `data.pennyTest`'s `id`/(the checkout's wallet address)/`amount` at the top level for convenience. - `404`: - `500`: ### POST /checkout/{checkoutId}/cancel **Summary:** Cancel checkout Cancel a checkout session **Parameters:** - `X-API-Key` (header, required): Your API key - `X-Timestamp` (header, required): Current Unix timestamp in seconds - `X-Signature` (header, required): HMAC SHA256 signature of apiKey + requestBody + timestamp using your API secret - `undefined` (undefined): - `checkoutId` (path, required): Checkout ID **Responses:** - `200`: Checkout canceled successfully - `400`: - `401`: - `403`: - `404`: - `500`: ### POST /vaults **Summary:** Create vaults and wallets Create new vaults and associated wallets **Parameters:** - `X-API-Key` (header, required): Your API key - `X-Timestamp` (header, required): Current Unix timestamp in seconds - `X-Signature` (header, required): HMAC SHA256 signature of apiKey + requestBody + timestamp using your API secret - `undefined` (undefined): **Request Body:** JSON ```json { "type": "object", "properties": { "vaultName": { "type": "string" } }, "required": [ "vaultName" ] } ``` **Responses:** - `200`: Vaults and wallets created successfully ### GET /vaults/detailed **Summary:** Get detailed vaults Retrieve detailed information about vaults **Parameters:** - `X-API-Key` (header, required): Your API key - `X-Timestamp` (header, required): Current Unix timestamp in seconds - `X-Signature` (header, required): HMAC SHA256 signature of apiKey + requestBody + timestamp using your API secret - `X-Environment` (header, required): Environment where the request is executed - `page` (query): Page number for pagination - `pageSize` (query): Number of checkouts per page - `search` (query): Search query to filter vaults by ID, name, or account ID **Responses:** - `200`: Vaults retrieved successfully ### GET /vaults/basic **Summary:** Get basic vaults Retrieve basic information about vaults **Parameters:** - `X-API-Key` (header, required): Your API key - `X-Timestamp` (header, required): Current Unix timestamp in seconds - `X-Signature` (header, required): HMAC SHA256 signature of apiKey + requestBody + timestamp using your API secret - `X-Environment` (header, required): Environment where the request is executed **Responses:** - `200`: Vaults retrieved successfully --- ## ARP Digital Payout API Source: https://docs.arpdigital.io/payout-openapi.json Description: Crypto Payouts API for registering destination wallets and executing outbound USDT/USDC withdrawals on Ethereum and TRON. Track payout status via webhooks (see the Webhooks section below) or by polling the list/detail endpoints. All requests require API key authentication with an HMAC SHA256 signature over the exact request bytes. Version: 1.0.0 ### GET /payouts/trusted-vasps **Summary:** List Trusted VASPs Returns an alphabetically sorted list of approved exchange (VASP) names. When registering a VASP wallet via `POST /payouts/wallets`, the `exchangeName` supplied must match a `name` value from this list. **Parameters:** - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: Trusted VASPs retrieved. - `401`: - `403`: - `429`: - `500`: ### POST /payouts/wallets **Summary:** Create Destination Wallet Registers a new destination wallet required prior to initiating payout transactions. **Supported Wallet Types:** - `VASP`: Exchange or custodial wallet address. `exchangeName` must exactly match an active entry from GET /payouts/trusted-vasps — see that operation for the full list. - `SELF_HOSTED`: Non-custodial wallet address. **Supported Assets & Networks:** - `USDT`: Ethereum (`ETH`), TRON (`TRON`) - `USDC`: Ethereum (`ETH`) only. **Parameters:** - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Request Body:** JSON ```json { "$ref": "#/components/schemas/CreateWalletRequest" } ``` **Responses:** - `201`: Wallet registered. - `400`: - `401`: - `403`: - `409`: An active wallet already exists for this org, address, and network. - `422`: Field-level or cross-field validation failed (e.g. exchangeName missing for VASP, an invalid checksummed address, USDC requested on TRON). - `429`: - `500`: ### GET /payouts/wallets **Summary:** List Wallets Paginated list of your organization's destination wallets. **Parameters:** - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `page` (query): 1-based page number. If both page and offset are given, offset wins. - `limit` (query): Items per page. - `offset` (query): integer - `status` (query): string - `search` (query): Free-text match against beneficiaryName. - `asset` (query): string - `destinationType` (query): string **Responses:** - `200`: Wallets retrieved. - `401`: - `403`: - `429`: - `500`: ### GET /payouts/wallets/{walletId} **Summary:** Get Wallet by ID Retrieve a single destination wallet belonging to your organization. **Parameters:** - `walletId` (path, required): string - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: Wallet found. - `401`: - `403`: - `404`: - `429`: - `500`: ### POST /payouts **Summary:** Create Payout Submits a payout to an APPROVED destination wallet. The response is 202 Accepted, not 200/201 — creating a payout only records the request and reserves funds; screening and execution happen asynchronously. Poll GET /payouts/{payoutId} or subscribe to payout.transaction.status_updated webhooks to observe its progress. **Parameters:** - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Request Body:** JSON ```json { "$ref": "#/components/schemas/CreatePayoutRequest" } ``` **Responses:** - `202`: Payout accepted as SUBMITTED. - `401`: - `403`: - `422`: The wallet is not APPROVED, the amount is not positive, the reference-rate quote could not be obtained, or the org's balance is insufficient. - `429`: - `500`: - `503`: The USD reference-rate service could not be reached. ### GET /payouts **Summary:** List Payouts Paginated list of your organization's payouts. **Parameters:** - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `page` (query): integer - `limit` (query): integer - `offset` (query): integer - `status` (query): string - `search` (query): Free-text match against the destination wallet's beneficiaryName, externalTransactionId, or externalClientId. - `asset` (query): string - `network` (query): string - `destinationWalletId` (query): string **Responses:** - `200`: Payouts retrieved. - `401`: - `403`: - `429`: - `500`: ### GET /payouts/fee-estimate **Summary:** Estimate Payout Fee Calculates the platform fee and total payout deduction prior to submission. This read-only calculation previews cost metrics for display or internal processing without creating a payout, reserving funds, or modifying balances. **Parameters:** - `amount` (query, required): Decimal string — no exponent notation, no leading `+`. - `asset` (query, required): string - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: Fee estimate calculated. - `400`: - `401`: - `403`: - `422`: amount is not a positive decimal string, or asset is not USDT/USDC. - `429`: - `500`: - `503`: The fee rate service could not be reached. ### GET /payouts/{payoutId} **Summary:** Get Payout by ID Retrieve a single payout belonging to your organization. **Parameters:** - `payoutId` (path, required): string - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: Payout found. - `401`: - `403`: - `404`: - `429`: - `500`: --- ## ARP Digital GPS API Source: https://docs.arpdigital.io/remittance-api Description: API for ARP Digital GPS platform allowing users to manage recipients, quotes, and remittance transactions. ## Authentication All API requests require API Key authentication via the Authorization header. Version: 1.0.0 ### GET /api/v1/recipients **Summary:** List Recipients Retrieve all recipients for the authenticated user **Parameters:** - `page` (query): Page number for pagination - `limit` (query): Number of items per page - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: Successfully retrieved recipients - `400`: Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `429`: API rate limit exceeded - too many requests in a given amount of time. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### POST /api/v1/recipients **Summary:** Create Recipient Create a new recipient with verification information and payment methods **Parameters:** - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Request Body:** JSON ```json { "$ref": "#/components/schemas/CreateRecipient" } ``` **Responses:** - `201`: Successfully created recipient - `400`: Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `429`: API rate limit exceeded - too many requests in a given amount of time. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### GET /api/v1/recipients/{id} **Summary:** Get Recipient Retrieve a specific recipient by ID **Parameters:** - `id` (path, required): Recipient ID - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: Successfully retrieved recipient - `400`: Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `429`: API rate limit exceeded - too many requests in a given amount of time. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### GET /api/v1/recipients/verificationFields **Summary:** Get Recipient Verification Fields **Parameters:** - `country` (query, required): 3-letter ISO country code - `type` (query, required): Recipient type - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: Successfully retrieved verification fields - `400`: Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: KYC verification not started. - `429`: API rate limit exceeded - too many requests in a given amount of time. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### GET /api/v1/recipients/paymentMethodFields **Summary:** Get Payment Method Fields Retrieve required payment method fields for recipients based on country **Parameters:** - `country` (query, required): 3-letter ISO country code - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: Successfully retrieved payment method fields - `400`: Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `429`: API rate limit exceeded - too many requests in a given amount of time. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### POST /api/v1/quote **Summary:** Get Exchange Rate Quote Get a quote for currency exchange between sender and recipient **Parameters:** - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Request Body:** JSON ```json { "$ref": "#/components/schemas/QuoteRequest" } ``` **Responses:** - `201`: Successfully generated quote - `400`: Quote has expired or Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `404`: Quote Not Found: The specified recipientId does not exist. - `429`: API rate limit exceeded - too many requests in a given amount of time. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `502`: Failed to fetch quote from provider : An error occurred while fetching the quote. - `503`: Service temporarily unavailable. ### POST /api/v1/transaction **Summary:** Execute Transaction Execute a remittance transaction based on a previously generated quote **Parameters:** - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Request Body:** JSON ```json { "$ref": "#/components/schemas/TransactionRequest" } ``` **Responses:** - `201`: Successfully created transaction - `400`: Invalid quoteId or recipientId : The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `404`: Transaction not found: The specified quoteId or recipientId does not exist. - `409`: Transaction already executed or Quote expired: The transaction has already been executed or the quote has expired. - `429`: API rate limit exceeded - too many requests in a given amount of time. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `502`: Failed to execute transaction : An error occurred while executing the transaction. - `503`: Service temporarily unavailable. ### GET /api/v1/transactions **Summary:** List Transactions Retrieve all transactions for the authenticated user **Parameters:** - `page` (query): Page number (1-based) - `limit` (query): Items per page - `offset` (query): Number of items to skip (alternative to page) - `recipientId` (query): Filter by recipient ID - `status` (query): Filter by transaction status - `search` (query): Free-text search across transaction fields - `startDate` (query): Filter transactions created on or after this ISO 8601 timestamp - `endDate` (query): Filter transactions created on or before this ISO 8601 timestamp - `country` (query): Filter by destination country (ISO 3166-1 alpha-3) - `partner` (query): Filter by partner name - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: Successfully retrieved transactions - `400`: Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `429`: API rate limit exceeded - too many requests in a given amount of time. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### GET /api/v1/transactions/purpose **Summary:** List Purpose of Payment Codes Returns the list of valid purpose-of-payment codes for a given destination country. Pass the chosen `code` as `purposeOfPayment` when creating a transaction. **Parameters:** - `countryId` (query, required): ISO 3166-1 alpha-3 destination country code to filter results (e.g. IND, PHL). Omit to receive all codes. - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: List of purpose-of-payment codes - `401`: Unauthorized ### GET /api/v1/transactions/fundSources **Summary:** List Fund Sources Returns valid source-of-funds codes for a given destination country. Pass the chosen `code` as `senderDetails.fundSource` when creating a transaction. **Parameters:** - `countryId` (query, required): ISO 3166-1 alpha-3 destination country code to filter results. Omit to receive all codes. - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: List of fund source codes - `401`: Unauthorized ### GET /api/v1/senders **Summary:** Get Sender Returns the sender profile for the authenticated organisation. The sender represents the originating entity (organisation owner) for outbound transactions. **Parameters:** - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: Sender profile for the authenticated organisation (the org owner user) - `401`: Unauthorized ### GET /api/v1/transactions/{id} **Summary:** Get Transaction Retrieve a specific transaction by ID **Parameters:** - `id` (path, required): Transaction ID - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: Successfully retrieved transaction - `400`: Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `429`: API rate limit exceeded - too many requests in a given amount of time. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### GET /api/v1/balance **Summary:** Get Organisation Balance Returns the current balance across all currencies held by the authenticated organisation. **Parameters:** - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: Organisation balances - `401`: Unauthorized ### POST /api/v1/recipients/validate **Summary:** Validate Recipient Bank Account Pre-validate an India bank account before creating a recipient or executing a remittance. Currently supports India bank account validation only (IFSC-based). In non-production environments the validation is bypassed and always returns valid. **Parameters:** - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Request Body:** JSON ```json { "type": "object", "required": [ "accountNumber", "ifscCode", "accountHolderName" ], "properties": { "accountNumber": { "type": "string", "description": "Bank account number of the recipient", "example": "123456789012" }, "ifscCode": { "type": "string", "description": "IFSC code of the recipient's bank branch", "example": "HDFC0001234" }, "accountHolderName": { "type": "string", "description": "Full name of the account holder as registered with the bank", "example": "Rohan Sharma" } } } ``` **Responses:** - `200`: Validation completed. Check the `success` field — `false` means the account failed validation. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `422`: Validation error: one or more required fields are missing or malformed. - `429`: API rate limit exceeded - too many requests in a given amount of time. - `500`: Internal Server Error: An unexpected error occurred while processing the request. ### POST /api/v1/transaction/direct **Summary:** Create Direct Transaction Creates a recipient, quote, and transaction in a single atomic call. Useful for programmatic integrations where the full flow (create recipient → get quote → create transaction) would be cumbersome. `externalReference` must be unique per organisation — submitting the same value twice returns a duplicate error rather than creating a second transaction. **Parameters:** - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Request Body:** JSON ```json { "type": "object", "required": [ "externalReference", "recipient", "sender" ], "properties": { "externalReference": { "type": "string", "minLength": 1, "example": "TXN-2026-00123", "description": "Your unique reference for this transaction. Duplicate submissions return ACC_DUPLICATE." }, "fromCurrency": { "type": "string", "example": "USDT", "description": "Source currency. Required if quoteId is not provided." }, "toCurrency": { "type": "string", "example": "INR", "description": "Destination fiat currency. Required if quoteId is not provided." }, "fromAmount": { "type": "number", "example": 100, "description": "Amount in fromCurrency. Provide exactly one of fromAmount or toAmount." }, "toAmount": { "type": "number", "example": 8300, "description": "Amount in toCurrency the recipient should receive. Provide exactly one of fromAmount or ``` **Responses:** - `200`: Transaction created and submitted to partner - `400`: Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized - `500`: Internal server error ### GET /public/senderFields **Summary:** Get Sender Field Definitions Returns the list of fields that must be collected from the sender for a given source country and sender type. Use this to dynamically build sender forms. No authentication required. Supported countries: `IND`, `ARE`. **Parameters:** - `country` (query, required): ISO 3166-1 alpha-3 source country code of the sender (e.g. IND, ARE) - `type` (query, required): Sender type **Responses:** - `200`: List of sender fields with validation rules - `400`: Missing or invalid country/type parameter ### GET /public/countryConfig **Summary:** Get Country Configuration Returns configuration for all enabled destination countries. The `hasSenderFields` flag indicates whether `senderDetails` is required when sending to that country. No authentication required. **Responses:** - `200`: Country configuration map ### GET /api/v1/countries/{id} **Summary:** List Country Configuration Returns configuration for all enabled destination countries, including whether `senderDetails` is required (`hasSenderFields`). The `{id}` path parameter is accepted for routing purposes. **Parameters:** - `id` (path, required): 3-letter ISO country code (e.g. IND, ARE, PHL) **Responses:** - `200`: Country configuration map - `401`: Unauthorized: Authentication credentials missing or invalid - `500`: Internal Server Error ### GET /public/relationships **Summary:** List Relationship Codes Returns the list of sender-to-recipient relationship codes. Pass the chosen `code` as `senderDetails.relationship` when creating a transaction. No authentication required. **Responses:** - `200`: List of relationship codes ### GET /public/countries **Summary:** List Supported Countries Returns a sorted list of all supported destination country codes. **Responses:** - `200`: List of supported country codes ### GET /public/purposeOfPayments **Summary:** List Purpose of Payment Codes Returns all valid purpose-of-payment codes for a given destination country. **Parameters:** - `countryId` (query, required): 3-letter ISO country code **Responses:** - `200`: Purpose of payment codes - `422`: countryId is required ### GET /public/fundSources **Summary:** List Fund Sources Returns all valid fund source codes for a given destination country. **Parameters:** - `countryId` (query, required): 3-letter ISO country code **Responses:** - `200`: Fund source codes - `422`: countryId is required ### GET /public/idTypes **Summary:** List ID Types Returns all valid sender ID type codes for a given destination country. **Parameters:** - `countryId` (query, required): 3-letter ISO country code **Responses:** - `200`: ID type codes - `422`: countryId is required --- ## ARP Digital OTC API Source: https://docs.arpdigital.io/trade-api Description: Over-The-Counter (OTC) trading API for managing trades and obtaining real-time quotes. This API enables authenticated users to execute buy/sell trades, retrieve their trading history, and request price quotes for various trading pairs. All requests require API key authentication with HMAC SHA256 signature verification for security. Version: 1.0.0 ### POST /quotes **Summary:** Create Quote Get a real-time price quote for a currency pair. Provide currency symbols and either fromAmount or toAmount. **Parameters:** - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Request Body:** JSON ```json { "$ref": "#/components/schemas/GetQuoteRequest" } ``` **Responses:** - `200`: Quote created successfully - `400`: - `401`: - `403`: - `429`: - `500`: - `503`: ### GET /trading-pairs **Summary:** Get Trading Pairs Retrieve all available currency trading pairs. **Parameters:** - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: Trading pairs retrieved successfully - `401`: - `403`: - `429`: - `500`: - `503`: ### POST /trades **Summary:** Create Trade Create a trade using a valid quoteId. **Parameters:** - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Request Body:** JSON ```json { "$ref": "#/components/schemas/CreateTradeRequest" } ``` **Responses:** - `201`: Trade executed successfully - `400`: - `401`: - `403`: - `429`: - `500`: - `503`: ### GET /trades **Summary:** List Trades Retrieve a paginated list of trades for your organization. **Parameters:** - `page` (query): Page number - `limit` (query): Items per page (max 100) - `status` (query): Filter by trade status - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: Trades retrieved successfully - `400`: - `401`: - `403`: - `429`: - `500`: - `503`: ### GET /trades/{id} **Summary:** Get Trade Retrieve details for a specific trade by its ID. **Parameters:** - `id` (path, required): Trade ID - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: Trade details retrieved successfully - `400`: - `401`: - `403`: - `404`: Trade not found - `429`: - `500`: - `503`: --- ## Wallet API Source: https://docs.arpdigital.io/wallet-api Description: API for managing wallets, bank accounts, deposits, and withdrawals Version: 1.0.0 ### GET /api/v1/balance **Summary:** Get Balances Retrieve all balance information for the authenticated organization **Parameters:** - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: Successfully retrieved balances - `400`: Insufficient balance. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `429`: API rate limit exceeded - too many requests in a given amount of time. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### GET /api/v1/wallets **Summary:** List Wallets Retrieve all wallets for the authenticated organization **Parameters:** - `chainId` (query): Filter by blockchain chain ID - `status` (query): Filter by wallet status - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: Successfully retrieved wallets - `400`: Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `429`: API rate limit exceeded - too many requests in a given amount of time. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### POST /api/v1/wallets **Summary:** Create Wallet Create a new wallet for the authenticated organization **Parameters:** - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Request Body:** JSON ```json { "type": "object", "required": [ "chainId", "address", "cryptocurrencyId" ], "properties": { "chainId": { "type": "string", "description": "Blockchain chain ID" }, "name": { "type": "string", "description": "Optional wallet name" }, "address": { "type": "string", "description": "Wallet address" }, "cryptocurrencyId": { "type": "string", "description": "Cryptocurrency ID" } } } ``` **Responses:** - `201`: Successfully created wallet - `400`: Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `429`: API rate limit exceeded - too many requests in a given amount of time. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### GET /api/v1/wallets/{id} **Summary:** Get Wallet Retrieve a specific wallet by ID **Parameters:** - `id` (path, required): Wallet ID - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: Successfully retrieved wallet - `400`: Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `429`: API rate limit exceeded - too many requests in a given amount of time. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### GET /api/v1/bank-accounts **Summary:** List Bank Accounts Retrieve all bank accounts for the authenticated organization **Parameters:** - `currencyId` (query): Filter by currency ID - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: Successfully retrieved bank accounts - `400`: Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `429`: API rate limit exceeded - too many requests in a given amount of time. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### POST /api/v1/bank-accounts **Summary:** Create Bank Account Create a new bank account for the authenticated organization **Parameters:** - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Request Body:** JSON ```json { "type": "object", "required": [ "currencyId", "country", "beneficiaryName", "bankName", "accountNumber" ], "properties": { "currencyId": { "type": "string", "description": "Currency ID" }, "country": { "type": "string", "pattern": "^[A-Z]{3}$", "enum": [ "BHD", "SAR", "AED", "USD" ], "description": "3-letter ISO country code in uppercase" }, "beneficiaryName": { "type": "string", "description": "Name of the account beneficiary" }, "bankName": { "type": "string", "description": "Name of the bank" }, "accountNumber": { "type": "string", "description": "Bank account number" }, "routingCode": { "type": "string", "description": "Optional routing code" }, "iban": { "type": "string", "description": "Optional IBAN" }, "metadata": { "type": "object", "additionalP ``` **Responses:** - `201`: Successfully created bank account - `400`: Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `429`: API rate limit exceeded - too many requests in a given amount of time. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### GET /api/v1/bank-accounts/{id} **Summary:** Get Bank Account Retrieve a specific bank account by ID **Parameters:** - `id` (path, required): Bank Account ID - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: Successfully retrieved bank account - `400`: Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `429`: API rate limit exceeded - too many requests in a given amount of time. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### GET /api/v1/deposits **Summary:** List Deposits Retrieve deposits for the authenticated organization **Parameters:** - `status` (query): Filter by deposit status - `approvalStatus` (query): Filter by approval status - `limit` (query): Maximum number of results (1-100) - `offset` (query): Number of results to skip - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: Successfully retrieved deposits - `400`: Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `429`: API rate limit exceeded - too many requests in a given amount of time. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### POST /api/v1/deposits **Summary:** Create Deposit Create a new deposit for the authenticated organization **Parameters:** - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Request Body:** JSON ```json { "type": "object", "required": [ "currency", "amount" ], "properties": { "currency": { "type": "string", "enum": [ "BHD", "SAR", "AED", "USD", "USDT", "USDC" ], "description": "Currency code" }, "amount": { "type": "number", "format": "double", "description": "Deposit amount (must be positive)" }, "notes": { "type": "string", "description": "Optional notes" }, "reference": { "type": "string", "description": "Optional reference number" }, "source": { "type": "string", "description": "Optional source of the deposit" }, "sourceTreasuryId": { "type": "string", "description": "Optional source treasury ID" }, "externalReference": { "type": "string", "nullable": true, "description": "Optional external reference" } } } ``` **Responses:** - `201`: Successfully created deposit - `400`: Invalid deposit amount or missing required fields. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `429`: API rate limit exceeded - too many requests in a given amount of time. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### GET /api/v1/deposits/{id} **Summary:** Get Deposit Retrieve a specific deposit by ID **Parameters:** - `id` (path, required): Deposit ID - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: Successfully retrieved deposit - `400`: Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `429`: API rate limit exceeded - too many requests in a given amount of time. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### GET /api/v1/withdrawals **Summary:** List Withdrawals Retrieve withdrawals for the authenticated organization **Parameters:** - `status` (query): Filter by withdrawal status - `limit` (query): Maximum number of results (1-100, default 50) - `offset` (query): Number of results to skip (default 0) - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: Successfully retrieved withdrawals - `400`: Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `429`: API rate limit exceeded - too many requests in a given amount of time. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### POST /api/v1/withdrawals **Summary:** Create Withdrawal Create a new withdrawal for the authenticated organization **Parameters:** - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Request Body:** JSON ```json { "type": "object", "required": [ "currency", "amount" ], "properties": { "currency": { "type": "string", "enum": [ "BHD", "SAR", "AED", "USD", "USDT", "USDC" ], "description": "Currency code" }, "amount": { "type": "number", "format": "double", "description": "Withdrawal amount (must be positive)" }, "destinationWalletId": { "type": "string", "format": "uuid", "nullable": true, "description": "Destination wallet ID (XOR with destinationBankAccountId)" }, "destinationBankAccountId": { "type": "string", "format": "uuid", "nullable": true, "description": "Destination bank account ID (XOR with destinationWalletId)" }, "cryptocurrencyId": { "type": "string", "description": "Required when using destinationWalletId" }, "notes": { "type": "string", "description": "Optional n ``` **Responses:** - `201`: Successfully created withdrawal - `400`: Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `429`: API rate limit exceeded - too many requests in a given amount of time. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### GET /api/v1/withdrawals/{id} **Summary:** Get Withdrawal Retrieve a specific withdrawal by ID **Parameters:** - `id` (path, required): Withdrawal ID - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): - `undefined` (undefined): **Responses:** - `200`: Successfully retrieved withdrawal - `400`: Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `429`: API rate limit exceeded - too many requests in a given amount of time. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### GET /public/currencies **Summary:** List Currencies Retrieve all currencies **Parameters:** - `page` (query): Page number for pagination - `limit` (query): Number of items per page **Responses:** - `200`: Successfully retrieved currencies - `400`: The provided currency is invalid or not supported. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### GET /public/currencies/{id} **Summary:** Get Currency Retrieve a specific currency by ID **Parameters:** - `id` (path, required): Currency ID **Responses:** - `200`: Successfully retrieved currency - `400`: The provided currency is invalid or not supported. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### GET /public/cryptocurrencies **Summary:** List Cryptocurrencies Retrieve all cryptocurrencies **Parameters:** - `page` (query): Page number for pagination - `limit` (query): Number of items per page **Responses:** - `200`: Successfully retrieved cryptocurrencies - `400`: Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### GET /public/cryptocurrencies/{id} **Summary:** Get Cryptocurrency Retrieve a specific cryptocurrency by ID **Parameters:** - `id` (path, required): Cryptocurrency ID **Responses:** - `200`: Successfully retrieved cryptocurrency - `400`: Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### GET /public/blockchains **Summary:** List Blockchains Retrieve all blockchains **Parameters:** - `page` (query): Page number for pagination - `limit` (query): Number of items per page **Responses:** - `200`: Successfully retrieved blockchains - `400`: Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### GET /public/blockchains/{id} **Summary:** Get Blockchain Retrieve a specific blockchain by ID **Parameters:** - `id` (path, required): Blockchain ID **Responses:** - `200`: Successfully retrieved blockchain - `400`: Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ### POST /public/webhooks/fireblocks **Summary:** Fireblocks Webhook Receive webhooks from Fireblocks **Responses:** - `200`: Webhook received successfully - `400`: Bad Request: The request is malformed or contains invalid data. - `401`: Unauthorized: Authentication credentials missing or invalid. - `403`: Forbidden: The authenticated user does not have permission to access this resource. - `500`: Internal Server Error: An unexpected error occurred while processing the request. - `503`: Service temporarily unavailable. ---