BluebulbAPI
    POST

    Create a payout

    POST{baseUrl}/api/payouts

    Sends money from one of your balances to a bank account. Pay out in the same currency, or in a different one: Orbita converts first, then pays the beneficiary.

    Authentication

    Send your API key and a request signature on every call. Requests must also come from an IP address on your allowlist — see Authentication.

    Headers

    x-api-key
    required
    string
    Your API key, <appId>.<secret>. See Authentication.
    X-Signature
    required
    string
    Base64 RSA-SHA256 signature of the request. See Request signing.
    X-Signature-Timestamp
    required
    string
    Unix time in milliseconds used in the signature. Must be within 5 minutes of Orbita's clock.
    Content-Type
    required
    string
    application/json, or multipart/form-data when the endpoint accepts a file.

    Body parameters

    customerReference
    required
    string
    Your reference for this payout, max 100 characters. Must be unique across your business's payouts — a reused value is rejected with 409. You can look the payout up by it later.
    amount
    required
    number
    Amount to debit from sourceCurrency, in major units (e.g. 250000.50). Must be greater than 0.
    sourceCurrency
    required
    string
    Currency to debit. Lowercase currency code, e.g. ngn, usd, gbp.
    destinationCurrency
    required
    string
    Currency the beneficiary receives. The same as sourceCurrency for an ordinary payout; a different currency makes this a cross-currency payout.
    tradeType
    optional
    string
    LOCAL, FX_LOCAL or FX_OFFSHORE. Use FX_OFFSHORE to pay a bank outside Nigeria; this makes the offshore fields and a supporting document required.
    beneficiaryId
    optional
    string (uuid)
    ID of a beneficiary saved on your Orbita dashboard. For a cross-currency payout, the beneficiary's currency must be destinationCurrency. When set, the account fields below are not needed.
    narration
    optional
    string
    Narration sent with the payout.
    comment
    optional
    string
    Internal note, max 500 characters.
    conversionId
    optional
    string (uuid)
    Same-currency payouts only. ID of a completed conversion whose toCurrency equals sourceCurrency, to link this payout to the conversion that funded it. Each conversion can fund only one payout.
    file
    conditional
    file
    Supporting document — PNG, JPEG, PDF, DOC or DOCX, max 5 MB. Required when tradeType is FX_OFFSHORE. Send the request as multipart/form-data to attach it; see signing multipart requests.

    Beneficiary account

    Send these when you are not using a saved beneficiaryId.

    destinationAccountNumber
    conditional
    string
    Beneficiary account number. Required unless beneficiaryId is set.
    destinationAccountName
    conditional
    string
    Beneficiary account name. Required unless beneficiaryId is set (for FX_OFFSHORE, recipientIBAN can be sent instead).
    destinationBankCode
    conditional
    string
    Beneficiary bank code, e.g. 058. Take it from List banks — codes depend on the payment provider. Required unless beneficiaryId is set or tradeType is FX_OFFSHORE.
    destinationBankName
    conditional
    string
    Beneficiary bank name. Required for FX_OFFSHORE without beneficiaryId.

    Offshore payouts (FX_OFFSHORE)

    Required when tradeType is FX_OFFSHORE and no beneficiaryId is sent, unless marked optional.

    recipientAccountType
    conditional
    string
    Type of the recipient's account.
    recipientIBAN
    conditional
    string
    Recipient IBAN. Required if destinationAccountName is not sent.
    recipientCountry
    conditional
    string
    Recipient's country, ISO 3166-1 alpha-2 (e.g. GB). Must be a country Orbita pays to.
    recipientState
    conditional
    string
    Recipient's state or region.
    recipientCity
    conditional
    string
    Recipient's city.
    recipientAddressLine1
    conditional
    string
    Recipient's street address.
    recipientAddressLine2
    optional
    string
    Additional address line.
    postalCode
    optional
    string
    Recipient's postal code.
    bankCountry
    conditional
    string
    Bank's country, ISO 3166-1 alpha-2 (e.g. GB). Must be a country Orbita pays to.
    bankState
    conditional
    string
    Bank's state or region.
    bankCity
    conditional
    string
    Bank's city.
    bankAddressLine1
    conditional
    string
    Bank's street address.
    bankAddressLine2
    optional
    string
    Additional bank address line.
    bankPostCode
    optional
    string
    Bank's postal code.
    swiftCode
    conditional
    string
    Bank SWIFT/BIC. Required unless routingNumber is sent.
    routingNumber
    conditional
    string
    Bank routing number. Required unless swiftCode is sent.

    Behaviour

    Your business must have completed KYC verification. The amount debited from your sourceCurrency balance must be covered by that balance and fall within your daily and monthly limits.

    Domestic payouts carry no fee. Offshore payouts carry a payout fee, applied one of two ways depending on how the fee is configured: deducted from the payout (your balance is debited amount; the beneficiary receives amount − fee, shown as amountSent) or charged on top (your balance is debited amount + fee; the beneficiary receives amount). The response's fee and amountSent show which applied.

    customerReference makes retries safe: a reference that's already been used is rejected with 409, and so is a second request with the same reference while the first is still being processed — so a retried request can't pay twice. Look the payout up by that reference with Get a payout, and check its details match before treating the retry as successful.

    Same-currency payouts start as queued, except NGN payouts, which go straight into review and start as pending. Track progress with Get a payout.

    Send JSON, or multipart/form-data when attaching a supporting document.

    Cross-currency payouts Rolling out

    When destinationCurrency differs from sourceCurrency, Orbita converts amount at the current rate, then pays the beneficiary the full converted amount once the conversion completes. quoteCode isn't supported here, and conversionId is rejected.

    Before any money moves, Orbita checks the customerReference, your destinationCurrency transaction limit and — when the payout fee is charged on top — that your destinationCurrency balance can cover it, using an estimate at the current rate. The conversion then debits sourceCurrency straight away.

    The response has type: "cross_currency" and describes the conversion, not a payout. Track it with Get a conversion using conversionId: payoutIntent.status moves from pending to created (with payoutId) or failed (with failureReason). Until the payout is created, Get a payout by customerReference returns 404.

    Everything is checked again against the real converted amount when the payout is created. If it fails then, the converted funds stay in your destinationCurrency balance — pay them out with a same-currency payout, passing the conversionId. If the conversion itself fails, the source amount is refunded.

    Response

    data.type says which flow ran. For payout, the rest of data is the new payout. For cross_currency, see the table below. Every response is wrapped in the standard envelope.

    typeRolling out
    string
    payout for a same-currency payout, cross_currency for a cross-currency one.
    id
    string (uuid)
    Payout ID.
    customerReference
    string
    Your reference for the payout.
    status
    string
    queued, pending, successful or failed. See Statuses.
    sourceCurrency
    string
    Currency debited.
    destinationCurrency
    string
    Currency the beneficiary receives.
    amount
    number
    Payout amount (2 decimal places).
    fee
    number
    Fee charged for the payout. 0 when no fee applies — same-currency payouts only carry a fee when they are offshore.
    amountSent
    number
    Amount the beneficiary receives. amount minus fee when the fee is deducted from the payout; equal to amount when the fee is charged on top or there is no fee.
    destinationAmount
    number
    Payout amount in destinationCurrency, before any deducted fee.
    exchangeRate
    number
    Exchange rate recorded on the payout (up to 8 decimal places).
    destinationAccountNumber
    string
    Beneficiary account number.
    destinationAccountName
    string
    Beneficiary account name.
    destinationBankCode
    string
    Beneficiary bank code.
    destinationBankName
    string
    Beneficiary bank name.
    narration
    string
    Narration sent with the payout.
    refundStatus
    string | null
    refunded once a failed payout's funds have been returned to your balance, otherwise null.
    isGreylisted
    boolean
    true when the payout has been flagged for additional compliance review.
    conversionIdRolling out
    string | null
    ID of the conversion linked to this payout, or null.
    createdAt
    string (datetime)
    When the payout was created.
    updatedAt
    string (datetime)
    When the payout last changed.

    When type is cross_currency

    typeRolling out
    string
    cross_currency.
    conversionIdRolling out
    string (uuid)
    ID of the funding conversion. Use it to track the payout.
    statusRolling out
    string
    Conversion status, processing when accepted.
    sourceCurrencyRolling out
    string
    Currency debited.
    destinationCurrencyRolling out
    string
    Currency the beneficiary receives.
    sourceAmountRolling out
    number
    Amount debited, in sourceCurrency.
    appliedRateRolling out
    number
    Raw rate applied.
    appliedRateDisplayRolling out
    number
    The rate as people quote it, e.g. 1600 for ngn→usd.
    estimatedDestinationAmountRolling out
    number
    Converted amount the payout will be created for, before payout fees.
    proposedCompletionTimeRolling out
    string (datetime)
    When the conversion is expected to complete.

    Errors

    Errors specific to this endpoint:

    400
    Validation failed
    A field is missing or invalid, including a bankCountry or recipientCountry Orbita doesn't support. data.errors lists each problem.
    400
    conversionId can only be used when sourceCurrency and destinationCurrency match.
    conversionId was sent with different currencies.
    400
    You must be verified to transfer
    Your business hasn't completed KYC verification (cross-currency: You must be verified to swap currency).
    400
    Insufficient funds
    Your sourceCurrency balance can't cover the debit: amount, plus fee when the fee is charged on top.
    400
    This transaction exceeds your Daily limit of NGN 50000000
    The payout would go over your daily or monthly limit (message names the limit).
    400
    A supporting document is required for offshore payouts
    tradeType is FX_OFFSHORE and no file was attached.
    400
    File too large
    The attached file is over 5 MB.
    400
    Conversion not found
    conversionId doesn't exist on your business.
    400
    Conversion has not completed yet
    conversionId points to a conversion that isn't completed.
    400
    Conversion's destination currency does not match this payout's currency
    The conversion's toCurrency isn't sourceCurrency.
    400
    Adaobi Traders Ltd receives GBP, not USD
    Cross-currency: the saved beneficiary's currency isn't destinationCurrency.
    400
    No rate found for ngn to kes
    Cross-currency: Orbita doesn't currently offer the pair.
    400
    No active payout provider found for currency: kes
    Payouts aren't currently available in this currency.
    409
    customerReference "INV-90871" has already been used for another payout.
    customerReference was used before.
    409
    Another request with customerReference "INV-90871" is still being processed.
    An earlier request with the same customerReference hasn't finished yet. Wait, then look the payout up.
    409
    Conversion "6f1c2b7e-4d2a-4c8e-9b1a-2f7d3e8a9c10" has already been used for another payout.
    conversionId already funds another payout.

    Plus the errors every endpoint can return — authentication, signing, rate limiting and server errors. See Responses & errors.