{"openapi":"3.0.0","components":{"examples":{},"headers":{},"parameters":{},"requestBodies":{},"responses":{},"schemas":{"Record_string.unknown_":{"properties":{},"additionalProperties":{},"type":"object","description":"Construct a type with a set of properties K of type T"},"EnterpriseDirectWithdrawStatus":{"enum":["COMPLETED","CREATED","FAILED"],"type":"string","x-enum-varnames":["COMPLETED","CREATED","FAILED"]},"BankPaymentRail":{"enum":["wire","ach","sepa","swift"],"type":"string","x-enum-varnames":["WIRE","ACH","SEPA","SWIFT"]},"CryptoPaymentRail":{"enum":["stellar","ethereum"],"type":"string","x-enum-varnames":["STELLAR","ETHEREUM"]},"PaymentRail":{"anyOf":[{"$ref":"#/components/schemas/BankPaymentRail"},{"$ref":"#/components/schemas/CryptoPaymentRail"}]},"WithdrawalResponse":{"properties":{"id":{"type":"string","description":"The id of the withdrawal."},"status":{"$ref":"#/components/schemas/EnterpriseDirectWithdrawStatus","description":"The status of the withdrawal."},"amount":{"type":"number","format":"double","description":"The amount of the withdrawal."},"paymentRail":{"$ref":"#/components/schemas/PaymentRail","description":"The payment rail of the withdrawal."},"accountDetail":{"$ref":"#/components/schemas/Record_string.unknown_","description":"The crypto or bank account detail of the withdrawal."},"failureReason":{"type":"string","description":"The failure reason of the withdrawal in case of failure."},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","status","amount","paymentRail","accountDetail","createdAt","updatedAt"],"type":"object","additionalProperties":false},"CreateWithdrawalRequest":{"properties":{"amount":{"type":"number","format":"double","description":"The amount to withdraw."},"externalAccountId":{"type":"string","description":"The id of the external (bank or crypto) account to withdraw to."},"paymentRail":{"$ref":"#/components/schemas/BankPaymentRail","description":"Optional for bank withdrawals: The payment rail to use for the withdrawal.\nIf not provided, the payment rail will be inferred from the external account.\ne.g. if the external account is of type `us_ach`, the payment rail will be `ach`.\nif the external account is of type `us_wire`, the payment rail will be `wire`.\nif the external account is of type `iban`, the payment rail will be `sepa`.\nBut you can also use wire for an us_ach account or ach for a us_wire account.\nAnd also you specify swift for an iban account if you wish."}},"required":["amount","externalAccountId"],"type":"object","additionalProperties":false},"Paginated_WithdrawalResponse_":{"description":"Represents a paginated collection of items.","properties":{"items":{"items":{"$ref":"#/components/schemas/WithdrawalResponse"},"type":"array","description":"The items in the current page."},"startCursor":{"type":"string","description":"The cursor for the first item in the current page."},"endCursor":{"type":"string","description":"The cursor for the last item in the current page."}},"required":["items"],"type":"object","additionalProperties":false},"ListPaginatedEnterpriseDirectWithdrawsParams":{"properties":{"before":{"type":"string","description":"Gets results before the specified cursor."},"after":{"type":"string","description":"Gets results after the specified cursor."},"perPage":{"type":"integer","format":"int32","description":"The maximum number of items to fetch.","default":100,"minimum":10,"maximum":1000},"status":{"$ref":"#/components/schemas/EnterpriseDirectWithdrawStatus"}},"type":"object","additionalProperties":false},"Uuid":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"UserStatus":{"description":"Whether the user is active or inactive in Airtm","enum":["active","inactive"],"type":"string","x-enum-varnames":["Active","Inactive"]},"User":{"description":"A user in Airtm","properties":{"id":{"$ref":"#/components/schemas/Uuid","description":"Unique Airtm identifier of the user associated with the email."},"status":{"$ref":"#/components/schemas/UserStatus","description":"The user's account status."},"primaryEmail":{"type":"boolean","description":"Indicates if the queried email corresponds to the user's primary email\n\n> [!tip]\n> Airtm allows accounts to register secondary emails"},"firstName":{"type":"string","description":"The user's first name as registered in Airtm"},"lastName":{"type":"string","description":"The user's last name as registered in Airtm"},"country":{"type":"string","description":"The ISO alpha-3 code for the country where the user's ID was issued"},"isVerified":{"type":"boolean","description":"Indicates whether the user is verified"}},"required":["id","status","primaryEmail","isVerified"],"type":"object","additionalProperties":false},"Email":{"type":"string","pattern":"^(.+)@(.+)$"},"ReportType":{"description":"Type of activity report","enum":["PDF","CSV","XLSX"],"type":"string","x-enum-varnames":["PDF","CSV","XLSX"],"example":"CSV"},"ReportStatus":{"description":"The current status of the report\n\n- `PENDING`: The report is pending generation.\n- `IN_PROGRESS`: The report is currently being generated.\n- `COMPLETED`: The report has been generated and is ready for download.\n- `FAILED`: The report generation failed.","enum":["PENDING","IN_PROGRESS","COMPLETED","FAILED"],"type":"string","x-enum-varnames":["PENDING","IN_PROGRESS","COMPLETED","FAILED"]},"Report":{"properties":{"updatedAt":{"type":"string","format":"date-time","description":"Report end date"},"createdAt":{"type":"string","format":"date-time","description":"Report end date"},"periodTo":{"type":"string","format":"date-time","description":"Report end date"},"periodFrom":{"type":"string","format":"date-time","description":"Report start date"},"status":{"$ref":"#/components/schemas/ReportStatus","description":"The current status of the report"},"enterpriseUserId":{"type":"string","description":"Unique ID of the enterprise","format":"uuid"},"type":{"$ref":"#/components/schemas/ReportType"},"id":{"type":"string","description":"Unique ID of the report","format":"uuid"}},"required":["updatedAt","createdAt","periodTo","periodFrom","status","enterpriseUserId","type","id"],"type":"object"},"CreateReportRequest":{"properties":{"year":{"type":"number","format":"double","description":"The year of the report to generate","example":2025,"minimum":2023},"month":{"type":"number","format":"double","description":"The month of the report to generate","example":6,"minimum":1,"maximum":12},"type":{"$ref":"#/components/schemas/ReportType","description":"The type of the report to generate","example":"CSV"}},"required":["year","month"],"type":"object","additionalProperties":false},"Paginated_Report_":{"description":"Represents a paginated collection of items.","properties":{"items":{"items":{"$ref":"#/components/schemas/Report"},"type":"array","description":"The items in the current page."},"startCursor":{"type":"string","description":"The cursor for the first item in the current page."},"endCursor":{"type":"string","description":"The cursor for the last item in the current page."}},"required":["items"],"type":"object","additionalProperties":false},"Pick_PaginationParams.Exclude_keyofPaginationParams.perPage__":{"properties":{"before":{"type":"string","description":"Gets results before the specified cursor."},"after":{"type":"string","description":"Gets results after the specified cursor."}},"type":"object","description":"From T, pick a set of properties whose keys are in the union K"},"ListReportsParams":{"properties":{"before":{"type":"string","description":"Gets results before the specified cursor."},"after":{"type":"string","description":"Gets results after the specified cursor."},"type":{"$ref":"#/components/schemas/ReportType","description":"The type of report to filter by"},"status":{"$ref":"#/components/schemas/ReportStatus","description":"The status to filter by"},"perPage":{"type":"integer","format":"int32","description":"The maximum number of items to fetch.","default":12,"minimum":6,"maximum":100}},"required":["type"],"type":"object","additionalProperties":false},"ReportFile":{"description":"An Activity Report File","properties":{"url":{"type":"string","description":"The URL of the activity report file."}},"required":["url"],"type":"object","additionalProperties":false},"PayoutStatus":{"description":"The current status of the payout.\n\n- `CREATED`: The payout instruction has been registered and is awaiting you to call the commit endpoint.\n- `COMMITTED`: The payout was committed and is in the process of being executed.\n- `PENDING`: Funds have been placed in escrow and waiting for the recipient to take the following action to complete the payout\n  1. If a new user, create an Airtm account.\n  2. If a user receiving an amount taking them over the $1,000 inflow threshold requiring KYC.\n  3. If a US user, complete KYC and configure payment method.\n- `COMPLETED`: The payout has been completed successfully, funds have been credited to the customer's account.\n- `CANCELED`: Payout has been canceled and funds have been returned to your account.\n- `FAILED`: The payout has failed and funds have been returned to your account.\n- `ERROR`: A temporary error state. Payouts in this state should be fixed and retried until they reach a final state (COMPLETED or CANCELED).","enum":["BRIDGE_COMPLETED","BRIDGE_CREATED","BRIDGE_FAILED","BRIDGE_MAX_RETRIES_REACHED","BRIDGE_USER_SIGNUP_PENDING","CANCELED","CANCEL_REQUESTED","COMMITTED","COMPLETED","COSMOEM_COMPLETED","CREATED","ERROR","FAILED","PENDING","PENDING_SIGNATURE","SIGNED","PENDING_USER_ACTION","PROCESSING"],"type":"string","x-enum-varnames":["BRIDGE_COMPLETED","BRIDGE_CREATED","BRIDGE_FAILED","BRIDGE_MAX_RETRIES_REACHED","BRIDGE_USER_SIGNUP_PENDING","CANCELED","CANCEL_REQUESTED","COMMITTED","COMPLETED","COSMOEM_COMPLETED","CREATED","ERROR","FAILED","PENDING","PENDING_SIGNATURE","SIGNED","PENDING_USER_ACTION","PROCESSING"]},"KycInformation":{"description":"Represents the user's KYC information for a payout.\n\n> [!TIP]\n> Only available in `payout.completed` webhook and only if ID verification is enabled in your account.\n> If you want access to this information, please contact [enterprise@airtm.io](mailto:enterprise@airtm.io)\nRepresents the user's KYC information for a payout.\n\n> [!TIP]\n> Only available in `payout.completed` webhook and only if ID verification is enabled in your account.\n> If you want access to this information, please contact [enterprise@airtm.io](mailto:enterprise@airtm.io)","properties":{"fullName":{"type":"string","nullable":true},"birthDate":{"type":"string","nullable":true},"identificationNumber":{"type":"string","nullable":true},"countryCode":{"type":"string","nullable":true},"state":{"type":"string","nullable":true}},"required":["fullName","birthDate","identificationNumber","countryCode"],"type":"object","additionalProperties":false},"PayoutResponse":{"description":"Represents a Payout Object","properties":{"id":{"$ref":"#/components/schemas/Uuid","description":"This is the unique identifier for the payout."},"bulkPayoutId":{"$ref":"#/components/schemas/Uuid","description":"The identifier of the bulk payout that created this payout."},"hash":{"type":"string","description":"Unique hash for the payout operation within the Airtm system."},"code":{"type":"string","description":"A unique code used to identify the payout."},"airtmUserId":{"$ref":"#/components/schemas/Uuid","description":"This is the unique identifier for the AirTM user associated with this payout."},"airtmUserEmail":{"$ref":"#/components/schemas/Email","description":"This is the email of the Airtm user associated with this payout."},"requireIdVerified":{"type":"boolean","description":"Whether the recipient must be ID-verified to receive the funds","default":false},"notes":{"type":"string","description":"An arbitrary string describing the payment. This information is displayed to the recipient."},"internalNote":{"type":"string","description":"The description of the payout; visible to internal users"},"status":{"$ref":"#/components/schemas/PayoutStatus"},"grossAmount":{"type":"number","format":"double","description":"amount originally intended for the payout","example":10},"amount":{"type":"number","format":"double","description":"amount to be deducted from the enterprise account (grossAmount - enterpriseFee)","example":9.5},"netAmount":{"type":"number","format":"double","description":"amount received by the user (grossAmount - enterpriseFee - airtmFee)","example":9},"airtmFee":{"type":"number","format":"double","description":"The airtm fee applied to the payout","example":0.5},"enterpriseFee":{"type":"number","format":"double","description":"The enterprise fee applied to the payout","example":0.5},"reasonCode":{"type":"string","description":"Machine-friendly code relating to the reason why the payout has the current status","example":522443},"reasonDescription":{"type":"string","description":"Human-readable message describing the reason why the payout has the current status"},"kycInformation":{"$ref":"#/components/schemas/KycInformation"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp of when the payout was created."},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp of the last update made to the payout."}},"required":["id","airtmUserId","airtmUserEmail","status","grossAmount","amount","netAmount","createdAt","updatedAt"],"type":"object","additionalProperties":false},"CreatePayoutRequest":{"properties":{"airtmUserEmail":{"$ref":"#/components/schemas/Email","description":"The recipient's email address that is associated with their Airtm account"},"amount":{"type":"number","format":"double","description":"The payment amount in USD.","minimum":0.01},"commit":{"type":"boolean","description":"Immediately commit the payout.\n\nIf `true`, the payout will be committed immediately after creation. Use this if you want to\ncreate a payout in just one API call instead of a two-step process outlined in the Create / Commit\nprocess.","default":false},"code":{"type":"string","description":"A unique code used to identify the payout.\nPopulate this value with the identifier on your system.\n\n> [!important]\n> It must be unique across all existing payouts."},"enterpriseFee":{"type":"number","format":"double","description":"The enterprise fee to apply to the payout","minimum":0},"notes":{"type":"string","description":"An arbitrary string describing the payment.\nThis information is displayed to the recipient.\nIt's recommended that the string summarizes the purpose of the payment."},"internalNote":{"type":"string","description":"The description of the payout; visible to internal users"},"requireIdVerified":{"type":"boolean","description":"Set this to true to require that the recipient is ID-verified","default":false}},"required":["airtmUserEmail","amount","notes"],"type":"object","additionalProperties":false},"Paginated_PayoutResponse_":{"description":"Represents a paginated collection of items.","properties":{"items":{"items":{"$ref":"#/components/schemas/PayoutResponse"},"type":"array","description":"The items in the current page."},"startCursor":{"type":"string","description":"The cursor for the first item in the current page."},"endCursor":{"type":"string","description":"The cursor for the last item in the current page."}},"required":["items"],"type":"object","additionalProperties":false},"ListPaginatedPayoutsParams":{"properties":{"before":{"type":"string","description":"Gets results before the specified cursor."},"after":{"type":"string","description":"Gets results after the specified cursor."},"perPage":{"type":"integer","format":"int32","description":"The maximum number of items to fetch.","default":100,"minimum":10,"maximum":1000},"status":{"$ref":"#/components/schemas/PayoutStatus"},"bulkPayoutId":{"type":"string"}},"type":"object","additionalProperties":false},"PayinStatus":{"description":"The current status of the payin\n\n- `CREATED`: The payin has been created but not yet confirmed.\n- `CONFIRMED`: The payin has been confirmed and is ready for processing.\n- `CANCELED`: The payin has been canceled by the user or system.\n- `PROCESSING`: The payin is currently being processed.\n- `FAILED`: The payin has failed due to an error.\n- `BRIDGE_FAILED`: The payin has failed due to an error in Bridge.\n- `BRIDGE_CANCELED`: The payin has been canceled due to an error in Bridge.","enum":["CREATED","CONFIRMED","CANCELED","PROCESSING","FAILED","BRIDGE_FAILED","BRIDGE_CANCELED"],"type":"string","x-enum-varnames":["CREATED","CONFIRMED","CANCELED","PROCESSING","FAILED","BRIDGE_FAILED","BRIDGE_CANCELED"]},"OperationEvent":{"properties":{"updatedAt":{"type":"string","format":"date-time","description":"Date when the event was last updated."},"createdAt":{"type":"string","format":"date-time","description":"Date when the event was created."},"metadata":{"properties":{"transitionMessage":{"type":"string"},"transitionCode":{"type":"string"}},"type":"object","description":"Metadata associated with the event."},"availableBalance":{"type":"number","format":"double","nullable":true,"description":"Available balance for the enterprise.","example":12345.67},"fboBalance":{"type":"number","format":"double","nullable":true,"description":"Total balance available in the FBO account.","example":12345.67},"pendingBalance":{"type":"number","format":"double","nullable":true,"description":"Balance that is committed in pending payouts.","example":123.45},"newStatus":{"anyOf":[{"$ref":"#/components/schemas/PayoutStatus"},{"$ref":"#/components/schemas/PayinStatus"}],"description":"New status of the operation."},"previousStatus":{"anyOf":[{"$ref":"#/components/schemas/PayoutStatus"},{"$ref":"#/components/schemas/PayinStatus"}],"description":"Previous status of the operation."},"eventType":{"type":"string","description":"Type of the event."},"operationType":{"type":"string","description":"Type of the operation associated with the event.\n\nIt could be either 'PAYOUT' or 'PAYIN'."},"operationId":{"type":"string","description":"Unique identifier for the operation associated with the event.","format":"uuid"},"userId":{"type":"string","description":"Unique identifier for the user associated with the event.","format":"uuid"},"id":{"type":"string","description":"Unique identifier for the event.","format":"uuid"}},"required":["updatedAt","createdAt","metadata","newStatus","previousStatus","eventType","operationType","operationId","userId","id"],"type":"object","description":"An operation event is generated when a payin or payout transitions status."},"PayinItem":{"description":"An item within a payin transaction","properties":{"description":{"type":"string","description":"An arbitrary string describing the individual item."},"amount":{"type":"number","format":"double","description":"The price in USD of the individual item.","example":10,"minimum":0.01},"quantity":{"type":"number","format":"double","description":"The number of items being purchased.\nThis will be multiplied with the 'amount' value to calculate the total.","example":1,"minimum":1},"id":{"type":"string","description":"The unique identifier for the item","format":"uuid"},"payinId":{"type":"string","description":"The unique identifier for the payin.","format":"uuid"}},"required":["description","amount","quantity","id","payinId"],"type":"object","additionalProperties":false},"PayinResponse":{"description":"A payin is a transaction that transfers funds from a user's Airtm account to an enterprise's account.\nNormally, the payin represents a purchase made by a user.","properties":{"id":{"$ref":"#/components/schemas/Uuid","description":"The unique identifier for the payin."},"code":{"type":"string","description":"An arbitrary string of the partner’s choosing. Used to identify and correlate Airtm purchases with partner records.\n\n> [!important]\n> Must be a unique."},"hash":{"type":"string","description":"Unique hash for the payin operation within the Airtm system."},"status":{"$ref":"#/components/schemas/PayinStatus"},"amount":{"type":"number","format":"double","description":"Amount in USD that was transacted in the operation.","example":10},"netAmount":{"type":"number","format":"double","description":"Amount in USD to be received by the enterprise","example":9.5},"airtmFee":{"type":"number","format":"double","description":"Amount to be collected by Airtm as fee","example":0.5},"description":{"type":"string","description":"A text string describing the purchase.\n\n> [!tip]\n> This text is displayed to the user when they are confirming the transaction."},"items":{"items":{"$ref":"#/components/schemas/PayinItem"},"type":"array","description":"An array of the items being purchased/bought."},"airtmUserId":{"$ref":"#/components/schemas/Uuid","description":"The unique identifier for the AirTM user associated with this payin."},"airtmUserEmail":{"$ref":"#/components/schemas/Email","description":"The email of the Airtm user associated with this payin."},"failureReason":{"type":"string","description":"If the payin failed to complete, this field will describe why it failed."},"createdAt":{"type":"string","format":"date-time","description":"Timestamp of when the payin was created."},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp of the last update made to the payin."},"confirmationUri":{"type":"string","description":"A URL to redirect the user to when they confirm the transaction.","format":"url"},"cancelUri":{"type":"string","description":"A URL to redirect the user to when they cancel the transaction.","format":"url"}},"required":["id","code","status","amount","netAmount","airtmFee","description","items","createdAt","updatedAt","confirmationUri","cancelUri"],"type":"object","additionalProperties":false},"CreatePayinItem":{"properties":{"description":{"type":"string","description":"An arbitrary string describing the individual item."},"amount":{"type":"number","format":"double","description":"The price in USD of the individual item.","example":10,"minimum":0.01},"quantity":{"type":"number","format":"double","description":"The number of items being purchased.\nThis will be multiplied with the 'amount' value to calculate the total.","example":1,"minimum":1}},"required":["description","amount","quantity"],"type":"object","additionalProperties":false},"CreatePayinRequest":{"properties":{"code":{"type":"string","description":"An arbitrary string of the partner’s choosing. Used to identify and correlate Airtm purchases with partner records.\n\n> [!important]\n> Must be unique."},"amount":{"type":"number","format":"double","description":"The total amount in USD of the purchase.\n\n> [!important]\n> This value must correctly correspond to the sum of the amounts associated with each purchase item."},"description":{"type":"string","description":"A text string describing the purchase. This text is displayed to the user when they are confirming the transaction.","maximum":250},"items":{"items":{"$ref":"#/components/schemas/CreatePayinItem"},"type":"array","description":"An array of the items being purchased/bought."},"confirmationUri":{"type":"string","description":"A URL to redirect the user to when they confirm the transaction.","format":"url"},"cancelUri":{"type":"string","description":"A URL to redirect the user to when they cancel the transaction.","format":"url"}},"required":["code","amount","description","items","confirmationUri","cancelUri"],"type":"object","additionalProperties":false},"Paginated_PayinResponse_":{"description":"Represents a paginated collection of items.","properties":{"items":{"items":{"$ref":"#/components/schemas/PayinResponse"},"type":"array","description":"The items in the current page."},"startCursor":{"type":"string","description":"The cursor for the first item in the current page."},"endCursor":{"type":"string","description":"The cursor for the last item in the current page."}},"required":["items"],"type":"object","additionalProperties":false},"ListPaginatedPayinsParams":{"properties":{"before":{"type":"string","description":"Gets results before the specified cursor."},"after":{"type":"string","description":"Gets results after the specified cursor."},"perPage":{"type":"integer","format":"int32","description":"The maximum number of items to fetch.","default":100,"minimum":10,"maximum":1000},"status":{"$ref":"#/components/schemas/PayinStatus"},"enterpriseId":{"type":"string"}},"type":"object","additionalProperties":false},"Me":{"description":"Information related to your account.","properties":{"id":{"$ref":"#/components/schemas/Uuid","description":"Unique identifier of your account."},"cancelPendingPayoutsAfterDays":{"type":"number","format":"double","description":"Number of days after which pending payouts will be automatically canceled.","example":90,"default":90,"minimum":7,"maximum":180},"payoutRequireIdVerification":{"type":"boolean","description":"Indicates whether the enterprise can require ID verification for payouts.\n\nTo enable it, reach out to your account manager.","default":false}},"required":["id"],"type":"object","additionalProperties":false},"Balance":{"description":"Information related to your account.","properties":{"available":{"type":"number","format":"double","description":"Amount available in the account.","example":1234.56},"pending":{"type":"number","format":"double","description":"Amount committed to pending payouts in the account.","example":123.45}},"required":["available","pending"],"type":"object","additionalProperties":false},"CryptoWalletType":{"enum":["stellar usdc","ethereum usdc"],"type":"string","x-enum-varnames":["STELLAR_USDC","ETHEREUM_USDC"]},"CryptoCurrency":{"enum":["USDC"],"type":"string","x-enum-varnames":["USDC"]},"CryptoExternalAccountResponse":{"properties":{"id":{"type":"string","description":"The UUID of the crypto external account."},"type":{"$ref":"#/components/schemas/CryptoWalletType"},"currency":{"$ref":"#/components/schemas/CryptoCurrency"},"alias":{"type":"string"},"address":{"type":"string"},"memo":{"type":"string"},"createdAt":{"type":"string","format":"date-time","description":"The date and time the crypto external account was created."},"updatedAt":{"type":"string","format":"date-time","description":"The date and time the crypto external account was updated."}},"required":["id","type","currency","alias","address","createdAt","updatedAt"],"type":"object","additionalProperties":false},"Paginated_CryptoExternalAccountResponse_":{"description":"Represents a paginated collection of items.","properties":{"items":{"items":{"$ref":"#/components/schemas/CryptoExternalAccountResponse"},"type":"array","description":"The items in the current page."},"startCursor":{"type":"string","description":"The cursor for the first item in the current page."},"endCursor":{"type":"string","description":"The cursor for the last item in the current page."}},"required":["items"],"type":"object","additionalProperties":false},"ListPaginatedCryptoExternalAccountsParams":{"properties":{"before":{"type":"string","description":"Gets results before the specified cursor."},"after":{"type":"string","description":"Gets results after the specified cursor."},"perPage":{"type":"integer","format":"int32","description":"The maximum number of items to fetch.","default":100,"minimum":10,"maximum":1000},"type":{"$ref":"#/components/schemas/CryptoWalletType"}},"type":"object","additionalProperties":false},"AccountType":{"enum":["us_ach","us_wire","iban"],"type":"string","x-enum-varnames":["US_ACH","US_WIRE","IBAN"]},"Currency":{"enum":["USD","EUR"],"type":"string","x-enum-varnames":["USD","EUR"]},"BankExternalAccountResponse":{"properties":{"id":{"type":"string","description":"The id of the bank external account."},"accountType":{"$ref":"#/components/schemas/AccountType","description":"The type of account to create."},"currency":{"$ref":"#/components/schemas/Currency","description":"The currency of the account."},"bankName":{"type":"string","description":"The name of the bank."},"accountOwnerName":{"type":"string","description":"The name of the account owner."},"businessName":{"type":"string","description":"The name of the business."},"address":{"properties":{"country":{"type":"string"},"postalCode":{"type":"string"},"state":{"type":"string"},"city":{"type":"string"},"streetLine2":{"type":"string"},"streetLine1":{"type":"string"}},"required":["country","state","city","streetLine1"],"type":"object","description":"The address of the business."},"usAccount":{"properties":{"checkingOrSavings":{"type":"string"},"routingNumber":{"type":"string"},"accountNumber":{"type":"string"}},"required":["routingNumber","accountNumber"],"type":"object","description":"The account details for US ACH or US Wire accounts."},"iban":{"properties":{"country":{"type":"string"},"bic":{"type":"string"},"accountNumber":{"type":"string"}},"required":["country","bic","accountNumber"],"type":"object","description":"The IBAN details for IBAN accounts."},"swift":{"properties":{"shortBusinessDescription":{"type":"string"},"purposeOfFunds":{"items":{"type":"string"},"type":"array"},"category":{"type":"string"},"address":{"properties":{"country":{"type":"string"},"postalCode":{"type":"string"},"state":{"type":"string"},"city":{"type":"string"},"streetLine2":{"type":"string"},"streetLine1":{"type":"string"}},"required":["country","state","city","streetLine1"],"type":"object"},"account":{"properties":{"country":{"type":"string"},"bic":{"type":"string"},"accountNumber":{"type":"string"}},"required":["country","bic","accountNumber"],"type":"object"}},"required":["shortBusinessDescription","purposeOfFunds","category","address","account"],"type":"object","description":"Optional: The SWIFT details for IBAN account.\nWhen accountType is 'iban', the swift field is optional, meaning you can include it to provide additional SWIFT-specific information (like business context, purpose of funds, etc.), but it's not required for basic IBAN account creation."},"createdAt":{"type":"string","description":"The date and time the bank external account was created."},"updatedAt":{"type":"string","description":"The date and time the bank external account was updated."}},"required":["id","accountType","currency","bankName","accountOwnerName","businessName","createdAt","updatedAt"],"type":"object","additionalProperties":false},"CreateBankExternalAccountRequest":{"properties":{"accountType":{"$ref":"#/components/schemas/AccountType","description":"The type of account to create."},"currency":{"$ref":"#/components/schemas/Currency","description":"The currency of the account."},"bankName":{"type":"string","description":"The name of the bank."},"accountOwnerName":{"type":"string","description":"The name of the account owner."},"businessName":{"type":"string","description":"The name of the business."},"address":{"properties":{"country":{"type":"string"},"postalCode":{"type":"string"},"state":{"type":"string"},"city":{"type":"string"},"streetLine2":{"type":"string"},"streetLine1":{"type":"string"}},"required":["country","state","city","streetLine1"],"type":"object","description":"The address of the business."},"usAccount":{"properties":{"checkingOrSavings":{"type":"string","enum":["checking","savings"]},"routingNumber":{"type":"string"},"accountNumber":{"type":"string"}},"required":["routingNumber","accountNumber"],"type":"object","description":"The account details for US ACH or US Wire accounts."},"iban":{"properties":{"country":{"type":"string"},"bic":{"type":"string"},"accountNumber":{"type":"string"}},"required":["country","bic","accountNumber"],"type":"object","description":"The IBAN details for IBAN accounts."},"swift":{"properties":{"shortBusinessDescription":{"type":"string"},"purposeOfFunds":{"items":{"type":"string"},"type":"array"},"category":{"type":"string","enum":["client","parent_company","subsidiary","supplier"]},"address":{"properties":{"country":{"type":"string"},"postalCode":{"type":"string"},"state":{"type":"string"},"city":{"type":"string"},"streetLine2":{"type":"string"},"streetLine1":{"type":"string"}},"required":["country","state","city","streetLine1"],"type":"object"},"account":{"properties":{"country":{"type":"string"},"bic":{"type":"string"},"accountNumber":{"type":"string"}},"required":["country","bic","accountNumber"],"type":"object"}},"required":["shortBusinessDescription","purposeOfFunds","category","address","account"],"type":"object","description":"Optional: The SWIFT details for IBAN account.\nWhen accountType is 'iban', the swift field is optional, meaning you can include it to provide additional SWIFT-specific information (like business context, purpose of funds, etc.), but it's not required for basic IBAN account creation."}},"required":["accountType","currency","bankName","accountOwnerName","businessName"],"type":"object","additionalProperties":false},"Paginated_BankExternalAccountResponse_":{"description":"Represents a paginated collection of items.","properties":{"items":{"items":{"$ref":"#/components/schemas/BankExternalAccountResponse"},"type":"array","description":"The items in the current page."},"startCursor":{"type":"string","description":"The cursor for the first item in the current page."},"endCursor":{"type":"string","description":"The cursor for the last item in the current page."}},"required":["items"],"type":"object","additionalProperties":false},"ListPaginatedBridgeExternalAccountsParams":{"properties":{"before":{"type":"string","description":"Gets results before the specified cursor."},"after":{"type":"string","description":"Gets results after the specified cursor."},"perPage":{"type":"integer","format":"int32","description":"The maximum number of items to fetch.","default":100,"minimum":10,"maximum":1000},"accountType":{"$ref":"#/components/schemas/AccountType"}},"type":"object","additionalProperties":false},"TransactionStatusEnum":{"enum":["PENDING_FUNDING","PROCESSING_WITHDRAW","COMPLETED","CANCELED","REFUNDED","DISPUTE_CANCELED","DISPUTE_REFUNDED"],"type":"string","x-enum-varnames":["PENDING_FUNDING","PROCESSING_WITHDRAW","COMPLETED","CANCELED","REFUNDED","DISPUTE_CANCELED","DISPUTE_REFUNDED"]},"ClientConfirmation":{"enum":["CONFIRMED","DENIED"],"type":"string","x-enum-varnames":["CONFIRMED","DENIED"]},"QuoteAmounts":{"properties":{"amount":{"type":"number","format":"double"},"currency":{"type":"string"}},"required":["amount","currency"],"type":"object"},"QuoteFeesApiResponse":{"properties":{"airtmFeeAmount":{"type":"number","format":"double"},"airtmFeePercentage":{"type":"number","format":"double"}},"required":["airtmFeeAmount","airtmFeePercentage"],"type":"object"},"QuoteRailApiResponse":{"properties":{"baseExchangeRate":{"type":"number","format":"double"},"netExchangeRate":{"type":"number","format":"double"},"fees":{"$ref":"#/components/schemas/QuoteFeesApiResponse"},"amountToSend":{"$ref":"#/components/schemas/QuoteAmounts"},"amountToReceive":{"$ref":"#/components/schemas/QuoteAmounts"}},"required":["netExchangeRate","fees","amountToSend","amountToReceive"],"type":"object"},"CryptoDepositInstructions":{"properties":{"type":{"type":"string","enum":["CRYPTO"],"nullable":false},"chain":{"type":"string"},"asset":{"type":"string"},"address":{"type":"string"},"memo":{"type":"string"},"amount":{"properties":{"value":{"type":"number","format":"double"},"currency":{"type":"string"}},"required":["value","currency"],"type":"object"}},"required":["type","chain","asset","address","memo","amount"],"type":"object","additionalProperties":false},"FiatDepositInstructions":{"properties":{"type":{"type":"string","enum":["FIAT"],"nullable":false},"method":{"type":"string"},"asset":{"type":"string"},"reference":{"type":"string"},"amount":{"properties":{"value":{"type":"number","format":"double"},"currency":{"type":"string"}},"required":["value","currency"],"type":"object"},"depositInstructions":{"properties":{"depositMessage":{"type":"string"},"bankBeneficiaryAddress":{"type":"string"},"bankBeneficiaryName":{"type":"string"},"bankAccountNumber":{"type":"string"},"bankRoutingNumber":{"type":"string"},"bankAddress":{"type":"string"},"bankName":{"type":"string"},"currency":{"type":"string"},"amount":{"type":"string"}},"required":["depositMessage","bankBeneficiaryAddress","bankBeneficiaryName","bankAccountNumber","bankRoutingNumber","bankAddress","bankName","currency","amount"],"type":"object"}},"required":["type","method","asset","reference","amount","depositInstructions"],"type":"object","additionalProperties":false},"DepositInstructions":{"anyOf":[{"$ref":"#/components/schemas/CryptoDepositInstructions"},{"$ref":"#/components/schemas/FiatDepositInstructions"}]},"RefundInstructions":{"properties":{"address":{"type":"string"},"memo":{"type":"string"}},"required":["address"],"type":"object","additionalProperties":false},"TransactionApiResponse":{"properties":{"id":{"type":"string"},"status":{"$ref":"#/components/schemas/TransactionStatusEnum"},"stellarTransactionId":{"type":"string"},"refundStellarTransactionId":{"type":"string"},"clientConfirmation":{"$ref":"#/components/schemas/ClientConfirmation"},"quote":{"properties":{"createdAt":{"type":"string"},"expiresAt":{"type":"string"},"result":{"properties":{"direct":{"$ref":"#/components/schemas/QuoteRailApiResponse"},"p2p":{"$ref":"#/components/schemas/QuoteRailApiResponse"}},"type":"object"},"paymentRailId":{"type":"string"},"fundingRailId":{"type":"string"},"receiverId":{"type":"string"},"senderId":{"type":"string"},"id":{"type":"string"}},"required":["createdAt","expiresAt","result","paymentRailId","fundingRailId","receiverId","senderId","id"],"type":"object"},"depositInstructions":{"$ref":"#/components/schemas/DepositInstructions"},"refundInstructions":{"$ref":"#/components/schemas/RefundInstructions"},"createdAt":{"type":"string"}},"required":["id","status","quote","depositInstructions","createdAt"],"type":"object","additionalProperties":false},"Paginated_TransactionApiResponse_":{"description":"Represents a paginated collection of items.","properties":{"items":{"items":{"$ref":"#/components/schemas/TransactionApiResponse"},"type":"array","description":"The items in the current page."},"startCursor":{"type":"string","description":"The cursor for the first item in the current page."},"endCursor":{"type":"string","description":"The cursor for the last item in the current page."}},"required":["items"],"type":"object","additionalProperties":false},"SortOrder":{"type":"string","enum":["asc","desc"]},"ListPaginatedEmbeddedTransactionsParams":{"properties":{"before":{"type":"string","description":"Gets results before the specified cursor."},"after":{"type":"string","description":"Gets results after the specified cursor."},"perPage":{"type":"integer","format":"int32","description":"The maximum number of items to fetch.","default":100,"minimum":10,"maximum":1000},"senderId":{"type":"string","description":"Filter transactions by sender id.","format":"uuid"},"order":{"$ref":"#/components/schemas/SortOrder","description":"Sort by transaction creation date."}},"type":"object","additionalProperties":false},"ExecutionChannel":{"type":"string","enum":["DIRECT_OFFRAMP","P2P_NETWORK"]},"CreateTransactionRequest":{"properties":{"quoteId":{"$ref":"#/components/schemas/Uuid","description":"The ID of the locked-in quote to use for this transaction.","format":"uuid"},"executionChannel":{"$ref":"#/components/schemas/ExecutionChannel","description":"The execution channel to use for this transaction."},"refundInstructions":{"properties":{"memo":{"type":"string","description":"Optional memo to attach to the refund (e.g. required by custodial destinations)."},"address":{"type":"string","description":"The destination address to refund to."}},"required":["address"],"type":"object","description":"Optional refund destination. When provided, if this transaction is refunded the\nfunds are sent to this address (and memo) instead of the original payment source."}},"required":["quoteId","executionChannel"],"type":"object","additionalProperties":false},"DocumentType":{"enum":["PASSPORT","NATIONAL_ID","DRIVER_LICENSE"],"type":"string","x-enum-varnames":["PASSPORT","NATIONAL_ID","DRIVER_LICENSE"]},"RiskRating":{"enum":["LOW","MEDIUM","HIGH"],"type":"string","x-enum-varnames":["LOW","MEDIUM","HIGH"]},"SenderApiResponse":{"properties":{"id":{"type":"string"},"externalSenderId":{"type":"string"},"partyType":{"type":"string","enum":["individual","business"]},"countryOfResidence":{"type":"string"},"status":{"type":"string"},"individual":{"properties":{"nationality":{"type":"string"},"nationalIdNumber":{"type":"string"},"dob":{"type":"string"},"middleName":{"type":"string"},"lastName":{"type":"string"},"firstName":{"type":"string"}},"required":["nationality","nationalIdNumber","dob","lastName","firstName"],"type":"object"},"contact":{"properties":{"phoneCountryCode":{"type":"string"},"phoneNumber":{"type":"string"},"email":{"type":"string"}},"required":["phoneCountryCode","phoneNumber","email"],"type":"object"},"address":{"properties":{"country":{"type":"string"},"postalCode":{"type":"string"},"region":{"type":"string"},"city":{"type":"string"},"line1":{"type":"string"}},"required":["country","postalCode","region","city","line1"],"type":"object"},"compliance":{"properties":{"sessionContext":{"properties":{"deviceId":{"type":"string"},"userAgent":{"type":"string"},"ipAddress":{"type":"string"}},"required":["deviceId","userAgent","ipAddress"],"type":"object"},"screening":{"properties":{"screenedAt":{"type":"string"},"riskRating":{"$ref":"#/components/schemas/RiskRating"},"adverseMediaHit":{"type":"boolean"},"pepHit":{"type":"boolean"},"sanctionsHit":{"type":"boolean"}},"required":["screenedAt","riskRating","adverseMediaHit","pepHit","sanctionsHit"],"type":"object"},"kycReliance":{"properties":{"provider":{"properties":{"result":{"type":"string"},"applicantId":{"type":"string"},"name":{"type":"string"}},"required":["result","applicantId","name"],"type":"object"},"documentType":{"$ref":"#/components/schemas/DocumentType"},"level":{"type":"string"},"performedAt":{"type":"string"},"status":{"type":"string"},"kycReferenceId":{"type":"string"},"performedBy":{"type":"string"}},"required":["provider","documentType","level","performedAt","status","kycReferenceId","performedBy"],"type":"object"}},"required":["sessionContext","screening","kycReliance"],"type":"object","nullable":true},"fundingRailInstances":{"items":{"properties":{"data":{"$ref":"#/components/schemas/Record_string.unknown_"},"type":{"type":"string","enum":["CRYPTO","FIAT"]},"railId":{"type":"string"}},"required":["data","type","railId"],"type":"object"},"type":"array"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","externalSenderId","partyType","countryOfResidence","status","individual","contact","address","compliance","fundingRailInstances","createdAt","updatedAt"],"type":"object","additionalProperties":false},"KycStatus":{"enum":["VERIFIED","PARTIALLY_VERIFIED","NOT_VERIFIED"],"type":"string","x-enum-varnames":["VERIFIED","PARTIALLY_VERIFIED","NOT_VERIFIED"]},"KycLevel":{"enum":["BASIC","FULL"],"type":"string","x-enum-varnames":["BASIC","FULL"]},"ProviderResult":{"enum":["GREEN","AMBER","RED"],"type":"string","x-enum-varnames":["GREEN","AMBER","RED"]},"CreateSenderKycReliance":{"description":"KYC reliance information from the partner's KYC provider.","properties":{"performedBy":{"type":"string"},"kycReferenceId":{"type":"string"},"status":{"$ref":"#/components/schemas/KycStatus"},"performedAt":{"type":"string"},"level":{"$ref":"#/components/schemas/KycLevel"},"documentType":{"$ref":"#/components/schemas/DocumentType"},"provider":{"properties":{"result":{"$ref":"#/components/schemas/ProviderResult"},"applicantId":{"type":"string"},"name":{"type":"string"}},"required":["result","applicantId","name"],"type":"object"}},"required":["performedBy","kycReferenceId","status","performedAt","level","documentType","provider"],"type":"object","additionalProperties":false},"Screening":{"properties":{"sanctionsHit":{"type":"boolean","description":"true = a sanctions match was found during partner screening.\nfalse = the user was screened and no sanctions match was found."},"pepHit":{"type":"boolean","description":"true = a PEP match was found during partner screening.\nfalse = the user was screened and no PEP match was found."},"adverseMediaHit":{"type":"boolean","description":"true = an adverse media match was found during partner screening.\nfalse = the user was screened and no adverse media match was found."},"riskRating":{"$ref":"#/components/schemas/RiskRating"},"screenedAt":{"type":"string"}},"required":["sanctionsHit","pepHit","adverseMediaHit","riskRating","screenedAt"],"type":"object","additionalProperties":false},"SessionContext":{"properties":{"ipAddress":{"type":"string"},"userAgent":{"type":"string"},"deviceId":{"type":"string"}},"required":["ipAddress","userAgent","deviceId"],"type":"object","additionalProperties":false},"CreateSenderCompliance":{"properties":{"kycReliance":{"$ref":"#/components/schemas/CreateSenderKycReliance"},"screening":{"$ref":"#/components/schemas/Screening"},"sessionContext":{"$ref":"#/components/schemas/SessionContext"}},"required":["kycReliance","screening","sessionContext"],"type":"object","additionalProperties":false},"FundingRailId":{"enum":["stellar.usdc"],"type":"string","x-enum-varnames":["STELLAR_USDC"]},"CreateSenderIndividual":{"description":"Individual party details. Required when partyType is 'individual'.","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"middleName":{"type":"string"},"dob":{"type":"string"},"nationalIdNumber":{"type":"string"},"nationality":{"type":"string"}},"required":["firstName","lastName","dob","nationalIdNumber","nationality"],"type":"object","additionalProperties":false},"CreateSenderContact":{"description":"Contact information for the sender.","properties":{"email":{"type":"string","pattern":"^(.+)@(.+)$"},"phoneNumber":{"type":"string"},"phoneCountryCode":{"type":"string","pattern":"^\\+\\d{1,3}$"}},"required":["email","phoneNumber","phoneCountryCode"],"type":"object","additionalProperties":false},"CreateSenderAddress":{"description":"Address information for the sender.","properties":{"line1":{"type":"string"},"city":{"type":"string"},"region":{"type":"string","description":"State/region of the address.\n\nWhen `country` is `COL` (Colombia), this must be one of the Colombian\ndepartment `stateId` codes:\n\n- `AMA` — Amazonas\n- `ANT` — Antioquia\n- `ARA` — Arauca\n- `ATL` — Atlántico\n- `BOL` — Bolívar\n- `BOY` — Boyacá\n- `CAL` — Caldas\n- `CAQ` — Caquetá\n- `CAS` — Casanare\n- `CAU` — Cauca\n- `CES` — Cesar\n- `CHO` — Chocó\n- `COR` — Córdoba\n- `CUN` — Cundinamarca\n- `DC` — Distrito Capital\n- `GUA` — Guainía\n- `GUV` — Guaviare\n- `HUI` — Huila\n- `LAG` — La Guajira\n- `MAG` — Magdalena\n- `MET` — Meta\n- `NAR` — Nariño\n- `NSA` — Norte de Santander\n- `PUT` — Putumayo\n- `QUI` — Quindío\n- `RIS` — Risaralda\n- `SAP` — San Andrés\n- `SAN` — Santander\n- `SUC` — Sucre\n- `TOL` — Tolima\n- `VAC` — Valle\n- `VAU` — Vaupés\n- `VID` — Vichada"},"postalCode":{"type":"string"},"country":{"type":"string","description":"Country code 3 letter ISO code.","minLength":3,"maxLength":3}},"required":["line1","city","region","postalCode","country"],"type":"object","additionalProperties":false},"CreateSenderRequest":{"description":"Request body for `POST /embedded/senders` (Reliance KYC mode).","properties":{"externalSenderId":{"type":"string","description":"The unique identifier for this sender in the partner's system."},"partyType":{"type":"string","enum":["individual","business"],"description":"The type of party: individual or business.","pattern":"^(individual|business)$"},"countryOfResidence":{"type":"string","description":"Country code 3 letter ISO code.","minLength":3,"maxLength":3},"enabledFundingRailIds":{"items":{"$ref":"#/components/schemas/FundingRailId"},"type":"array","description":"List of funding rail IDs to enable for this sender.","default":[]},"individual":{"$ref":"#/components/schemas/CreateSenderIndividual","description":"Individual party details. Required when partyType is 'individual'."},"contact":{"$ref":"#/components/schemas/CreateSenderContact","description":"Contact information."},"address":{"$ref":"#/components/schemas/CreateSenderAddress","description":"Address information."},"compliance":{"$ref":"#/components/schemas/CreateSenderCompliance","description":"KYC reliance reference, screening results and session context from the\npartner's own KYC process."}},"required":["externalSenderId","partyType","countryOfResidence","individual","contact","address","compliance"],"type":"object","additionalProperties":false},"GetSenderByExternalIdQuery":{"properties":{"externalSenderId":{"type":"string","description":"The external sender identifier provided by the partner."}},"required":["externalSenderId"],"type":"object","additionalProperties":false},"Partial_CreateSenderIndividual_":{"properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"middleName":{"type":"string"},"dob":{"type":"string"},"nationalIdNumber":{"type":"string"},"nationality":{"type":"string"}},"type":"object","description":"Make all properties in T optional"},"Partial_UpdateSenderContact_":{"properties":{"phoneNumber":{"type":"string"},"phoneCountryCode":{"type":"string","pattern":"^\\+\\d{1,3}$"}},"type":"object","description":"Make all properties in T optional"},"Partial_CreateSenderAddress_":{"properties":{"line1":{"type":"string"},"city":{"type":"string"},"region":{"type":"string","description":"State/region of the address.\n\nWhen `country` is `COL` (Colombia), this must be one of the Colombian\ndepartment `stateId` codes:\n\n- `AMA` — Amazonas\n- `ANT` — Antioquia\n- `ARA` — Arauca\n- `ATL` — Atlántico\n- `BOL` — Bolívar\n- `BOY` — Boyacá\n- `CAL` — Caldas\n- `CAQ` — Caquetá\n- `CAS` — Casanare\n- `CAU` — Cauca\n- `CES` — Cesar\n- `CHO` — Chocó\n- `COR` — Córdoba\n- `CUN` — Cundinamarca\n- `DC` — Distrito Capital\n- `GUA` — Guainía\n- `GUV` — Guaviare\n- `HUI` — Huila\n- `LAG` — La Guajira\n- `MAG` — Magdalena\n- `MET` — Meta\n- `NAR` — Nariño\n- `NSA` — Norte de Santander\n- `PUT` — Putumayo\n- `QUI` — Quindío\n- `RIS` — Risaralda\n- `SAP` — San Andrés\n- `SAN` — Santander\n- `SUC` — Sucre\n- `TOL` — Tolima\n- `VAC` — Valle\n- `VAU` — Vaupés\n- `VID` — Vichada"},"postalCode":{"type":"string"},"country":{"type":"string","description":"Country code 3 letter ISO code.","minLength":3,"maxLength":3}},"type":"object","description":"Make all properties in T optional"},"Partial_CreateSenderCompliance_":{"properties":{"kycReliance":{"$ref":"#/components/schemas/CreateSenderKycReliance"},"screening":{"$ref":"#/components/schemas/Screening"},"sessionContext":{"$ref":"#/components/schemas/SessionContext"}},"type":"object","description":"Make all properties in T optional"},"UpdateSenderRequest":{"properties":{"partyType":{"type":"string","enum":["individual","business"],"description":"The type of party: individual or business.","pattern":"^(individual|business)$"},"countryOfResidence":{"type":"string","description":"Country code 3 letter ISO code.","minLength":3,"maxLength":3},"enabledFundingRailIds":{"items":{"type":"string"},"type":"array","description":"List of funding rail IDs to enable for this sender."},"individual":{"$ref":"#/components/schemas/Partial_CreateSenderIndividual_","description":"Individual party details (all fields optional for partial update)."},"contact":{"$ref":"#/components/schemas/Partial_UpdateSenderContact_","description":"Contact information (phone can be updated; email is immutable)."},"address":{"$ref":"#/components/schemas/Partial_CreateSenderAddress_","description":"Address information (all fields optional for partial update)."},"compliance":{"$ref":"#/components/schemas/Partial_CreateSenderCompliance_","description":"Compliance and KYC reliance information (partial update)."}},"type":"object","additionalProperties":false},"CreateSenderKycMetadata":{"description":"KYC metadata for Airtm (Persona) KYC, sent inside the `data` part.","properties":{"govIdCountryCode":{"type":"string","description":"ISO 3166-1 alpha-3 code of the country that issued the government ID.","minLength":3,"maxLength":3},"birthCountryCode":{"type":"string","description":"ISO 3166-1 alpha-3 code of the sender's country of birth.","minLength":3,"maxLength":3},"govIdIdentificationNumber":{"type":"string"},"govIdDocumentNumber":{"type":"string"},"databaseIdentificationNumber":{"type":"string"}},"required":["govIdCountryCode","birthCountryCode"],"type":"object","additionalProperties":false},"CreateSenderWithKycData":{"description":"Sender details sent as the JSON-encoded `data` part of\n`POST /embedded/senders-with-kyc`.","properties":{"externalSenderId":{"type":"string","description":"The unique identifier for this sender in the partner's system."},"partyType":{"type":"string","enum":["individual","business"],"description":"The type of party: individual or business.","pattern":"^(individual|business)$"},"countryOfResidence":{"type":"string","description":"Country code 3 letter ISO code.","minLength":3,"maxLength":3},"enabledFundingRailIds":{"items":{"$ref":"#/components/schemas/FundingRailId"},"type":"array","description":"List of funding rail IDs to enable for this sender.","default":[]},"individual":{"$ref":"#/components/schemas/CreateSenderIndividual","description":"Individual party details. Required when partyType is 'individual'."},"contact":{"$ref":"#/components/schemas/CreateSenderContact","description":"Contact information."},"address":{"$ref":"#/components/schemas/CreateSenderAddress","description":"Address information."},"kyc":{"$ref":"#/components/schemas/CreateSenderKycMetadata","description":"KYC metadata. Photos are sent as separate file parts."}},"required":["externalSenderId","partyType","countryOfResidence","individual","contact","address","kyc"],"type":"object","additionalProperties":false},"CreateSenderWithKycRequest":{"description":"`multipart/form-data` body for `POST /embedded/senders-with-kyc` (Persona KYC mode).\nPhotos are raw binary file parts; do not base64-encode them.","properties":{"data":{"$ref":"#/components/schemas/CreateSenderWithKycData","description":"JSON-encoded sender details, including the `kyc` metadata."},"govIdFrontPhoto1":{"type":"string","description":"Front of the primary government ID.","format":"binary"},"govIdBackPhoto1":{"type":"string","description":"Back of the primary government ID. Required except for passports.","format":"binary"},"govIdFrontPhoto2":{"type":"string","description":"Front of a secondary government ID.","format":"binary"},"govIdBackPhoto2":{"type":"string","description":"Back of a secondary government ID.","format":"binary"},"selfieCenterPhoto":{"type":"string","description":"Selfie looking straight ahead.","format":"binary"},"selfieLeftPhoto":{"type":"string","description":"Selfie looking left.","format":"binary"},"selfieRightPhoto":{"type":"string","description":"Selfie looking right.","format":"binary"},"documentResidentPermit":{"type":"string","description":"Resident permit document.","format":"binary"},"documentPoa":{"type":"string","description":"Proof of address.","format":"binary"},"documentPoaCuba1":{"type":"string","description":"Cuba-specific proof of address (page 1).","format":"binary"},"documentPoaCuba2":{"type":"string","description":"Cuba-specific proof of address (page 2).","format":"binary"}},"required":["data","govIdFrontPhoto1","selfieCenterPhoto","selfieLeftPhoto","selfieRightPhoto"],"type":"object","additionalProperties":false},"ReceiverApiResponse":{"properties":{"id":{"type":"string"},"externalReceiverId":{"type":"string"},"partyType":{"type":"string","enum":["individual","business"]},"country":{"type":"string"},"individual":{"properties":{"nationalIdNumber":{"type":"string"},"dob":{"type":"string"},"lastName":{"type":"string"},"firstName":{"type":"string"}},"required":["nationalIdNumber","dob","lastName","firstName"],"type":"object"},"contact":{"properties":{"phone":{"type":"string"},"email":{"type":"string"}},"type":"object"},"address":{"properties":{"country":{"type":"string"},"postalCode":{"type":"string"},"region":{"type":"string"},"city":{"type":"string"},"line1":{"type":"string"}},"type":"object"},"compliance":{"properties":{"kycReliance":{"properties":{"provider":{"properties":{"result":{"$ref":"#/components/schemas/ProviderResult"},"applicantId":{"type":"string"},"name":{"type":"string"}},"required":["result","applicantId","name"],"type":"object"},"documentType":{"$ref":"#/components/schemas/DocumentType"},"level":{"$ref":"#/components/schemas/KycLevel"},"performedAt":{"type":"string"},"status":{"$ref":"#/components/schemas/KycStatus"},"kycReferenceId":{"type":"string"},"performedBy":{"type":"string"}},"required":["provider","documentType","level","performedAt","status","kycReferenceId","performedBy"],"type":"object"}},"required":["kycReliance"],"type":"object"},"payoutDestinations":{"items":{"properties":{"destination":{"$ref":"#/components/schemas/Record_string.unknown_"},"paymentRailId":{"type":"string"},"id":{"type":"string"}},"required":["destination","paymentRailId","id"],"type":"object"},"type":"array"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","externalReceiverId","partyType","country","individual","contact","address","payoutDestinations","createdAt","updatedAt"],"type":"object","additionalProperties":false},"CreateReceiverPayoutDestination":{"description":"Payout destination: a payment rail plus rail-specific destination data.","properties":{"paymentRailId":{"type":"string","description":"Payment rail identifier (e.g. airtm:bank:venezuela:mercantil).\nThis refers to the ID of the payment rail in the catalog.\nRefer to [Catalog](#tag/embedded-catalog) section for more information."},"destination":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Rail-specific destination data (e.g. accountNumber, bankCode, accountHolderName).\nThe object to send must match the requirements of the payment rail in the catalog item's `destinationFields`.\nRefer to [Catalog](#tag/embedded-catalog) section for more information."},"senderId":{"$ref":"#/components/schemas/Uuid","description":"The sender id that will use this receiver payment instance."}},"required":["paymentRailId","destination","senderId"],"type":"object","additionalProperties":false},"CreateReceiverIndividual":{"description":"Individual party details. Required when partyType is 'individual'.","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"dob":{"type":"string"},"nationalIdNumber":{"type":"string"}},"required":["firstName","lastName","dob","nationalIdNumber"],"type":"object","additionalProperties":false},"CreateReceiverContact":{"description":"Contact information for the receiver.","properties":{"email":{"type":"string","pattern":"^(.+)@(.+)$"},"phone":{"type":"string","pattern":"^\\+[0-9]{1,3}[0-9]{6,}$"}},"type":"object","additionalProperties":false},"CreateReceiverAddress":{"description":"Address information for the receiver.","properties":{"line1":{"type":"string"},"city":{"type":"string"},"region":{"type":"string"},"postalCode":{"type":"string"},"country":{"type":"string","description":"Country code 3 letter ISO code.","minLength":3,"maxLength":3}},"type":"object","additionalProperties":false},"CreateReceiverKycReliance":{"description":"KYC reliance information from the partner's KYC provider.","properties":{"performedBy":{"type":"string"},"kycReferenceId":{"type":"string"},"status":{"$ref":"#/components/schemas/KycStatus"},"performedAt":{"type":"string"},"level":{"$ref":"#/components/schemas/KycLevel"},"documentType":{"$ref":"#/components/schemas/DocumentType"},"provider":{"properties":{"result":{"$ref":"#/components/schemas/ProviderResult"},"applicantId":{"type":"string"},"name":{"type":"string"}},"required":["result","applicantId","name"],"type":"object"}},"required":["performedBy","kycReferenceId","status","performedAt","level","documentType","provider"],"type":"object","additionalProperties":false},"CreateReceiverCompliance":{"properties":{"kycReliance":{"$ref":"#/components/schemas/CreateReceiverKycReliance"}},"required":["kycReliance"],"type":"object","additionalProperties":false},"CreateReceiverRequest":{"properties":{"externalReceiverId":{"type":"string","description":"The unique identifier for this receiver in the partner's system."},"partyType":{"type":"string","enum":["individual","business"],"description":"The type of party: individual or business.","pattern":"^(individual|business)$"},"country":{"type":"string","description":"Country code 3 letter ISO code.","minLength":3,"maxLength":3},"payoutDestinations":{"items":{"$ref":"#/components/schemas/CreateReceiverPayoutDestination"},"type":"array","description":"Payment rail instance information (bank destination details). And the sender id that will use this payment rail instance. Object example:\n`{\n \"paymentRailId\": \"airtm:bank:venezuela:mercantil\",\n \"destination\": {\n   \"accountNumber\": \"01719987567890123499\",\n   \"accountHolderName\": \"Jane Doe\"\n },\n \"senderId\": \"123e4567-e89b-12d3-a456-426614174000\"\n}`","default":[]},"individual":{"$ref":"#/components/schemas/CreateReceiverIndividual","description":"Individual party details. Required when partyType is 'individual'."},"contact":{"$ref":"#/components/schemas/CreateReceiverContact","description":"Contact information."},"address":{"$ref":"#/components/schemas/CreateReceiverAddress","description":"Address information."},"compliance":{"$ref":"#/components/schemas/CreateReceiverCompliance","description":"Compliance and KYC reliance information. Optional for receivers."}},"required":["externalReceiverId","partyType","country","individual"],"type":"object","additionalProperties":false},"GetReceiverByExternalIdQuery":{"properties":{"externalReceiverId":{"type":"string","description":"The external receiver identifier provided by the partner."}},"required":["externalReceiverId"],"type":"object","additionalProperties":false},"Partial_CreateReceiverIndividual_":{"properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"dob":{"type":"string"},"nationalIdNumber":{"type":"string"}},"type":"object","description":"Make all properties in T optional"},"Partial_CreateReceiverContact_":{"properties":{"email":{"type":"string","pattern":"^(.+)@(.+)$"},"phone":{"type":"string","pattern":"^\\+[0-9]{1,3}[0-9]{6,}$"}},"type":"object","description":"Make all properties in T optional"},"Partial_CreateReceiverAddress_":{"properties":{"line1":{"type":"string"},"city":{"type":"string"},"region":{"type":"string"},"postalCode":{"type":"string"},"country":{"type":"string","description":"Country code 3 letter ISO code.","minLength":3,"maxLength":3}},"type":"object","description":"Make all properties in T optional"},"Partial_CreateReceiverCompliance_":{"properties":{"kycReliance":{"$ref":"#/components/schemas/CreateReceiverKycReliance"}},"type":"object","description":"Make all properties in T optional"},"UpdateReceiverRequest":{"properties":{"partyType":{"type":"string","enum":["individual","business"],"description":"The type of party: individual or business.","pattern":"^(individual|business)$"},"country":{"type":"string","description":"Country code 3 letter ISO code.","minLength":3,"maxLength":3},"individual":{"$ref":"#/components/schemas/Partial_CreateReceiverIndividual_","description":"Individual party details (partial update)."},"contact":{"$ref":"#/components/schemas/Partial_CreateReceiverContact_","description":"Contact information (partial update)."},"address":{"$ref":"#/components/schemas/Partial_CreateReceiverAddress_","description":"Address information (partial update)."},"compliance":{"$ref":"#/components/schemas/Partial_CreateReceiverCompliance_","description":"Compliance and KYC reliance information (partial update)."}},"type":"object","additionalProperties":false},"PaymentRailInstanceApiResponse":{"properties":{"id":{"type":"string"},"paymentRailId":{"type":"string"},"destination":{"$ref":"#/components/schemas/Record_string.unknown_"},"senderId":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","paymentRailId","destination","senderId","createdAt","updatedAt"],"type":"object","additionalProperties":false},"AddPaymentRailInstanceRequest":{"description":"Request body for adding a payment rail instance to a receiver.","properties":{"paymentRailId":{"type":"string","description":"Payment rail identifier (e.g. airtm:bank:venezuela:mercantil).\nThis refers to the ID of the payment rail in the catalog.\nRefer to [Catalog](#tag/embedded-catalog) section for more information."},"destination":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Rail-specific destination data (e.g. accountNumber, bankCode, accountHolderName).\nThe object to send must match the requirements of the payment rail in the catalog item's `destinationFields`.\nRefer to [Catalog](#tag/embedded-catalog) section for more information."},"senderId":{"$ref":"#/components/schemas/Uuid","description":"The sender id that will use this payment rail instance."}},"required":["paymentRailId","destination","senderId"],"type":"object","additionalProperties":false},"QuoteApiResponse":{"properties":{"id":{"type":"string"},"senderId":{"type":"string"},"receiverId":{"type":"string"},"fundingRailId":{"type":"string"},"paymentRailId":{"type":"string"},"request":{"properties":{"amountToReceive":{"type":"number","format":"double"},"amountToSend":{"type":"number","format":"double"}},"type":"object"},"result":{"properties":{"direct":{"$ref":"#/components/schemas/QuoteRailApiResponse"},"p2p":{"$ref":"#/components/schemas/QuoteRailApiResponse"}},"type":"object"},"expiresAt":{"type":"string"},"createdAt":{"type":"string"}},"required":["id","senderId","receiverId","fundingRailId","paymentRailId","request","result","expiresAt","createdAt"],"type":"object","additionalProperties":false},"CreateQuoteRequest":{"properties":{"senderId":{"$ref":"#/components/schemas/Uuid","description":"The sender id.","format":"uuid"},"receiverId":{"$ref":"#/components/schemas/Uuid","description":"The receiver id.","format":"uuid"},"fundingRailId":{"$ref":"#/components/schemas/FundingRailId","description":"Id of any supported funding rails. Today only \"stellar.usdc\" is supported. More to come later."},"paymentRailId":{"type":"string","description":"Payment rail identifier configured for the receiver. This refers to the ID of the payment rail in the catalog.\nExample: airtm:bank:venezuela:mercantil\nRefer to [Catalog](#tag/embedded-catalog) section for more information."},"payoutDestinationId":{"$ref":"#/components/schemas/Uuid","description":"The payout destination id. In case the receiver has multiple payout destinations for the same payment rail, this can be used to specify the desired payout destination.\nExample:\n- receiver has 2 payout destinations for the same payment rail:\n  - payout destination 1 => id: 123, paymentRailId: airtm:bank:venezuela:mercantil, destination: { bankAccountNumber: '1234567890' }\n  - payout destination 2 => id: 456, paymentRailId: airtm:bank:venezuela:mercantil, destination: { bankAccountNumber: '0987654321' }\n- user wants to send to payout destination 2\n- payoutDestinationId = 2","format":"uuid"},"amountToSend":{"type":"number","format":"double","description":"Amount to send in the funding rail asset (USDC).\nExactly one of amountToSend or amountToReceive must be provided.","minimum":1},"amountToReceive":{"type":"number","format":"double","description":"Amount to receive in the destination currency.\nExactly one of amountToSend or amountToReceive must be provided.","minimum":1},"partnerFee":{"type":"number","format":"double","description":"Fixed partner fee amount. Currently expected to be 0.00."}},"required":["senderId","receiverId","fundingRailId","paymentRailId"],"type":"object","additionalProperties":false},"DestinationFieldDescriptor":{"properties":{"required":{"type":"boolean"},"pattern":{"type":"string"},"title":{"type":"string"},"options":{"items":{"type":"string"},"type":"array"},"type":{"type":"string"}},"required":["required"],"type":"object","description":"One field in a payout destination form, derived from Vivillon version schema.properties."},"Record_string.DestinationFieldDescriptor_":{"properties":{},"additionalProperties":{"$ref":"#/components/schemas/DestinationFieldDescriptor"},"type":"object","description":"Construct a type with a set of properties K of type T"},"EmbeddedCatalogRailItem":{"description":"Payment rail row returned for the embedded payments catalog API (public fields only).","properties":{"id":{"type":"string","description":"Payment rail identifier (e.g. airtm:bank:venezuela:mercantil)."},"currency":{"type":"string"},"country":{"type":"string"},"destinationType":{"type":"string"},"destinationFields":{"$ref":"#/components/schemas/Record_string.DestinationFieldDescriptor_","description":"Field definitions for the payout destination form, from Vivillon latest version schema."},"minimumAmount":{"type":"number","format":"double","description":"Minimum amount supported by this payment rail."},"maximumAmount":{"type":"number","format":"double","description":"Maximum amount supported by this payment rail."}},"required":["id","currency","country","destinationType","destinationFields","minimumAmount","maximumAmount"],"type":"object","additionalProperties":false},"Paginated_EmbeddedCatalogRailItem_":{"description":"Represents a paginated collection of items.","properties":{"items":{"items":{"$ref":"#/components/schemas/EmbeddedCatalogRailItem"},"type":"array","description":"The items in the current page."},"startCursor":{"type":"string","description":"The cursor for the first item in the current page."},"endCursor":{"type":"string","description":"The cursor for the last item in the current page."}},"required":["items"],"type":"object","additionalProperties":false},"ListPaginatedEmbeddedCatalogParams":{"properties":{"country":{"type":"string","description":"Country code 3 letter ISO code.","minLength":3,"maxLength":3},"currency":{"type":"string"},"perPage":{"type":"integer","format":"int32","description":"The maximum number of items to fetch.","default":10,"minimum":2,"maximum":20},"before":{"type":"string","description":"Gets results before the specified cursor."},"after":{"type":"string","description":"Gets results after the specified cursor."}},"type":"object","additionalProperties":false},"Record_string.string_":{"properties":{},"additionalProperties":{"type":"string"},"type":"object","description":"Construct a type with a set of properties K of type T"},"BridgeDeposit":{"properties":{"refundedPayoutId":{"type":"string"},"metadata":{"$ref":"#/components/schemas/Record_string.string_"},"updatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"name":{"type":"string"},"enterpriseUserId":{"type":"string"},"type":{"type":"string","enum":["funding","refunded","transfer","withdrawal"]},"currency":{"type":"string"},"availableBalance":{"type":"number","format":"double"},"amount":{"type":"number","format":"double"},"bridgeTransactionId":{"type":"string"},"id":{"type":"string"}},"required":["updatedAt","createdAt","name","enterpriseUserId","type","currency","availableBalance","amount","bridgeTransactionId","id"],"type":"object"},"Paginated_BridgeDeposit_":{"description":"Represents a paginated collection of items.","properties":{"items":{"items":{"$ref":"#/components/schemas/BridgeDeposit"},"type":"array","description":"The items in the current page."},"startCursor":{"type":"string","description":"The cursor for the first item in the current page."},"endCursor":{"type":"string","description":"The cursor for the last item in the current page."}},"required":["items"],"type":"object","additionalProperties":false},"PaginationParams":{"description":"Pagination parameters for fetching paginated data.","properties":{"before":{"type":"string","description":"Gets results before the specified cursor."},"after":{"type":"string","description":"Gets results after the specified cursor."},"perPage":{"type":"integer","format":"int32","description":"The maximum number of items to fetch.","default":100,"minimum":10,"maximum":1000}},"type":"object","additionalProperties":false},"BulkPayoutStatus":{"description":"The current status of the bulk payout\n\n- `PENDING`: The bulk payout was received, but it has yet to be started\n- `IN_PROGRESS`: Our system is currently processing all the individual payouts contained in this bulk payout.\n- `COMPLETED`: This doesn't mean all payouts were completed successfully, it may have guest or failed items. It means only that the processing, validations and creation of operations related to that task is completed.\n- `REJECTED`: The enterprise rejected the bulk payout\n- `UNCOMPLETED`: Reserved for future use","enum":["PENDING","IN_PROGRESS","UNCOMPLETED","COMPLETED","REJECTED"],"type":"string","x-enum-varnames":["PENDING","IN_PROGRESS","UNCOMPLETED","COMPLETED","REJECTED"]},"BulkPayout":{"properties":{"updatedAt":{"type":"string","format":"date-time","description":"Timestamp of the last update made to the payout."},"executionDate":{"type":"string","format":"date-time","description":"Timestamp of when the payout was executed."},"createdAt":{"type":"string","format":"date-time","description":"Timestamp of when the payout was created."},"paidAmount":{"type":"number","format":"double","description":"Aggregated amount of all individual payouts in this bulk that were paid","example":24},"totalAmount":{"type":"number","format":"double","description":"Aggregated amount of all individual payouts in this bulk","example":1234.56},"total":{"type":"number","format":"double","description":"Number of individual payouts in this bulk","example":24},"status":{"$ref":"#/components/schemas/BulkPayoutStatus"},"originalFileName":{"type":"string","description":"The name of the file if the bulk payout was created uploading a CSV"},"enterpriseUserId":{"type":"string","description":"Unique identifier of the enterprise who created this bulk payout","format":"uuid"},"id":{"type":"string","description":"Unique identifier","format":"uuid"}},"required":["updatedAt","createdAt","paidAmount","totalAmount","total","status","enterpriseUserId","id"],"type":"object"},"Pick_CreatePayoutRequest.Exclude_keyofCreatePayoutRequest.commit__":{"properties":{"airtmUserEmail":{"type":"string","description":"The recipient's email address that is associated with their Airtm account"},"amount":{"type":"number","format":"double","description":"The payment amount in USD.","minimum":0.01},"code":{"type":"string","description":"A unique code used to identify the payout.\nPopulate this value with the identifier on your system.\n\n> [!important]\n> It must be unique across all existing payouts."},"enterpriseFee":{"type":"number","format":"double","description":"The enterprise fee to apply to the payout","minimum":0},"notes":{"type":"string","description":"An arbitrary string describing the payment.\nThis information is displayed to the recipient.\nIt's recommended that the string summarizes the purpose of the payment."},"internalNote":{"type":"string","description":"The description of the payout; visible to internal users"},"requireIdVerified":{"type":"boolean","description":"Set this to true to require that the recipient is ID-verified","default":false}},"required":["airtmUserEmail","amount","notes"],"type":"object","description":"From T, pick a set of properties whose keys are in the union K"},"Omit_CreatePayoutRequest.commit_":{"$ref":"#/components/schemas/Pick_CreatePayoutRequest.Exclude_keyofCreatePayoutRequest.commit__","description":"Construct a type with the properties of T except for those in type K."},"CreateBulkPayoutRequest":{"properties":{"payouts":{"items":{"$ref":"#/components/schemas/Omit_CreatePayoutRequest.commit_"},"type":"array","description":"A list of individual payouts to process in bulk"}},"required":["payouts"],"type":"object","additionalProperties":false},"Paginated_BulkPayout_":{"description":"Represents a paginated collection of items.","properties":{"items":{"items":{"$ref":"#/components/schemas/BulkPayout"},"type":"array","description":"The items in the current page."},"startCursor":{"type":"string","description":"The cursor for the first item in the current page."},"endCursor":{"type":"string","description":"The cursor for the last item in the current page."}},"required":["items"],"type":"object","additionalProperties":false},"ListPaginatedBulkPayoutsParams":{"properties":{"before":{"type":"string","description":"Gets results before the specified cursor."},"after":{"type":"string","description":"Gets results after the specified cursor."},"perPage":{"type":"integer","format":"int32","description":"The maximum number of items to fetch.","default":100,"minimum":10,"maximum":1000},"status":{"$ref":"#/components/schemas/BulkPayoutStatus"}},"type":"object","additionalProperties":false},"ApiKey":{"properties":{"deletedAt":{"type":"string"},"createdAt":{"type":"string"},"allowedIps":{"items":{"properties":{"label":{"type":"string"},"ip":{"type":"string"}},"required":["ip"],"type":"object"},"type":"array"},"enterpriseId":{"type":"string"},"id":{"type":"string"}},"required":["createdAt","enterpriseId","id"],"type":"object"},"Paginated_ApiKey_":{"description":"Represents a paginated collection of items.","properties":{"items":{"items":{"$ref":"#/components/schemas/ApiKey"},"type":"array","description":"The items in the current page."},"startCursor":{"type":"string","description":"The cursor for the first item in the current page."},"endCursor":{"type":"string","description":"The cursor for the last item in the current page."}},"required":["items"],"type":"object","additionalProperties":false},"ListApiKeysPaginatedParams":{"properties":{"before":{"type":"string","description":"Gets results before the specified cursor."},"after":{"type":"string","description":"Gets results after the specified cursor."},"perPage":{"type":"integer","format":"int32","description":"The maximum number of items to fetch.","default":100,"minimum":10,"maximum":1000}},"type":"object","additionalProperties":false},"IpItem":{"properties":{"ip":{"type":"string"},"label":{"type":"string"}},"required":["ip"],"type":"object","additionalProperties":false}},"securitySchemes":{"basicAuth":{"type":"http","scheme":"basic"}}},"info":{"title":"Airtm Enterprise API V2","version":"3.8.0","description":"# Introduction\n\nThe Airtm Enterprise API enables organizations to send and receive payments globally through a simple REST API.\n\n## What You Can Do\n\n- **Send Payouts**: Pay employees, contractors, and partners in [190+ countries](https://help.airtm.com/en/support/solutions/articles/47001177565-where-are-airtm-s-products-and-services-available-)\n- **Collect Payments**: Accept payments from users worldwide\n- **Generate Reports**: Download transaction data and audit reports\n- **Process in Bulk**: Handle thousands of payments efficiently\n\n## Getting Started\n\n### 1. Get API Credentials\n\n[Sign up](https://airtm-product.typeform.com/to/ggXbsJpl?typeform-source=api-docs) for an Enterprise account\n\n### 2. Generate API Keys\n\nCreate keys in your [account settings](https://enterprise.airtm.com/settings)\n\n### 3. Test Your Setup\n\nMake your first API call to verify connectivity\n\n```bash\ncurl \"https://api.enterprise.airtm.com/v2/me\" \\\n  -u \"your_api_key:your_secret_key\"\n```\n\n## Environments\n\n### Sandbox\n\nTesting with fake money\n\nURL: `https://api.stg.enterprise.airtm.com`\n\n### Production\n\nLive transactions\n\nURL: `https://api.enterprise.airtm.com`\n\n## Rate Limits\n\n- **10 requests per second** per API key\n- HTTP 429 response when exceeded\n- Contact support for higher limits\n\n## Security\n\n- Use HTTPS for all requests\n- Store credentials securely (never in client code)\n- Separate sandbox and production keys\n\n## Need Help?\n\n- **Technical Support**: [enterprise@airtm.com](mailto:enterprise@airtm.com)\n- **API Updates**: Follow our [Changelog](#description/changelog)\n- **Error Reference**: Check [Reason Codes](#description/reason-codes)\n\n\n---\n\n# Authentication\n\nThe Airtm Enterprise API uses HTTP Basic Authentication for all requests.\n\n## How It Works\n\nEvery API call must include an `Authorization` header with your API credentials:\n\n```text\nAuthorization: Basic <base64-encoded-credentials>\n```\n\n## Getting Your API Keys\n\n1. Log into your [dashboard](https://enterprise.airtm.com)\n2. Go to **Settings** → **API Keys**\n3. Click **Generate New API Key**\n4. Save both the API Key and Secret Key securely\n\n> **⚠️ Important**: Your Secret Key is only shown once. Store it immediately.\n\n## Setting Up Authentication\n\n### Step 1: Combine Your Credentials\n\nFormat: `api_key:secret_key`\n\nExample: `your_api_key:your_secret_key`\n\n### Step 2: Base64 Encode\n\nUse any base64 encoder or command line:\n\n```bash\necho -n \"your_api_key:your_secret_key\" | base64\n```\n\n### Step 3: Add to Request Header\n\n```text\nAuthorization: Basic <base64_encoded_credentials>\n```\n\n## Code Examples\n\n### cURL\n\n```bash\ncurl -X GET \"https://api.enterprise.airtm.com/v2/me\" \\\n  -u \"your_api_key:your_secret_key\"\n```\n\n### JavaScript\n\n```javascript\nconst response = await fetch('https://api.enterprise.airtm.com/v2/me', {\n  headers: {\n    Authorization: 'Basic ' + btoa('your_api_key:your_secret_key'),\n  },\n});\n```\n\n### Python\n\n```python\nimport requests\nfrom requests.auth import HTTPBasicAuth\n\nresponse = requests.get(\n    'https://api.enterprise.airtm.com/v2/me',\n    auth=HTTPBasicAuth('your_api_key', 'your_secret_key')\n)\n```\n\n## Security Best Practices\n\n- **Store securely**: Use environment variables\n- **Server-side only**: Never expose keys in client code\n- **Rotate regularly**: Update keys every 90 days\n\n## Common Errors\n\n### 401 Unauthorized\n\n- Check your API key and secret\n- Verify base64 encoding is correct\n- Ensure you're using the right environment keys\n\n### 403 Forbidden\n\n- Contact support to verify account permissions\n- Check if your account is fully activated\n\n## Need Help?\n\nFor authentication issues:\n\n- **Email**: [enterprise@airtm.com](mailto:enterprise@airtm.com)\n- **Keys not working?** Check your [Enterprise Dashboard](https://enterprise.airtm.com/settings)\n\n\n---\n\n# Connecting\n\nThis guide covers environments, rate limits, and webhook configuration for the Airtm Enterprise API.\n\n## API Environments\n\n| Environment | Base URL                               |\n| ----------- | -------------------------------------- |\n| Sandbox     | `https://api.stg.enterprise.airtm.com` |\n| Production  | `https://api.enterprise.airtm.com`     |\n\n### Environment Setup\n\nUse different API keys for each environment:\n\n- **Sandbox**: Use your sandbox API keys for testing\n- **Production**: Use your production API keys for live transactions\n\n> [!IMPORTANT]\n> Never mix environments. Use sandbox keys only in sandbox, production keys only in production.\n\n## Rate Limits\n\n- **Limit**: 10 requests per second per API key\n- **Response**: HTTP 429 when exceeded\n- **Applies to**: All endpoints in both environments\n\n### Handling Rate Limits\n\nImplement exponential backoff when you receive 429 responses:\n\n```javascript\nasync function makeApiCall(url, options, retries = 3) {\n  try {\n    const response = await fetch(url, options);\n\n    if (response.status === 429 && retries > 0) {\n      const delay = Math.pow(2, 4 - retries) * 1000;\n      await new Promise((resolve) => setTimeout(resolve, delay));\n      return makeApiCall(url, options, retries - 1);\n    }\n\n    return response;\n  } catch (error) {\n    throw error;\n  }\n}\n```\n\n## IP Addresses\n\n**Sandbox:**\n\n```text\n54.192.137.90\n54.192.137.12\n54.192.137.42\n54.192.137.126\n2600:9000:2062:1400:1f:5ce8:1ac0:93a1\n2600:9000:2062:8e00:1f:5ce8:1ac0:93a1\n2600:9000:2062:b800:1f:5ce8:1ac0:93a1\n2600:9000:2062:7e00:1f:5ce8:1ac0:93a1\n2600:9000:2062:7c00:1f:5ce8:1ac0:93a1\n2600:9000:2062:6800:1f:5ce8:1ac0:93a1\n2600:9000:2062:f600:1f:5ce8:1ac0:93a1\n2600:9000:2062:3400:1f:5ce8:1ac0:93a1\n```\n\n**Production:**\n\n```text\n13.224.222.5\n13.224.222.93\n13.224.222.70\n13.224.222.79\n2600:9000:21a8:1000:15:e711:f040:93a1\n2600:9000:21a8:d000:15:e711:f040:93a1\n2600:9000:21a8:3200:15:e711:f040:93a1\n2600:9000:21a8:e000:15:e711:f040:93a1\n2600:9000:21a8:de00:15:e711:f040:93a1\n2600:9000:21a8:fc00:15:e711:f040:93a1\n2600:9000:21a8:3c00:15:e711:f040:93a1\n2600:9000:21a8:7200:15:e711:f040:93a1\n```\n\n\n---\n\n# Reason Codes\n\nWhen API requests fail, you'll receive specific reason codes to help identify and resolve issues quickly.\n\n## Error Categories\n\n### Authentication & Authorization\n\n- **415006**: No API keys configured - Set up API keys in settings\n- **415024**: Maximum API keys reached - Delete unused keys\n- **415025**: API key not found - Verify key exists\n- **415028**: Enterprise account required - Contact support\n- **415904**: Unauthorized request - Check your API key and Authorization header\n- **415905**: Insufficient permissions - Contact account manager to verify account permissions\n\n### Validation\n\n- **415054**: Invalid sort field - Check sort parameter\n- **415901**: Invalid request format - Check JSON syntax and request body\n- **415902**: Item not found - Verify resource ID\n- **415903**: Request cannot be processed - Check request parameters\n- **415906**: Invalid request - Validate request format\n\n### User Issues\n\n- **415008**: Recipient address not active - Retry later\n- **415009**: Recipient address inactive - Contact recipient\n- **415010**: User deleted or banned - User must contact support\n- **415034**: User insufficient balance - User must add funds\n- **415059**: Recipient not found - Verify recipient information\n- **415060**: Recipient cannot receive payouts - Contact recipient\n- **415061**: Recipient from restricted territory - Use different recipient\n- **415062**: Invalid recipient payment method - Recipient must reconfigure\n- **415064**: Invalid recipient payment method - Recipient must reconfigure\n- **415065**: User has violated the AML policy\n- **415103**: User is missing required information - User must have first name and last name to process payouts\n- **415912**: Waiting for recipient to create an Airtm account\n\n### Payout Issues\n\n- **415005**: Payout not found - Verify payout ID\n- **415005**: Payout not found - Verify payout ID\n- **415016**: Insufficient balance for payout - Add funds to wallet\n- **415027**: Payout already processed - Check payout status\n- **415035**: Payout amount too small - Increase payout amount\n- **415055**: Cannot cancel non-pending payout - Check payout status\n- **415056**: Payout code already exists - Use unique code\n- **415057**: Payout exceeds maximum limit - Reduce payout amount\n- **415058**: Payout below minimum limit - Increase payout amount\n- **415073**: The payment provider could not deliver the funds to the user's payment method\n\n### Payin Issues\n\n- **415029**: Payin code already exists - Use unique code\n- **415030**: Cannot confirm or cancel payin - Check payin status\n- **415031**: Payin not found - Verify payin ID\n- **415032**: Payin already completed - Check payin status\n- **415053**: US users cannot make payins - Use alternative payment method\n\n### Bulk Operations\n\n- **415011**: Invalid file upload - Check file format and resubmit\n- **415012**: Duplicate payouts detected - Remove duplicates\n- **415013**: Bulk payout not in pending status - Check payout status\n- **415014**: Insufficient balance - Add funds to wallet\n- **415015**: Daily limit exceeded ($250,000) - Wait for next day or contact support\n- **415017**: Cannot reject bulk payout - Check if already in progress\n- **415019**: Bulk payout not finished - Wait for completion\n- **415041**: Bulk payout not found - Verify bulk payout ID\n\n### Account Management\n\n- **415022**: Must empty balance before account deletion - Withdraw all funds\n- **415045**: Deposit account type exists - Use different account type\n- **415047**: Insufficient balance for withdrawal - Check currency balance\n\n### Payment Infrastructure\n\n- **415003**: Error reaching external service - Contact account manager\n- **415036**: No active payment provider - Contact account manager\n- **415046**: Country not supported - Contact account manager\n- **415134**: Recipient missing required endorsement with payment provider - Contact account manager\n- **415048**: Invalid payment rail - Verify account configuration\n- **415049**: Bridge account not found - Contact account manager\n- **415050**: Invalid crypto payment rail - Use Ethereum or Stellar\n- **415051**: Crypto wallet not found - Contact account manager\n- **415144**: Crypto withdrawals are not enabled at the moment - Try again later\n- **415143**: Crypto address is within its hold period (24 hours by default) - Wait until the hold period ends (see `holdPeriodEndsAt` in the error data) before withdrawing to it\n\n### Reports & Operations\n\n- **415039**: Operation not found - Verify operation ID\n- **415042**: Statement not found - Verify statement ID\n- **415043**: Statement not pending - Check statement status\n- **415044**: Statement not completed - Wait for completion\n\n### System Errors\n\n- **415998**: Unexpected error - Contact account manager\n- **415999**: Unknown error - Contact account manager\n\n## Quick Troubleshooting\n\n**Before contacting support:**\n\n1. Check your API credentials and permissions\n2. Verify request format and required fields\n3. Confirm sufficient account balance\n4. Review user/recipient account status\n5. Check for duplicate codes or IDs\n\n**When contacting support:**\n\n- Include the specific error code\n- Provide request details and timestamps\n- Include relevant IDs (payout, payin, user)\n- Describe what you were trying to accomplish\n\n\n---\n\n# Frequently Asked Questions\n\n## API Credentials\n\n### Generating API Credentials (API Key & Secret)\n\n1. Log in to your Airtm Enterprise account\n2. Go to: **Settings → API Keys**\n3. Click **Generate New API Key**\n4. Save both the **API Key** and **Secret Key** securely\n\n> ⚠️ **Important**: Credentials are displayed only once—store them securely.\n\n### Key Considerations\n\n- **One credential per account**: Only one API credential can be generated per Enterprise account\n- **Role requirements**: Only users with Owner or Admin roles can access this feature\n- **Environment separation**: Use different keys for sandbox and production\n- **Security**: Never expose keys in client-side code or public repositories\n\n---\n\n## Getting Started with the API\n\n### Scope of the Airtm API\n\n✅ **The Airtm API enables:**\n\n- **Payouts**: Send money to recipients worldwide through their Airtm accounts\n- **Payins**: Collect payments from users globally\n- **Bulk Payouts**: Process multiple payouts efficiently in batches\n- **User Verification**: Check recipient account status before sending payments\n- **Account Management**: Monitor balances and account information\n- **Reports**: Generate transaction data and audit reports\n- **Withdrawals**: Transfer funds to external bank or crypto accounts\n- **Deposits**: Track incoming funds to your enterprise account\n\n❌ **Not supported:**\n\n- P2P functionality between regular users\n- Card operations or card-based payments\n- Direct bank account creation for users\n- Real-time currency trading\n\n### Supported Regions\n\n🌍 Airtm operates globally in 190+ countries, but certain jurisdictions are restricted due to regulatory requirements.\n→ [Check the list of unsupported regions](https://help.airtm.com/en/support/solutions/articles/47001177565-where-are-airtm-s-products-and-services-available-)\n\n### iFrames & Embedded Pages\n\n🚫 Embedding Airtm pages via iframes is not supported due to security policies and authentication requirements.\n\n### Rate Limits\n\n- **Standard Rate Limit**: 10 requests per second per API key\n- **Response**: HTTP 429 when exceeded\n- **Best Practice**: Implement exponential backoff for retries\n- **Higher Limits**: Contact support for increased limits if needed\n\n### Currency & Payment Methods\n\n- **Primary Currency**: All API operations are denominated in USD (USDC)\n- **Currency conversion**: Handled automatically by the platform when needed\n- **Supported transactions**: Between Airtm accounts and to external destinations\n- **Fee structure**: Transparent fee calculation for all operations\n\n---\n\n## API Environments\n\n### Sandbox (Testing) Environment\n\n| **Parameter**        | **Value**                                                          |\n| -------------------- | ------------------------------------------------------------------ |\n| **Base URL**         | `https://api.stg.enterprise.airtm.com`                             |\n| **Enterprise Login** | [Sandbox Portal](https://stg.enterprise.airtm.com)                 |\n| **Documentation**    | [Sandbox Documentation](https://api.stg.enterprise.airtm.com/docs) |\n\n#### Available Operations:\n\n- **Payouts**: `/payouts` - Send money to recipients\n- **Payins**: `/payins` - Collect payments from users\n- **Bulk Payouts**: `/bulk-payouts` - Process multiple payouts\n- **Users**: `/users` - Verify recipient accounts\n- **Reports**: `/reports` - Generate transaction and activity reports\n- **Withdrawals**: `/withdrawals` - Transfer to external accounts\n\n#### Test Accounts:\n\n- Create test accounts manually for comprehensive testing\n- Request test funds from your assigned Airtm manager\n- At least two accounts needed for complete transaction testing\n\n### Production Environment\n\n| **Parameter**        | **Value**                                                         |\n| -------------------- | ----------------------------------------------------------------- |\n| **Base URL**         | `https://api.enterprise.airtm.com`                                |\n| **Enterprise Login** | [Live Portal](https://enterprise.airtm.com)                       |\n| **Documentation**    | [Production Documentation](https://api.enterprise.airtm.com/docs) |\n\n> ⚠️ **Important**: Always test thoroughly in sandbox before using production.\n\n---\n\n## Webhooks & Notifications\n\nConfigure webhook URLs to receive real-time notifications when transaction statuses change.\n\n### Supported Operations\n\nWebhooks are available for:\n\n- **Payouts**: Status updates from creation to completion\n- **Payins**: Payment processing notifications\n- **Bulk Payouts**: Batch processing status updates\n\n### Webhook Security\n\n**IP Whitelisting** - Whitelist these IPs to receive webhooks:\n\n🔒 → [Current server IPs are listed here](#description/ip-addresses)\n\n### Webhook Management\n\n- **Svix Integration**: Enhanced webhook delivery and management\n- **Portal Access**: Configure webhooks through application portal\n- **Signature Verification**: Validate webhook authenticity\n- **Retry Logic**: Automatic retries for failed deliveries\n\n### Example: Payout Webhook Payload\n\n```json\n{\n  \"id\": \"123e4567-e89b-12d3-a456-426614174000\",\n  \"bulkPayoutId\": \"123e4567-e89b-12d3-a456-426614174000\",\n  \"hash\": \"string\",\n  \"code\": \"string\",\n  \"airtmUserId\": \"123e4567-e89b-12d3-a456-426614174000\",\n  \"airtmUserEmail\": \"string\",\n  \"requireIdVerified\": false,\n  \"notes\": \"string\",\n  \"internalNote\": \"string\",\n  \"status\": \"COMPLETED\",\n  \"grossAmount\": 10,\n  \"amount\": 9.5,\n  \"netAmount\": 9,\n  \"airtmFee\": 0.5,\n  \"enterpriseFee\": 0.5,\n  \"reasonCode\": 522443,\n  \"reasonDescription\": \"string\",\n  \"createdAt\": \"2025-08-20T17:01:44.634Z\",\n  \"updatedAt\": \"2025-08-20T17:01:44.634Z\"\n}\n```\n\n### Example Payin Webhook Payload\n\n```json\n{\n  \"id\": \"123e4567-e89b-12d3-a456-426614174000\",\n  \"code\": \"string\",\n  \"hash\": \"string\",\n  \"status\": \"CREATED\",\n  \"amount\": 10,\n  \"netAmount\": 9.5,\n  \"airtmFee\": 0.5,\n  \"description\": \"string\",\n  \"items\": [\n    {\n      \"description\": \"string\",\n      \"amount\": 10,\n      \"quantity\": 1,\n      \"id\": \"123e4567-e89b-12d3-a456-426614174000\",\n      \"payinId\": \"123e4567-e89b-12d3-a456-426614174000\"\n    }\n  ],\n  \"airtmUserId\": \"123e4567-e89b-12d3-a456-426614174000\",\n  \"airtmUserEmail\": \"hello@example.com\",\n  \"failureReason\": \"string\",\n  \"createdAt\": \"2025-08-20T17:01:44.634Z\",\n  \"updatedAt\": \"2025-08-20T17:01:44.634Z\",\n  \"confirmationUri\": \"string\",\n  \"cancelUri\": \"string\"\n}\n```\n\n### 🔐 Webhook Best Practices\n\n- Return **2xx HTTP status code** to acknowledge receipt\n- Implement **signature verification** for security\n- Use **HTTPS** for all webhook URLs\n- Handle **idempotency** to prevent duplicate processing\n- Implement **retry logic** for temporary failures\n\n---\n\n## Transaction Statuses\n\n### Payout Statuses\n\n| **Status**  | **Final?** | **Description**                                                     |\n| ----------- | ---------- | ------------------------------------------------------------------- |\n| `CREATED`   | No         | Payout created, awaiting commit                                     |\n| `COMMITTED` | No         | Payout committed and being processed                                |\n| `PENDING`   | No         | Awaiting recipient action (account creation, ID verification, etc.) |\n| `COMPLETED` | Yes        | Successfully delivered to recipient                                 |\n| `CANCELED`  | Yes        | Cancelled by enterprise or system                                   |\n| `FAILED`    | Yes        | Processing failed - contact support                                 |\n\n### Payin Statuses\n\n| **Status**   | **Final?** | **Description**                                |\n| ------------ | ---------- | ---------------------------------------------- |\n| `CREATED`    | No         | Payment request created, awaiting user action  |\n| `CONFIRMED`  | Yes        | Payment successfully processed                 |\n| `CANCELED`   | Yes        | User cancelled the payment                     |\n| `PROCESSING` | No         | User initiated payment, processing in progress |\n| `FAILED`     | Yes        | Payment processing failed                      |\n\n### Bulk Payout Statuses\n\n| **Status**    | **Description**                               |\n| ------------- | --------------------------------------------- |\n| `PENDING`     | Bulk payout received, validation in progress  |\n| `IN_PROGRESS` | Individual payouts being processed            |\n| `COMPLETED`   | All payouts processed (some may have failed)  |\n| `REJECTED`    | Bulk payout rejected due to validation errors |\n\n> 💡 **Tip**: Use case-insensitive comparisons when evaluating status strings.\n\n---\n\n## API Operations\n\n### Core Endpoints\n\n- **Account**: `GET /me` - Get account information and balance\n- **Payouts**: Comprehensive payout management with two-step process\n- **Payins**: Payment collection with hosted checkout\n- **Users**: `GET /users?email={email}` - Verify recipients before payouts\n- **Reports**: Generate and download transaction data\n- **Bulk Payouts**: Process multiple payouts efficiently\n\n**User statuses :**\n\n- `ACTIVE` - ✅ Can receive payments\n- `INACTIVE` - ❌ Account deactivated\n\n---\n\n## Transaction Fees, Limits & Processing Times\n\n### Fees & Limits\n\n| **Parameter**                  | **Value**                              |\n| ------------------------------ | -------------------------------------- |\n| **Minimum (US & Puerto Rico)** | $1 USDC                                |\n| **Minimum (Other regions)**    | $0.01 USDC                             |\n| **Maximum per transaction**    | No upper limit                         |\n| **Fees**                       | Contact the sales team for exact rates |\n\n### Processing Times\n\n- **Payouts to existing verified users**: Up to 2 minutes\n- **Payouts to new users**: Up to 90 days (pending account creation)\n- **Payins**: Immediate after user confirmation\n- **Bulk payouts**: Depends on batch size, typically 15-30 minutes\n- **Reports**: 5-15 minutes depending on data volume\n- **Withdrawals**: 1-3 business days depending on destination\n\n### Expiration Rules\n\n- **Payins**: Expire after **15 days**\n- **Payouts to unregistered users**: **90 days** (configurable in dashboard)\n- **Report download URLs**: **1 hour**\n\n---\n\n## Security & Authentication\n\n### Authentication Methods\n\n**HTTP Basic Authentication** is required for all requests:\n\n```text\nAuthorization: Basic <base64-encoded-credentials>\n```\n\n### Setting Up Authentication\n\n1. **Combine credentials**: `api_key:secret_key`\n2. **Base64 encode**: Use any base64 encoder\n3. **Add header**: `Authorization: Basic <encoded_credentials>`\n\n### Code Examples\n\n**cURL:**\n\n```bash\ncurl -X GET \"https://api.enterprise.airtm.com/me\" \\\n  -u \"your_api_key:your_secret_key\"\n```\n\n**JavaScript:**\n\n```javascript\nconst auth = btoa('your_api_key:your_secret_key');\nconst response = await fetch('https://api.enterprise.airtm.com/me', {\n  headers: { Authorization: `Basic ${auth}` },\n});\n```\n\n**Python:**\n\n```python\nimport requests\nfrom requests.auth import HTTPBasicAuth\n\nresponse = requests.get(\n    'https://api.enterprise.airtm.com/me',\n    auth=HTTPBasicAuth('your_api_key', 'your_secret_key')\n)\n```\n\n### Security Best Practices\n\n- **Store credentials securely** using environment variables\n- **Use HTTPS** for all requests\n- **Separate environments** with different API keys\n- **Rotate credentials** regularly (every 90 days recommended)\n- **Monitor API usage** for unusual patterns\n- **Never expose keys** in client-side code\n\n---\n\n> 📞 **Need Help?** Contact [enterprise@airtm.com](mailto:enterprise@airtm.com) for support with API integration, technical issues, or account questions.\n\n\n---\n\n# Changelog\n\nStay up-to-date with the latest improvements, new features, and important changes to the Enterprise API. We continuously enhance our platform to provide you with better functionality and reliability.\n\n## 🚀 What's New\n\n### V2 API Beta (June 2025)\n\n**Major Release**: We've launched our next-generation API with enhanced capabilities and improved developer experience.\n\n#### Supported Features:\n\n- **Bulk Operations**: Process multiple payouts simultaneously\n- **Enhanced Payouts**: Improved error handling and status tracking\n- **User Management**: Retrieve user details and manage balances\n- **Advanced Reporting**: Generate detailed reports with timezone support\n- **Better Authentication**: Streamlined API authentication and error responses\n\n---\n\n## 📋 Recent Updates\n\n### October 2026\n\n#### ⚠️ Breaking Changes\n\n- **Callbacks removed**: Airtm no longer calls the URLs you provide when a payout or purchase changes status. Use webhooks to receive notifications.\n- **Rejected fields (V1 API)**: Requests that include the payout fields `confirmation_uri`, `failure_uri`, `cancel_uri` or `callback_credentials` (also as columns of a bulk payout CSV or items of a bulk payout), or the purchase field `callback_uri`, now return a `400` error. The purchase `confirmation_uri` and `cancel_uri` redirect URLs are not affected. The V2 API never accepted these fields.\n- **API key secrets**: The secret of an API key is only returned when the key is created and it cannot be retrieved afterwards. Keep it safe, or create a new key if you lose it.\n\n### August 2026\n\n#### ✨ New Features\n\n- **2FA method on send creation**: The `wallet:send` create response now includes `twoFactorMethod` (`email`, `authenticator`, `sms`, or `whatsapp`) — the channel the user's one-time code was issued on, resolved at challenge time so it reflects their current preference. Use it to decide whether to show a **Resend** button (applicable to every channel except `authenticator`). See [Per-transaction 2FA](#per-transaction-2fa).\n- **Partner Account API**: A new `/api/connect/v1/partner` surface to read and manage your own partner record — update your consent-screen `name` and `logo`, view your approved scopes and redirect URIs, and open the webhook portal to register endpoints. Authenticated with your client credentials via the `Api-Key` scheme. See the [Partner Account API guide](#description/partner-api).\n\n### July 2026\n\n#### 🔒 Security\n\n- **Every wallet:send is now user-confirmed.** A newly created `wallet:send` transaction is returned as `pending_user_confirmation` and is only dispatched after the user confirms a one-time code via `POST /transactions/:transactionId/2fa`. Users with 2FA configured receive the code on their own channel (SMS, WhatsApp, or authenticator app); users with no 2FA configured are automatically emailed the code. See [Per-transaction 2FA](#per-transaction-2fa).\n\n#### ✨ New Features\n\n- **Resend 2FA code**: Added `POST /transactions/:transactionId/2fa/resend` to re-issue a fresh confirmation code for a parked `wallet:send` when the user didn't receive it.\n\n### August 2025\n\n#### 🔧 Major Improvements\n\n- **Webhook Management**: Introduced webhook application portal\n- **Advanced User Search**: Added support for searching users by hash for improved user discovery\n\n#### ✨ New Features\n\n- **API Withdrawals**: New enterprise withdrawal endpoints for better fund management\n- **External Account Management**: Complete CRUD operations for both bank and crypto external accounts\n- **ID Verification Controls**: Added enterprise-level settings to require ID verification for payouts\n- **Bulk Operations**: Improved bulk payout processing with better status tracking\n\n### July 2025\n\n#### 🔧 Improvements\n\n- **Webhook Infrastructure**: Migrated to Svix for more reliable webhook delivery and management\n- **Search Capabilities**: Enhanced payout search functionality using notes field\n\n#### ✨ New Features\n\n- **Payin Events**: Added Svix events for payin creation and cancellation\n- **Enhanced Validation**: Added state validation for US users in requests\n\n#### 🔧 Bug Fixes\n\n- **Metadata Handling**: Improved metadata merging to prevent data overwriting\n- **Report Security**: Better audit trail tracking for statement downloads with correct user identification\n- **Email Processing**: Added automatic email trimming for improved data quality\n- **Payout Status**: Fixed bulk payouts stuck in progress status\n- **Bridge Transactions**: Resolved missing transactions in activity reports\n- **Webhook Delivery**: Improved webhook callback event publishing\n\n### June 2025\n\n#### 🔧 Improvements\n\n- Enhanced withdrawal processing with better status tracking\n- Improved validation for external accounts and currency handling\n- Better handling of cancellation URLs\n- Enhanced report validation and CSV formatting\n\n#### ✨ New Features\n\n- Added support for payout codes and unique identifiers\n- Automatic cancellation of payouts when users are disabled\n- Custom cancellation URLs for better user experience\n\n### May 2025\n\n#### 🔧 Critical Fixes\n\n- Fixed timezone handling in reports\n- Improved webhook monitoring and reliability\n- Enhanced error reporting with detailed reason codes\n- Better handling of pending payouts\n\n#### ✨ New Features\n\n- Timezone support added to all reporting features\n- Automatic refund system for failed completed payouts\n- Enhanced recipient validation with comprehensive checks\n\n#### ⚠️ Breaking Changes\n\n- **V0.3.0**: Enhanced recipient validation now performs comprehensive checks when creating and committing payouts. This may affect existing integrations that don't provide complete recipient information.\n\n### April 2025\n\n#### 🔧 Improvements\n\n- Expanded payout eligibility for additional US users\n- Improved pending status handling across different payout types\n- Enhanced user verification checks during processing\n- Better retry mechanisms for failed payouts\n\n#### ✨ New Features\n\n- Automatic retry of pending payouts when users complete required actions\n- Configurable timeout settings for pending payout cancellation\n- Support for payouts to third-party users\n\n#### ⚠️ Breaking Changes\n\n- **V0.2.0**: Payout status flow has been standardized. All payouts now use a consistent two-step process with `CREATED` and `COMMITTED` statuses having updated meanings. This affects how you should handle payout state transitions.\n\n### March 2025\n\n#### 🔧 Improvements\n\n- Enhanced direct withdrawal functionality\n- Fixed audit report generation issues\n- Improved pending balance calculations\n- Better payment descriptions using available memos\n\n#### ✨ New Features\n\n- PDF generation for audit reports\n- Automatic retry system for volume-limited payouts\n- Custom aliases support for crypto withdrawals\n\n---\n\n## 🗃️ Archive\n\n<details>\n<summary>Show Codes</summary>\n\n**February 2025**\n\n- Enhanced security measures\n- Improved error handling across all endpoints\n- Performance optimizations for large-scale operations\n\n**January 2025**\n\n- Infrastructure improvements\n- Enhanced monitoring capabilities\n- Bug fixes and stability improvements\n\n**2024 Highlights**\n\n- Integration with third-party liquidity providers\n- Core payout functionality\n- Basic reporting features\n\n_For detailed information about changes prior to 2025, please contact our support team._\n\n</details>\n\n---\n\n## 🔔 Stay Informed\n\n- **Breaking Changes**: Always marked with ⚠️ and include migration guidance\n- **Security Updates**: Critical security fixes are released immediately\n- **API Versioning**: We maintain backward compatibility whenever possible\n\nFor technical support or questions about any changes, please reach out to our [support team](mailto:enterprise@airtm.com).\n","contact":{"name":"Airtm Enterprise","email":"enterprise@airtm.com","url":"https://www.airtm.com"}},"paths":{"/withdrawals":{"post":{"operationId":"CreateWithdrawal","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WithdrawalResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Creates a withdrawal for the enterprise.","summary":"Create a withdrawal","tags":["Withdrawals"],"security":[{"basicAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWithdrawalRequest"}}}}},"get":{"operationId":"ListWithdrawals","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paginated_WithdrawalResponse_"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"List withdrawals","summary":"List withdrawals","tags":["Withdrawals"],"security":[{"basicAuth":[]}],"parameters":[{"description":"Gets results before the specified cursor.","in":"query","name":"before","required":false,"schema":{"type":"string"}},{"description":"Gets results after the specified cursor.","in":"query","name":"after","required":false,"schema":{"type":"string"}},{"description":"The maximum number of items to fetch.","in":"query","name":"perPage","required":false,"schema":{"default":100,"format":"int32","type":"integer","minimum":10,"maximum":1000}},{"in":"query","name":"status","required":false,"schema":{"$ref":"#/components/schemas/EnterpriseDirectWithdrawStatus"}}]}},"/withdrawals/{id}":{"get":{"operationId":"GetWithdrawalById","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WithdrawalResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Get a single withdrawal","summary":"Get a single withdrawal","tags":["Withdrawals"],"security":[{"basicAuth":[]}],"parameters":[{"description":"The withdrawal id","in":"path","name":"id","required":true,"schema":{"type":"string"}}]}},"/users/{email}":{"get":{"operationId":"GetUserByEmail","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Retrieve the current status of any user's account by email.\n\n> [!important]\n> The email parameter should be [URL Encoded](https://www.w3schools.com/tags/ref_urlencode.ASP).","summary":"Get user details by email.","tags":["Users"],"security":[{"basicAuth":[]}],"parameters":[{"description":"The email of the user to retrieve","in":"path","name":"email","required":true,"schema":{"$ref":"#/components/schemas/Email"}}]}},"/reports":{"post":{"operationId":"GenerateReport","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Report"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Generate a new report for a given year/month.\n\nTo get a PDF or CSV report, you must first request its generation if it does not already exist.\nTo do so, you must provide the year and month","summary":"Create a Report","tags":["Reports"],"security":[{"basicAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReportRequest"}}}}},"get":{"operationId":"ListReports","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paginated_Report_"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"List existing reports","summary":"List Reports","tags":["Reports"],"security":[{"basicAuth":[]}],"parameters":[{"description":"Gets results before the specified cursor.","in":"query","name":"before","required":false,"schema":{"type":"string"}},{"description":"Gets results after the specified cursor.","in":"query","name":"after","required":false,"schema":{"type":"string"}},{"description":"The type of report to filter by","in":"query","name":"type","required":true,"schema":{"$ref":"#/components/schemas/ReportType"}},{"description":"The status to filter by","in":"query","name":"status","required":false,"schema":{"$ref":"#/components/schemas/ReportStatus"}},{"description":"The maximum number of items to fetch.","in":"query","name":"perPage","required":false,"schema":{"default":12,"format":"int32","type":"integer","minimum":6,"maximum":100}}]}},"/reports/{id}":{"get":{"operationId":"GetReport","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Report"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Get Report Details","summary":"Get Report Details","tags":["Reports"],"security":[{"basicAuth":[]}],"parameters":[{"description":"The report's id","in":"path","name":"id","required":true,"schema":{"type":"string"}}]}},"/reports/{id}/file":{"get":{"operationId":"GetReportFile","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportFile"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Get a report file","summary":"Get Report File","tags":["Reports"],"security":[{"basicAuth":[]}],"parameters":[{"description":"The report's id","in":"path","name":"id","required":true,"schema":{"type":"string"}}]}},"/payouts":{"post":{"operationId":"CreatePayout","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayoutResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"This endpoint allows you to create a payout instruction. In the request body, information about\nthe payout such as the recipient's email, description, amount, and any URLs needed for confirmation\nor failure redirects should be provided.\n\nUpon successful creation, the API returns a response containing the details of the newly created\npayout, including a unique ID.\n\n> [!tip]\n> After making a call to this endpoint, no money is moved yet. To finish moving the money to a\n> user, you must call the `POST /v2/payouts/:id/commit` endpoint with the id from this response.\n> Alternatively, you may pass `commit: true` to do the payout in a single API call.","summary":"Create a payout","tags":["Payouts"],"security":[{"basicAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePayoutRequest"}}}}},"get":{"operationId":"ListPayouts","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paginated_PayoutResponse_"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"List payouts","summary":"List payouts","tags":["Payouts"],"security":[{"basicAuth":[]}],"parameters":[{"description":"Gets results before the specified cursor.","in":"query","name":"before","required":false,"schema":{"type":"string"}},{"description":"Gets results after the specified cursor.","in":"query","name":"after","required":false,"schema":{"type":"string"}},{"description":"The maximum number of items to fetch.","in":"query","name":"perPage","required":false,"schema":{"default":100,"format":"int32","type":"integer","minimum":10,"maximum":1000}},{"in":"query","name":"status","required":false,"schema":{"$ref":"#/components/schemas/PayoutStatus"}},{"in":"query","name":"bulkPayoutId","required":false,"schema":{"type":"string"}}]}},"/payouts/{id}":{"get":{"operationId":"GetPayout","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayoutResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Get a single payout","summary":"Get a single payout","tags":["Payouts"],"security":[{"basicAuth":[]}],"parameters":[{"description":"The payout id","in":"path","name":"id","required":true,"schema":{"type":"string"}}]},"delete":{"operationId":"CancelPayout","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayoutResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"This endpoint allows users to cancel specific `CREATED` or `PENDING` individual payouts—those that:\n\n- have been created and committed but where the recipient is not ready to receive the payout.\n- have been created but have not yet been committed.\n\nPending payouts will automatically cancel after 90 days (by default, other time periods are\navailable in dashboard settings) from the creation date.\n\nOnce canceled:\n\n- Funds are automatically returned to the enterprise's balance.\n- The individual payout status is updated to `CANCELED`.\n- The response will include all relevant details of the canceled payout.\n\nAdditional information about canceled payouts can be accessed through the [Enterprise Portal](enterprise.airtm.com)","summary":"Cancel a pending payout","tags":["Payouts"],"security":[{"basicAuth":[]}],"parameters":[{"description":"The payout id","in":"path","name":"id","required":true,"schema":{"type":"string"}}]}},"/payouts/by-code/{code}":{"get":{"operationId":"GetPayoutByCode","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayoutResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Get a single payout by code","summary":"Get a single payout by code","tags":["Payouts"],"security":[{"basicAuth":[]}],"parameters":[{"in":"path","name":"code","required":true,"schema":{"type":"string"}}]}},"/payouts/{id}/events":{"get":{"operationId":"GetPayoutEvents","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/OperationEvent"},"type":"array"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Every time a payout transitions to a new status, an event is created.\nThis endpoint allows you to retrieve the events for a single payout.","summary":"Get the events for a single payout","tags":["Payouts"],"security":[{"basicAuth":[]}],"parameters":[{"description":"The payout id","in":"path","name":"id","required":true,"schema":{"type":"string"}}]}},"/payouts/{id}/commit":{"post":{"operationId":"CommitPayout","responses":{"204":{"description":"Accepted"},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Once a payout is created, it needs to be committed. This is done with a POST request which\ntakes a unique ID of the payout and commits it, meaning the payout is now ready to be\nprocessed.\n\nThis endpoint would only respond with an empty 201.","summary":"Commit a payout","tags":["Payouts"],"security":[{"basicAuth":[]}],"parameters":[{"description":"The payout id","in":"path","name":"id","required":true,"schema":{"type":"string"}}]}},"/payins":{"post":{"operationId":"CreatePayin","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayinResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"This endpoint will allow you to create a payin.\nIn order to complete a payin, it must first be created, then the user must be directed to the Airtm website to confirm/checkout the payin, at which time they will be redirected to a URL of your choosing. See “Usage” below.\n\nWe will redirect the user to either `confirmationUri` or `cancelUri` with code as a query parameter so you can process the payin as being either confirmed or cancelled.\n\n## Usage\n\n 1. Create a payin.\n 2. Extract the `id` from the response and redirect the user to: https://<API Host>/payin/:id User will be redirected for authentication as necessary.\n 3. User will confirm or cancel payin from Airtm’s website.\n 4. If confirmed, money will be transferred from the user’s Airtm wallet, to your account, and the user will be redirected to the provided `confirmationUri`.\n    If canceled, no money will be transferred, and the user will be redirected to the provided `cancelUri`.\n\nUpon confirmation or cancellation, the payin will be considered completed, and the URL residing at /payin/:id will no longer function.\nTherefore, if you wish to complete an identical payin, you will need to create a new one.\n\nThe `confirmationUri` attribute should not be used for transaction completeness verification, if the URI was requested, it doesn't mean the transaction was completed successfully.\n\n## Redirection\n\n> [!important]\n> If you are integrating our API in a mobile application, you will need to redirect the user with the payin generated url by making sure that you open the user’s external browser.\n> By implementing this, the user’s device will be able to successfully handle deeplinks and redirect the users to the Airtm app to finish the operation.\n\nHere are some code snippets in the most popular mobile development frameworks for you to implement the redirection:\n\n### Swift Example\n\n```swift\n// instead of opening a WKWebView or a Safari View Controller, do this:\n\nlet url = URL(string: \"https://app.airtm.com/payin/payin-id\")\nif UIApplication.shared.canOpenURL(url) {\n    UIApplication.shared.open(url)\n}\n```\n\n### Kotlin Example\n\n```kotlin\nval url = \"https://app.airtm.com/payin/payin-id\"\nfun Context.openUrl(url: String?) {\n    if (url == null) return\n\n    val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(url))\n\n    kotlin.runCatching {\n        this.startActivity(browserIntent)\n    }.onFailure {\n        // handle errors gracefully\n    }\n}\n```\n\n### Flutter Example\n\n```dart\nimport 'package:url_launcher/url_launcher.dart';\n\nvoid openUrl(String? url) async {\n  if (url == null) return;\n\n  final uri = Uri.parse(url);\n\n  try {\n    await launchUrl(uri, mode: LaunchMode.externalApplication);\n  } catch (_) {\n    // Fail silently or log if needed\n  }\n}\n```\n\n### React Native Example\n\n```typescript\nimport { Linking } from 'react-native';\n\nconst openUrl = async (url: string | null | undefined) => {\n  if (!url) return;\n\n  try {\n    const supported = await Linking.canOpenURL(url);\n    if (supported) {\n      await Linking.openURL(url);\n    }\n    // If not supported, you can silently fail or log\n  } catch (error) {\n    // Optional: Handle errors silently or log\n  }\n};\n```","summary":"Create a Payin","tags":["Payins"],"security":[{"basicAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePayinRequest"}}}}},"get":{"operationId":"ListPayins","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paginated_PayinResponse_"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Endpoint to list all payins associated with your account.","summary":"List payins","tags":["Payins"],"security":[{"basicAuth":[]}],"parameters":[{"description":"Gets results before the specified cursor.","in":"query","name":"before","required":false,"schema":{"type":"string"}},{"description":"Gets results after the specified cursor.","in":"query","name":"after","required":false,"schema":{"type":"string"}},{"description":"The maximum number of items to fetch.","in":"query","name":"perPage","required":false,"schema":{"default":100,"format":"int32","type":"integer","minimum":10,"maximum":1000}},{"in":"query","name":"status","required":false,"schema":{"$ref":"#/components/schemas/PayinStatus"}},{"in":"query","name":"enterpriseId","required":false,"schema":{"type":"string"}}]}},"/payins/{id}":{"get":{"operationId":"GetPayinById","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayinResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Get the details of an existing payin.","summary":"Get payin details","tags":["Payins"],"security":[{"basicAuth":[]}],"parameters":[{"description":"The payin id","in":"path","name":"id","required":true,"schema":{"type":"string"}}]},"delete":{"operationId":"CancelPayin","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayinResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Cancel an existing payin.\n\n> [!tip]\n> Only `PENDING` payins can be canceled.","summary":"Cancel a payin","tags":["Payins"],"security":[{"basicAuth":[]}],"parameters":[{"description":"The payin id","in":"path","name":"id","required":true,"schema":{"type":"string"}}]}},"/payins/by-code/{code}":{"get":{"operationId":"GetPayinByCode","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayinResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Get the details of an existing payin by its code.","summary":"Get payin by code","tags":["Payins"],"security":[{"basicAuth":[]}],"parameters":[{"description":"The payin code","in":"path","name":"code","required":true,"schema":{"type":"string"}}]}},"/me":{"get":{"operationId":"GetMe","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"summary":"Get enterprise details","tags":["Me"],"security":[{"basicAuth":[]}],"parameters":[]}},"/me/balance":{"get":{"operationId":"GeBalance","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Balance"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Retrieves the current balance of the enterprise.\nIt will include both available and pending amounts.\n\n> [!tip]\n> The pending amount is the sum of all committed pending payouts.","summary":"Get balance","tags":["Me"],"security":[{"basicAuth":[]}],"parameters":[]}},"/crypto-accounts":{"get":{"operationId":"ListExternalCryptoAccounts","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paginated_CryptoExternalAccountResponse_"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"List paginated external crypto accounts","summary":"List external crypto accounts","tags":["External Crypto Account"],"security":[{"basicAuth":[]}],"parameters":[{"description":"Gets results before the specified cursor.","in":"query","name":"before","required":false,"schema":{"type":"string"}},{"description":"Gets results after the specified cursor.","in":"query","name":"after","required":false,"schema":{"type":"string"}},{"description":"The maximum number of items to fetch.","in":"query","name":"perPage","required":false,"schema":{"default":100,"format":"int32","type":"integer","minimum":10,"maximum":1000}},{"in":"query","name":"type","required":false,"schema":{"$ref":"#/components/schemas/CryptoWalletType"}}]}},"/bank-accounts":{"post":{"operationId":"CreateExternalBankAccount","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BankExternalAccountResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Creates a US or EUR bank external account for the enterprise.","summary":"Create a bank external account","tags":["External Bank Account"],"security":[{"basicAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBankExternalAccountRequest"}}}}},"get":{"operationId":"ListExternalBankAccounts","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paginated_BankExternalAccountResponse_"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"List paginated external bank accounts","summary":"List external bank accounts","tags":["External Bank Account"],"security":[{"basicAuth":[]}],"parameters":[{"description":"Gets results before the specified cursor.","in":"query","name":"before","required":false,"schema":{"type":"string"}},{"description":"Gets results after the specified cursor.","in":"query","name":"after","required":false,"schema":{"type":"string"}},{"description":"The maximum number of items to fetch.","in":"query","name":"perPage","required":false,"schema":{"default":100,"format":"int32","type":"integer","minimum":10,"maximum":1000}},{"in":"query","name":"accountType","required":false,"schema":{"$ref":"#/components/schemas/AccountType"}}]}},"/embedded/webhooks/portal-url":{"get":{"operationId":"GetPortalUrl","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"properties":{"url":{"type":"string"}},"required":["url"],"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Get a single-use URL for your account that you can open in your browser to configure your webhook endpoints.","summary":"Get portal URL","tags":["Webhooks"],"security":[{"embeddedAuth":[]}],"parameters":[]}},"/embedded/transactions":{"get":{"operationId":"ListTransactions","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paginated_TransactionApiResponse_"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"List partner transactions with cursor-based pagination.","summary":"List transactions","tags":["Embedded Transactions"],"security":[{"embeddedAuth":[]}],"parameters":[{"description":"Gets results before the specified cursor.","in":"query","name":"before","required":false,"schema":{"type":"string"}},{"description":"Gets results after the specified cursor.","in":"query","name":"after","required":false,"schema":{"type":"string"}},{"description":"The maximum number of items to fetch.","in":"query","name":"perPage","required":false,"schema":{"default":100,"format":"int32","type":"integer","minimum":10,"maximum":1000}},{"description":"Filter transactions by sender id.","in":"query","name":"senderId","required":false,"schema":{"type":"string"}},{"description":"Sort by transaction creation date.","in":"query","name":"order","required":false,"schema":{"$ref":"#/components/schemas/SortOrder"}}]},"post":{"operationId":"CreateTransaction","responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionApiResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Create a transaction for an embedded payment using a locked-in quote.\nReturns the transaction record and deposit instructions for the sender.","summary":"Create transaction","tags":["Embedded Transactions"],"security":[{"embeddedAuth":[]}],"parameters":[{"in":"header","name":"idempotency-key","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTransactionRequest"}}}}}},"/embedded/transactions/{id}":{"get":{"operationId":"GetTransactionById","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionApiResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Get an embedded transaction by id (scoped to the authenticated partner).","summary":"Get transaction by id","tags":["Embedded Transactions"],"security":[{"embeddedAuth":[]}],"parameters":[{"description":"The transaction id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}]}},"/embedded/transactions/{id}/confirm":{"post":{"operationId":"ConfirmTransaction","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionApiResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Confirm a transaction on behalf of the partner client.\nSets `clientConfirmation` to `CONFIRMED` on the transaction record.","summary":"Confirm transaction","tags":["Embedded Transactions"],"security":[{"embeddedAuth":[]}],"parameters":[{"description":"The transaction id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}]}},"/embedded/transactions/{id}/deny":{"post":{"operationId":"DenyTransaction","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionApiResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Deny a transaction on behalf of the partner client.\nSets `clientConfirmation` to `DENIED` on the transaction record and\npublishes a `Limit` command to the user command stream.","summary":"Deny transaction","tags":["Embedded Transactions"],"security":[{"embeddedAuth":[]}],"parameters":[{"description":"The transaction id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}]}},"/embedded/senders":{"post":{"operationId":"CreateSender","responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SenderApiResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Creates a new embedded sender for a partner configured in **Reliance KYC mode**.\n\nYou have already performed KYC on the sender. Pass a `compliance` block with\nyour KYC reliance reference, screening results, and session context. On\nsuccess the sender is created `ACTIVE` with its funding rail instances.\n\nPartners configured in Persona KYC mode must use\n`POST /embedded/senders-with-kyc` instead; calling this endpoint returns\n`EMBEDDED_SENDER_INVALID_KYC_MODE`.","summary":"Create sender","tags":["Embedded Senders"],"security":[{"embeddedAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSenderRequest"},"example":{"externalSenderId":"your-own-controlled-id","partyType":"individual","countryOfResidence":"VEN","enabledFundingRailIds":["stellar.usdc"],"individual":{"firstName":"$first_name","lastName":"$last_name","dob":"1990-01-01","nationalIdNumber":"$national_id_number","nationality":"VEN"},"contact":{"email":"$email","phoneNumber":"$phone_number","phoneCountryCode":"$phone_country_code"},"address":{"line1":"$address_line1","city":"$address_city","region":"$address_region","postalCode":"$address_postal_code","country":"$address_country"},"compliance":{"kycReliance":{"performedBy":"$kyc_reliance_performed_by","kycReferenceId":"$kyc_reliance_kyc_reference_id","status":"VERIFIED","performedAt":"2026-04-29T12:00:00.000Z","level":"FULL","documentType":"PASSPORT","provider":{"name":"$kyc_reliance_provider_name","applicantId":"$kyc_reliance_provider_applicant_id","result":"GREEN"}},"screening":{"sanctionsHit":false,"pepHit":false,"adverseMediaHit":false,"riskRating":"LOW","screenedAt":"2026-04-29T12:00:00.000Z"},"sessionContext":{"ipAddress":"127.0.0.1","userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36","deviceId":"1234567890"}}}}}}},"get":{"operationId":"GetSenderByExternalId","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SenderApiResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Retrieve a sender by its external identifier.","summary":"Get sender by external id","tags":["Embedded Senders"],"security":[{"embeddedAuth":[]}],"parameters":[{"description":"The external sender identifier provided by the partner.","in":"query","name":"externalSenderId","required":true,"schema":{"type":"string"}}]}},"/embedded/senders/{senderId}":{"get":{"operationId":"GetSenderById","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SenderApiResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Retrieve a sender by its id.","summary":"Get sender by id","tags":["Embedded Senders"],"security":[{"embeddedAuth":[]}],"parameters":[{"description":"The sender id.","in":"path","name":"senderId","required":true,"schema":{"type":"string"}}]},"put":{"operationId":"UpdateSenderById","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SenderApiResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Update an existing sender.","summary":"Update sender","tags":["Embedded Senders"],"security":[{"embeddedAuth":[]}],"parameters":[{"description":"The sender id.","in":"path","name":"senderId","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSenderRequest"}}}}}},"/embedded/senders-with-kyc":{"post":{"operationId":"CreateSenderWithKyc","responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SenderApiResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Creates a new embedded sender for a partner configured in **Persona KYC mode**.\n\nAirtm performs KYC on your behalf via Persona. Send the request as\n`multipart/form-data` with two kinds of parts:\n\n- **`data`** — a JSON string containing all identity fields (the same fields\n  as in `POST /embedded/senders`, plus a `kyc` object with `govIdCountryCode`\n  and `birthCountryCode`). Do **not** include a `compliance` block.\n- **Photo file parts** — raw binary image files attached under their field names:\n  - Required: `govIdFrontPhoto1`, `selfieCenterPhoto`, `selfieLeftPhoto`, `selfieRightPhoto`\n  - Optional: `govIdBackPhoto1`, `govIdFrontPhoto2`, `govIdBackPhoto2`,\n    `documentResidentPermit`, `documentPoa`, `documentPoaCuba1`, `documentPoaCuba2`\n\nDo not base64-encode the images — attach them as binary file parts.\nDo not set `Content-Type` manually; let your HTTP client derive it with the boundary.\n\nExample (curl):\n```\ncurl -X POST https://api.airtm.com/v2/embedded/senders-with-kyc \\\n  -H \"Authorization: Api-Key <key>\" \\\n  -F 'data={\"externalSenderId\":\"usr_123\",\"partyType\":\"individual\",...,\"kyc\":{\"govIdCountryCode\":\"VEN\",\"birthCountryCode\":\"VEN\"}}' \\\n  -F \"govIdFrontPhoto1=@/path/to/front.jpg\" \\\n  -F \"selfieCenterPhoto=@/path/to/selfie-center.jpg\" \\\n  -F \"selfieLeftPhoto=@/path/to/selfie-left.jpg\" \\\n  -F \"selfieRightPhoto=@/path/to/selfie-right.jpg\"\n```\n\nOn success the sender is returned with status `VERIFYING` and no funding rail\ninstances; it transitions to `ACTIVE` or `REJECTED_VERIFIED` via webhook once\nPersona processes the transaction.\n\nPartners configured in Reliance KYC mode must use `POST /embedded/senders`\ninstead; calling this endpoint returns `EMBEDDED_SENDER_INVALID_KYC_MODE`.","summary":"Create sender with KYC","tags":["Embedded Senders"],"security":[{"embeddedAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CreateSenderWithKycRequest"}}}}}},"/embedded/receivers":{"post":{"operationId":"CreateReceiver","responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReceiverApiResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Create a new embedded receiver for the authenticated partner.","summary":"Create receiver","tags":["Embedded Receivers"],"security":[{"embeddedAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReceiverRequest"},"example":{"externalReceiverId":"your-own-controlled-id","partyType":"individual","country":"VEN","individual":{"firstName":"$first_name","lastName":"$last_name","dob":"1990-01-01","nationalIdNumber":"$national_id_number"},"contact":{"email":"$email","phone":"$phone_number"},"address":{"line1":"$address_line1","city":"$address_city","region":"$address_region","postalCode":"$address_postal_code","country":"$address_country"},"compliance":{"kycReliance":{"performedBy":"$kyc_reliance_performed_by","kycReferenceId":"kyc-cl-mokcvfdi-2c5ee14f","status":"VERIFIED","performedAt":"2026-03-24T12:00:00.000Z","level":"FULL","documentType":"PASSPORT","provider":{"name":"$kyc_reliance_provider_name","applicantId":"$kyc_reliance_provider_applicant_id","result":"GREEN"}}},"payoutDestinations":[{"paymentRailId":"airtm:bank:venezuela:banco-activo","senderId":"11111111-1111-1111-1111-111111111111","destination":{"accountHolder":"Testing Embedded","accountNumber":"01719987567890123499","interbankTransfer":"Yes","nationalIdentification":"V26334563"}}]}}}}},"get":{"operationId":"GetReceiverByExternalId","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReceiverApiResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Retrieve a receiver by its external identifier.","summary":"Get receiver by external id","tags":["Embedded Receivers"],"security":[{"embeddedAuth":[]}],"parameters":[{"description":"The external receiver identifier provided by the partner.","in":"query","name":"externalReceiverId","required":true,"schema":{"type":"string"}}]}},"/embedded/receivers/{receiverId}":{"get":{"operationId":"GetReceiverById","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReceiverApiResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Retrieve a receiver by its id.","summary":"Get receiver by id","tags":["Embedded Receivers"],"security":[{"embeddedAuth":[]}],"parameters":[{"description":"The receiver id.","in":"path","name":"receiverId","required":true,"schema":{"type":"string"}}]},"put":{"operationId":"UpdateReceiver","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReceiverApiResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Update an existing embedded receiver.","summary":"Update receiver","tags":["Embedded Receivers"],"security":[{"embeddedAuth":[]}],"parameters":[{"description":"The receiver id.","in":"path","name":"receiverId","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateReceiverRequest"}}}}}},"/embedded/receivers/{receiverId}/payment-rail-instance":{"post":{"operationId":"AddPaymentRailInstance","responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRailInstanceApiResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Add a payment rail instance to an existing receiver.","summary":"Add payment rail instance","tags":["Embedded Receivers"],"security":[{"embeddedAuth":[]}],"parameters":[{"description":"The receiver id.","in":"path","name":"receiverId","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddPaymentRailInstanceRequest"},"example":{"paymentRailId":"airtm:bank:venezuela:mercantil","destination":{"accountNumber":"1234567890","bankCode":"0105","accountHolderName":"Jane Doe"},"senderId":"123e4567-e89b-12d3-a456-426614174000"}}}}}},"/embedded/receivers/{receiverId}/payment-rail-instance/{paymentRailInstanceId}":{"delete":{"operationId":"RemovePaymentRailInstance","responses":{"204":{"description":"No Content"},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Remove a payment rail instance from a receiver.","summary":"Remove payment rail instance","tags":["Embedded Receivers"],"security":[{"embeddedAuth":[]}],"parameters":[{"description":"The receiver id.","in":"path","name":"receiverId","required":true,"schema":{"type":"string"}},{"description":"The payment rail instance id to remove.","in":"path","name":"paymentRailInstanceId","required":true,"schema":{"type":"string"}}]}},"/embedded/quotes":{"post":{"operationId":"CreateQuote","responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteApiResponse"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Create a quote for an embedded payment.\nExactly one of `amountToSend` or `amountToReceive` must be provided.","summary":"Create quote","tags":["Embedded Quotes"],"security":[{"embeddedAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateQuoteRequest"}}}}}},"/embedded/catalog":{"get":{"operationId":"ListCatalog","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paginated_EmbeddedCatalogRailItem_"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"List active payment rails available for embedded payouts (catalog).\nResults are cursor-paginated","summary":"List payment rail catalog","tags":["Embedded Catalog"],"security":[{"embeddedAuth":[]}],"parameters":[{"description":"Country code 3 letter ISO code.","in":"query","name":"country","required":false,"schema":{"type":"string","minLength":3,"maxLength":3}},{"in":"query","name":"currency","required":false,"schema":{"type":"string"}},{"description":"The maximum number of items to fetch.","in":"query","name":"perPage","required":false,"schema":{"default":10,"format":"int32","type":"integer","minimum":2,"maximum":20}},{"description":"Gets results before the specified cursor.","in":"query","name":"before","required":false,"schema":{"type":"string"}},{"description":"Gets results after the specified cursor.","in":"query","name":"after","required":false,"schema":{"type":"string"}}]}},"/deposits":{"get":{"operationId":"ListDeposits","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paginated_BridgeDeposit_"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"List deposits","summary":"List deposits","tags":["Deposits"],"security":[{"basicAuth":[]}],"parameters":[{"description":"Gets results before the specified cursor.","in":"query","name":"before","required":false,"schema":{"type":"string"}},{"description":"Gets results after the specified cursor.","in":"query","name":"after","required":false,"schema":{"type":"string"}},{"description":"The maximum number of items to fetch.","in":"query","name":"perPage","required":false,"schema":{"default":100,"format":"int32","type":"integer","minimum":10,"maximum":1000}}]}},"/deposits/{id}":{"get":{"operationId":"GetDeposit","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BridgeDeposit"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Get deposit details","summary":"Get deposit details","tags":["Deposits"],"security":[{"basicAuth":[]}],"parameters":[{"description":"The deposit id","in":"path","name":"id","required":true,"schema":{"type":"string"}}]}},"/bulk-payouts":{"post":{"operationId":"CreateBulkPayout","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkPayout"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Create a new bulk payout. You will receive a response with the id of your bulk payout, and the\nprocessing will start asynchronously after you receive your response.\n\nYou can check in with the progress of your ongoing bulk payout by using the `GET /bulk-payouts/{id}` endpoint.\n\nIf you want to cancel payouts, use the [Cancel Payout](#tag/payouts/DELETE/payouts/{id}) endpoint.","summary":"Create a bulk payout","tags":["Bulk Payouts"],"security":[{"basicAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBulkPayoutRequest"}}}}},"get":{"operationId":"ListBulkPayouts","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paginated_BulkPayout_"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Endpoint to receive all bulk payouts associated with your account.","summary":"List bulk payouts","tags":["Bulk Payouts"],"security":[{"basicAuth":[]}],"parameters":[{"description":"Gets results before the specified cursor.","in":"query","name":"before","required":false,"schema":{"type":"string"}},{"description":"Gets results after the specified cursor.","in":"query","name":"after","required":false,"schema":{"type":"string"}},{"description":"The maximum number of items to fetch.","in":"query","name":"perPage","required":false,"schema":{"default":100,"format":"int32","type":"integer","minimum":10,"maximum":1000}},{"in":"query","name":"status","required":false,"schema":{"$ref":"#/components/schemas/BulkPayoutStatus"}}]}},"/bulk-payouts/{id}":{"get":{"operationId":"GetBulkPayout","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkPayout"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Endpoint to retrieve the details of an existing bulk payout. The status `RUNNING` is the default\nafter you have posted your bulk payout. It means that the individual payouts are being\nprocessed and not all of them have been processed yet. Once that has happened, the status will\nswitch to `DONE`.\n\nTo list all payouts associated with a specific bulk payout, use the [List Payouts](#tag/payouts/GET/payouts)\nendpoint and pass the bulk payout id as the `bulkPayoutId` query parameter.","summary":"Get bulk payout","tags":["Bulk Payouts"],"security":[{"basicAuth":[]}],"parameters":[{"description":"The bulk payout id","in":"path","name":"id","required":true,"schema":{"type":"string"}}]}},"/api-keys":{"get":{"operationId":"ListApiKeys","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paginated_ApiKey_"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Endpoint to list all api keys associated with your account.","summary":"List api keys.","tags":["ApiKeys"],"security":[{"basicAuth":[]}],"parameters":[{"description":"Gets results before the specified cursor.","in":"query","name":"before","required":false,"schema":{"type":"string"}},{"description":"Gets results after the specified cursor.","in":"query","name":"after","required":false,"schema":{"type":"string"}},{"description":"The maximum number of items to fetch.","in":"query","name":"perPage","required":false,"schema":{"default":100,"format":"int32","type":"integer","minimum":10,"maximum":1000}}]}},"/api-keys/{id}":{"delete":{"operationId":"RevokeApiKey","responses":{"204":{"description":"No content"},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Revoke an existing API key.","summary":"Revoke an API key.","tags":["ApiKeys"],"security":[{"basicAuth":[]}],"parameters":[{"description":"The API key id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}]}},"/api-keys/{id}/allowed-ips":{"post":{"operationId":"ToggleAllowedIp","responses":{"200":{"description":"Ok","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/IpItem"},"type":"array"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"properties":{"code":{"type":"string","description":"Machine-friendly error code\n\nSee the API error code catalog in the documentation for the endpoint surface you are using.","example":"415096"},"message":{"type":"string","description":"Human-readable error message","example":"Invalid email address"},"data":{"$ref":"#/components/schemas/Record_string.unknown_","description":"Additional data related to the error","example":{"email":"invalid@address"}}},"required":["code","message"],"type":"object"}}}}},"description":"Toggle an IPv4 address on this API key's allowlist. If the IP is already\nallowed, it is removed; otherwise it is added. Returns the resulting\nallowlist.","summary":"Toggle an allowed IP for an API key.","tags":["ApiKeys"],"security":[{"basicAuth":[]}],"parameters":[{"description":"The API key id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IpItem"}}}}}}},"servers":[{"url":"https://api.enterprise.airtm.com/v2"},{"url":"https://api.stg.enterprise.airtm.com/v2"}],"tags":[{"name":"Payouts","description":"# Payouts\n\nSend money to recipients worldwide through their Airtm accounts. Payouts use a secure two-step process to prevent accidental payments.\n\n## How Payouts Work\n\n### Two-Step Process\n\n1. **Create** - Validates recipient and reserves funds\n2. **Commit** - Actually sends the money\n\nThis prevents accidental payments and allows for approval workflows.\n\n### One-Step Option\n\nSet `commit: true` when creating to skip the manual commit step for automated workflows.\n\n## Integration Workflows\n\n### Standard Two-Step\n\nCreate payout → Review details → Commit when approved\n\n### Automated Processing\n\nCreate with `commit: true` for immediate processing\n"},{"name":"Bulk Payouts","description":"# Bulk Payouts\n\nProcess multiple payouts efficiently in a single batch operation. Ideal for payroll, affiliate payments, or mass distributions.\n\n## Overview\n\nBulk payouts allow you to submit hundreds or thousands of payout instructions and process them as a coordinated batch, providing better performance and easier management than individual payouts.\n\n## How It Works\n\n1. **Prepare** your payout data with recipient emails and amounts\n2. **Submit** the bulk payout request\n3. **Validation** - System validates all payouts and checks balance\n4. **Processing** - Individual payouts are processed in parallel\n5. **Track** progress and handle any failures\n\n## Validation Rules\n\n### Amount Validation\n\n- Minimum amount: $0.01. If the recipient is a US resident, the minimum amount may be larger.\n- Maximum 2 decimal places allowed\n- Enterprise fee cannot equal or exceed payout amount (unless negative for bonuses)\n- Airtm fee cannot equal or exceed net amount (amount - enterprise fee)\n\n### Data Validation\n\n- Email addresses must be valid format and correspond to active Airtm accounts\n- Notes field is required and cannot exceed 255 characters\n- No malicious patterns allowed in text fields (SQL injection protection)\n- URLs must be valid format when provided\n\n### Batch Validation\n\n- No duplicate payouts within batch (based on email + amount + notes)\n- Total batch amount cannot exceed available account balance\n"},{"name":"Payins","description":"# Payins\n\nThe Payins API enables you to collect payments from users worldwide through their Airtm accounts. This is ideal for e-commerce platforms, service providers, and any business that needs to accept payments from customers across different countries and currencies.\n\n## Overview\n\nPayins allow you to create payment requests that customers can fulfill using their Airtm account balance or connected payment methods. The system handles currency conversion, fee calculation, and provides a seamless checkout experience for your users.\n\n## Key Features\n\n- **Global Payment Collection**: Accept payments from users in 190+ countries\n- **Multiple Payment Methods**: Users can pay with Airtm balance, bank transfers, or connected payment sources\n- **Itemized Billing**: Support for multiple items with quantities and individual pricing\n- **Automatic Currency Conversion**: Handle multiple currencies seamlessly\n- **Secure Checkout**: Hosted payment pages with built-in security\n- **Real-time Status Updates**: Track payment progress with webhooks and status polling\n- **Mobile Optimized**: Responsive design works across all devices\n\n## How Payins Work\n\n### Payment Flow\n\n1. **Create Payment Request**: Generate a payin with item details and amounts\n2. **Redirect Customer**: Send customer to Airtm's secure checkout page\n3. **Customer Authentication**: User logs into their Airtm account\n4. **Payment Processing**: Customer completes payment using available methods\n5. **Confirmation**: Receive real-time notification of payment status\n6. **Fulfillment**: Deliver goods or services upon successful payment\n\n### Checkout Experience\n\nCustomers are redirected to a secure Airtm-hosted checkout page where they can:\n\n- Review itemized billing and total amounts\n- Select their preferred payment method\n- Complete the transaction securely\n- Receive confirmation and receipts\n\n## Checkout Integration\n\n### Redirect URL Structure\n\nThe checkout URL follows the pattern: `{baseUrl}/checkout/{id}`\n\nWhere:\n\n- `baseUrl` is your environment's base URL\n- `id` is the payin identifier returned from creation\n\n### Mobile Considerations\n\nFor mobile applications, configure redirection links to open in the device's default browser rather than in-app web views. This ensures proper authentication flow and better user experience.\n\n### Callback URLs\n\nConfigure callback URLs to handle different payment outcomes:\n\n- **Confirmation URL**: Where customers are redirected after successful payment\n- **Failure URL**: Where customers go if payment fails\n- **Cancel URL**: Where customers are sent if they cancel the payment\n\n## Item Management\n\n### Itemized Billing\n\nPayins support detailed itemization with:\n\n- Individual item descriptions\n- Quantity and unit pricing\n"},{"name":"Me","description":"# Account Management\n\nThe Account Management API provides essential information about your Airtm Enterprise account, including account details, balance information, and configuration settings. This endpoint serves as your primary source for account status and financial data.\n\n## Overview\n\nAccount management functionality enables you to monitor your enterprise account status, check available balances, and access important configuration details needed for payment processing. This information is crucial for managing cash flow, monitoring transaction capacity, and ensuring smooth payment operations.\n\n## Key Features\n\n- **Account Information**: Access enterprise account details and settings\n- **Balance Monitoring**: Real-time balance information\n- **Configuration Access**: Retrieve account settings and limits\n- **Administrative Data**: Access enterprise-specific configuration details\n"},{"name":"Users","description":"# Users\n\nThe Users API provides essential user management capabilities for your Airtm Enterprise integration. This endpoint allows you to verify recipient information, check account status, and ensure successful payout delivery before initiating transactions.\n\n## Overview\n\nUser verification is a critical step in the payout process that helps prevent failed transactions, reduces processing delays, and improves overall payment success rates. The API provides comprehensive user information including account status, verification level, and eligibility for receiving payments.\n\n## Key Features\n\n- **User Verification**: Validate recipient accounts before creating payouts\n- **Status Checking**: Determine if users can receive payments\n- **Account Details**: Access user profile information and verification status\n- **Eligibility Validation**: Confirm compliance and geographic restrictions\n- **Real-time Data**: Get current user status and account information\n\n## Why Verify Users\n\n### Prevent Failed Payouts\n\nVerifying users before creating payouts helps identify potential issues early:\n\n- Inactive or suspended accounts\n- Unverified users who cannot receive payments\n- Geographic restrictions or compliance issues\n- Account limitations or restrictions\n\n### Improve Success Rates\n\nPre-verification significantly improves payout success rates by:\n\n- Ensuring recipients can actually receive payments\n- Identifying verification requirements in advance\n- Confirming account status before reserving funds\n- Reducing processing delays and failures\n\n### Better User Experience\n\nUser verification enables better customer service:\n\n- Provide clear error messages for invalid recipients\n- Guide users through account setup requirements\n- Offer alternative solutions for ineligible recipients\n- Reduce failed payment frustrations\n"},{"name":"Deposits","description":"# Deposits\n\nThe Deposits API provides comprehensive tracking and management of funding transactions for your Airtm Enterprise account. This endpoint enables you to monitor incoming funds, track deposit history, and manage your account's funding sources for seamless payment operations.\n\n## Overview\n\nDeposits represent incoming funds to your enterprise account from various sources including bank transfers, wire transfers, and other funding methods. The API provides detailed tracking of these transactions, enabling better cash flow management and financial reconciliation.\n\n## Key Features\n\n- **Transaction Tracking**: Monitor all incoming fund deposits with detailed status information\n- **Multi-Source Support**: Track deposits from various funding sources and payment methods\n- **Real-time Status**: Get current deposit status and processing information\n- **Historical Data**: Access complete deposit history with filtering and pagination\n- **Metadata Access**: Retrieve detailed transaction information and processing details\n- **Balance Integration**: Understand how deposits affect your account balance\n\n## How Deposits Work\n\n### Funding Process\n\n1. **Initiate Funding**: Start a deposit through your preferred funding method\n2. **Processing**: External payment systems process the incoming transfer\n3. **Tracking**: Monitor deposit status through the API\n4. **Completion**: Funds become available in your enterprise account\n5. **Notification**: Receive confirmation of successful deposit\n6. **Balance Update**: Account balance reflects the new funds\n\n### Deposit Sources\n\nDeposits can originate from various sources:\n\n- Bank wire transfers\n- ACH transfers\n- International bank transfers\n- Partner funding arrangements\n"},{"name":"Reports","description":"# Reports\n\nGenerate detailed financial reports for your Airtm Enterprise account. Reports provide transaction data, audit trails, and downloadable CSV files for accounting and compliance.\n\n## How Reports Work\n\nReports are generated asynchronously to handle large datasets efficiently:\n\n1. **Create** - Submit report request for specific month/year\n2. **Monitor** - Check status until completed\n3. **Download** - Get secure CSV file when ready\n\n## Report Types\n\n### Transaction Reports\n\nComplete transaction data including all payouts and payins with amounts, fees, recipients, and status information.\n\n### Audit Reports\n\nComprehensive audit trails including account balance changes, administrative actions, and system events.\n\n## Core Operations\n\n### Create Report\n\nGenerate a new report for a specific month and year. Reports are processed asynchronously.\n\n### List Reports\n\nGet paginated list of your reports with filtering by type and status.\n\n### Get Report Details\n\nRetrieve information about a specific report including generation status and metadata.\n\n### Download Report File\n\nGet secure download URL for completed reports. URLs expire after 1 hour for security.\n\n## Report Statuses\n\n| Status       | Description        | Next Steps          |\n| ------------ | ------------------ | ------------------- |\n| `PENDING`    | Report queued      | Wait for processing |\n| `PROCESSING` | Being generated    | Monitor status      |\n| `COMPLETED`  | Ready for download | Download file       |\n| `FAILED`     | Generation failed  | Check error, retry  |\n\n## Report Contents\n\n### CSV Format\n\nReports include comprehensive data with columns for transaction IDs, types, statuses, amounts, fees, recipients, and timestamps.\n\n### Data Scope\n\n- All transactions for the specified month\n- Complete fee breakdowns\n- Currency conversion details\n- Compliance and regulatory information\n\n## Best Practices\n\n- Generate reports during off-peak hours when possible\n- Use monthly ranges for better performance\n- Download reports immediately after completion\n- Implement proper retry logic for failed generations\n- Store downloaded reports securely\n\n## Common Issues\n\n**Report Stuck in Pending**\n\n- Check for high system load\n- Contact support if stuck over 30 minutes\n\n**Empty Reports**\n\n- Verify transactions exist for the date range\n- Check timezone settings\n\n**Download URL Expired**\n\n- Generate new download URL\n- URLs expire after 1 hour\n\n## Error Handling\n\n- **Report Not Found (415042)**: Check report ID\n- **Report Not Completed (415044)**: Wait for processing to finish\n- **Invalid Parameters (415054)**: Verify month/year values\n\nFor complete error reference, see [Reason Codes](#description/reason-codes).\n\n## Getting Started\n\n1. Set up [authentication](#description/authentication)\n2. Test report generation in sandbox\n3. Implement status monitoring\n4. Set up secure file download\n\n## Related Resources\n\n- [Payouts](#tag/payouts) - Transaction data included in reports\n- [Account Management](#tag/me) - Check account details\n- [Error Codes](#description/reason-codes) - Troubleshoot issues\n"},{"name":"External Bank Account","description":"# External Bank Account\n\nThe external bank account API provides the capability to register an external bank account where you can withdraw your funds to.\n"},{"name":"External Crypto Account","description":"# External Crypto Account\n\nThe external crypto account API provides the capability to register an external crypto account where you can withdraw your funds to.\n"},{"name":"Withdrawals","description":"# Withdrawals\n\nThe withdrawals API provides the capability to withdraw your funds to a previously registered external account (Bank or Crypto)\n"},{"name":"Webhooks","description":"Webhooks are how services notify each other of events.\n\nAt their core they are just a POST request to a pre-determined endpoint.\nThe endpoint can be whatever you want, and you can just add them from the UI.\nYou normally use one endpoint per service, and that endpoint listens to all of the event types.\n\nFor example, if you receive webhooks from Airtm, you can structure your URL like: `https://www.example.com/webhooks/airtm`.\n\nThe way to indicate that a webhook has been processed is by returning a 2xx (status code 200-299) response to the webhook message within a reasonable time-frame (15s).\n\nIt's also important to disable CSRF protection for this endpoint if the framework you use enables them by default.\n\nAnother important aspect of handling webhooks is to verify the signature and timestamp when processing them.\n\nYou can learn more about it in the signature verification section.\n\n# Adding an Endpoint\n\nIn order to start listening to messages, you will need to configure your endpoints.\n\nAdding an endpoint is as simple as providing a URL that you control and selecting the event types that you want to listen to. You can do this by navigating to the \"Webhooks\" section in the [enterprise dashboard](https://enterprise.airtm.com/settings/webhooks).\n\nIf you don't specify any event types, by default, your endpoint will receive all events, regardless of type.\n\nThis can be helpful for getting started and for testing, but we recommend changing this to a subset later on to avoid receiving extraneous messages.\n\nIf your endpoint isn't quite ready to start receiving events, you can press the \"with Svix Play\" button to have a unique URL generated for you.\n\nYou'll be able to view and inspect webhooks sent to your Svix Play URL, making it effortless to get started.\n\n# Testing Endpoints\n\nOnce you've added an endpoint, you'll want to make sure its working.\n\nThe \"Testing\" tab lets you send test events to your endpoint.\n\nAfter sending an example event, you can click into the message to view the message payload, all of the message attempts, and whether it succeeded or failed.\n\n# Verifying Signatures\n\nWebhook signatures let you verify that webhook messages are actually sent by us and not a malicious actor.\n\nFor a more detailed explanation, check out this article on [why you should verify webhooks](https://docs.svix.com/receiving/verifying-payloads/why).\n\nOur webhook partner Svix offers a set of useful libraries that make verifying webhooks very simple. Here is a an example using Javascript:\n\n```javascript\nimport { Webhook } from 'svix';\n\nconst secret = 'whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw';\n\n// These were all sent from the server\nconst headers = {\n  'svix-id': 'msg_p5jXN8AQM9LWM0D4loKWxJek',\n  'svix-timestamp': '1614265330',\n  'svix-signature': 'v1,g0hM9SsE+OTPJTGt/tmIKtSyZlE3uFJELVlNIOLJ1OE=',\n};\nconst payload = '{\"test\": 2432232314}';\n\nconst wh = new Webhook(secret);\n// Throws on error, returns the verified content on success\nconst payload = wh.verify(payload, headers);\n```\n\nFor more instructions and examples of how to verify signatures, check out their [webhook verification documentation](https://docs.svix.com/receiving/verifying-payloads/how).\n\n# Retries\n\nWe attempt to deliver each webhook message based on a retry schedule with exponential backoff.\n\n## The schedule\n\nEach message is attempted based on the following schedule, where each period is started following the failure of the preceding attempt:\n\n- Immediately\n- 5 seconds\n- 5 minutes\n- 30 minutes\n- 2 hours\n- 5 hours\n- 10 hours\n- 10 hours (in addition to the previous)\n\nIf an endpoint is removed or disabled delivery attempts to the endpoint will be disabled as well.\n\nFor example, an attempt that fails three times before eventually succeeding will be delivered roughly 35 minutes and 5 seconds following the first attempt.\n\n## Manual retries\n\nYou can also use the application portal to manually retry each message at any time, or automatically retry (\"Recover\") all failed messages starting from a given date.\n\n# Troubleshooting Tips\n\nThere are some common reasons why your webhook endpoint is failing:\n\n## Not using the raw payload body\n\nThis is the most common issue. When generating the signed content, we use the raw string body of the message payload.\n\nIf you convert JSON payloads into strings using methods like stringify, different implementations may produce different string representations of the JSON object, which can lead to discrepancies when verifying the signature. It's crucial to verify the payload exactly as it was sent, byte-for-byte or string-for-string, to ensure accurate verification.\n\n## Missing the secret key\n\nFrom time to time we see people simple using the wrong secret key. Remember that keys are unique to endpoints.\n\n## Sending the wrong response codes\n\nWhen we receive a response with a 2xx status code, we interpret that as a successful delivery even if you indicate a failure in the response payload. Make sure to use the right response status codes so we know when message are supposed to succeed vs fail.\n\n## Responses timing out\n\nWe will consider any message that fails to send a response within 15 seconds a failed message. If your endpoint is also processing complicated workflows, it may timeout and result in failed messages.\n\nWe suggest having your endpoint simply receive the message and add it to a queue to be processed asynchronously so you can respond promptly and avoiding getting timed out.\n\n# Failure Recovery\n\n## Re-enable a disabled endpoint\n\nIf all attempts to a specific endpoint fail for a period of 5 days, the endpoint will be disabled. To re-enable a disabled endpoint, go to the webhook dashboard, find the endpoint from the list and select \"Enable Endpoint\".\n\n## Recovering/Resending failed messages\n\nIf your service has downtime or if your endpoint was misconfigured, you probably want to recover any messages that failed during the downtime.\n\nIf you want to replay a single event, you can find the message from the UI and click the options menu next to any of the attempts.\n\nFrom there, click \"resend\" to have the same message send to your endpoint again.\n\nIf you need to recover from a service outage and want to replay all the events since a given time, you can do so from the Endpoint page. On an endpoint's details page, click \"Options > Recover Failed Messages\".\n\nFrom there, you can choose a time window to recover from.\n\nFor a more granular recovery - for example, if you know the exact timestamp that you want to recover from - you can click the options menu on any message from the endpoint page.\n\nFrom there, you can click \"Replay...\" and choose to \"Replay all failed messages since this time.\"\n\n# IP Addresses\n\nWebhooks are sent from the following IP addresses:\n\n- `44.228.126.217`\n- `50.112.21.217`\n- `52.24.126.164`\n- `54.148.139.208`\n- `2600:1f24:64:8000::/56`\n"}],"x-tagGroups":[{"name":"Payout Operations","tags":["Payouts","Bulk Payouts","Users"]},{"name":"Payin Operations","tags":["Payins"]},{"name":"Account","tags":["Me","Deposits","Reports"]},{"name":"Direct Withdrawal","tags":["External Bank Account","External Crypto Account","Withdrawals"]},{"name":"Webhooks","tags":["Webhooks"]}],"webhooks":{"payout.created":{"post":{"operationId":"payout.created","tags":["Webhooks"],"summary":"Payout Created","description":"Triggered when a payout has been created.\nConsider using this event to centralize payout tracking if you have multiple sources.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["data","type"],"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/PayoutResponse","description":"Payout details"},"type":{"type":"string","description":"payout.created","example":"payout.created"}}}}}}}},"payout.completed":{"post":{"operationId":"payout.completed","tags":["Webhooks"],"summary":"Payout completed","description":"A payout has completed","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["data","type"],"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/PayoutResponse","description":"Payout details"},"type":{"type":"string","description":"payout.completed","example":"payout.completed"}}}}}}}},"payout.failed":{"post":{"operationId":"payout.failed","tags":["Webhooks"],"summary":"Payout failed","description":"A payout has failed","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["data","type"],"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/PayoutResponse","description":"Payout details"},"type":{"type":"string","description":"payout.failed","example":"payout.failed"}}}}}}}},"payout.canceled":{"post":{"operationId":"payout.canceled","tags":["Webhooks"],"summary":"Payout canceled","description":"A payout has been canceled","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["data","type"],"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/PayoutResponse","description":"Payout details"},"type":{"type":"string","description":"payout.canceled","example":"payout.canceled"}}}}}}}},"payin.created":{"post":{"operationId":"payin.created","tags":["Webhooks"],"summary":"Payin created","description":"Triggered when a payin has been created.\nConsider using this event to centralize payin tracking if you have multiple sources.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["data","type"],"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/PayinResponse","description":"Payin details"},"type":{"type":"string","description":"payin.created","example":"payin.created"}}}}}}}},"payin.confirmed":{"post":{"operationId":"payin.confirmed","tags":["Webhooks"],"summary":"Payin confirmed","description":"A payin has been confirmed","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["data","type"],"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/PayinResponse","description":"Payin details"},"type":{"type":"string","description":"payin.confirmed","example":"payin.confirmed"}}}}}}}},"payin.failed":{"post":{"operationId":"payin.failed","tags":["Webhooks"],"summary":"Payin failed","description":"A payin has failed","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["data","type"],"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/PayinResponse","description":"Payin details"},"type":{"type":"string","description":"payin.failed","example":"payin.failed"}}}}}}}},"payin.canceled":{"post":{"operationId":"payin.canceled","tags":["Webhooks"],"summary":"Payin canceled","description":"A payin has been canceled","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["data","type"],"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/PayinResponse","description":"Payin details"},"type":{"type":"string","description":"payin.canceled","example":"payin.canceled"}}}}}}}}}}