Skip to content
API DocsDocs

Complete APM Payout KYC

APM Payouts — Complete APM Payout KYC

12 min readUpdated Oct 30, 2026

POST /api/v1/payouts/apm/kyc/{transactionId}

Submits the customer's identity data for a payout that requires KYC. The required data varies by payout method — the example below carries the data PayID asks for.

Guide: APM Identity Verification — conceptual walkthrough, flow diagrams, and integration patterns.

#Headers

HeaderValue
Content-Typeapplication/json
AuthorizationBearer {token} — see Authentication

#Path Parameters

ParameterTypeRequiredDescription
transactionIdintegerYestransactionId of the payout that returned KYC_REQUIRED.

#Request Body Parameters

FieldTypeRequiredDescription
kycDataObject — See KycDataYesCustomer identity data for any payment method that asks for verification. Fields are optional in the schema; the payment method decides which are required, and missing or unsupported ones are returned in kycResponseData.errors. The payment method's guide lists its required data.
FieldTypeRequiredDescription
personObject — See KycPersonNo
addressObject — See KycAddressNo
documentsArray<KycDocument>NoIdentity documents.
additionalFieldsMap<String, String>NoExtra fields, only for payment methods whose guide lists them.
FieldTypeRequiredDescription
firstNameStringNoLegal first name.
lastNameStringNoLegal last name.
dateOfBirthStringNoDate of birth, YYYY-MM-DD.
middleNameStringNoMiddle name, for payment methods that use it.
nationalityStringNoISO 3166-1 alpha-2 nationality code, for payment methods that use it.
genderString (MALE, FEMALE, OTHER)NoGender, for payment methods that use it.
FieldTypeRequiredDescription
line1StringNoResidential address line 1.
line2StringNoResidential address line 2, if applicable.
cityStringNoResidential city.
stateStringNoResidential state or region, if applicable.
postcodeStringNoResidential postal code.
countryStringNoResidential country, ISO 3166-1 alpha-2 code.
FieldTypeRequiredDescription
typeString (PASSPORT, DRIVING_LICENCE, NATIONAL_ID, OTHER)NoDocument type. OTHER with customType only for payment methods whose guide lists it.
countryStringNoIssuing country, ISO 3166-1 alpha-2 code.
numberStringNoDocument number.
imagesArray<KycImage>NoImages of this document, identified by side rather than array position.
customTypeStringNoDocument kind when type is OTHER.
FieldTypeRequiredDescription
sideString (FRONT, BACK, SELFIE, OTHER)NoImage role within the document.
contentTypeStringNoMedia type of the image, for example image/jpeg.
dataStringNoBase64 image without a data-URL prefix. The payment method's guide lists accepted formats and sizes; the whole request must not exceed 16 MiB.

#Response

FieldTypeDescription
requestIdStringThe requestId of the original payment or payout. Not an input or retry key for this KYC endpoint.
transactionIdStringUnique transaction identifier assigned by Exirom. Use this ID to query status, retrieve info, or reference the transaction in support requests.
transactionStatusString (NEW, PENDING, FAILED, REFUNDED, CUSTOMER_VERIFICATION, ...)CUSTOMER_VERIFICATION while kycResponseData.errors must be corrected; otherwise the status of the continued transaction, as in the payment method's usual response, or FAILED.
declineCodeIntegerDecline code of a FAILED transaction. 4034, 4035 and 4036 are verification declines; other decline codes are possible when the continued transaction is declined.
apmResponseDataObject — See ApmResponseDataPayment method-specific response data. Structure varies by APM type. May include redirect URLs, QR codes, or provider references.
kycResponseDataObject — See KycResponseDataPresent only when the submitted data was not accepted. apmResponseData is then absent.
paymentTypeString (APM)Payment type identifier: CARD for card transactions, APM for alternative payment methods.
FieldTypeDescription
providerTransactionIdStringTransaction identifier from the upstream payment service provider.
iframeUrlStringPage to embed in an iframe. With actionType KYC_REQUIRED it is the identity verification form: add the parentOrigin query parameter and relay its messages as described in the KYC Widget Integration guide. With REDIRECTION some providers also return an embeddable version of redirectUrl.
actionTypeString (REDIRECTION, QR, NONE, REFERENCE, KYC_REQUIRED)
qrDataString
qrDeepLinkString
qrValueString
referencesArray<ApmResponseReference>
customerInstructionsByLanguageMap<String, String>Markdown payment instructions keyed by language code. Use the selected language, falling back to en, then an available translation. No instructions are displayed when the map is absent or empty.
redirectUrlStringFull-page redirect URL where the customer completes payment. Use this for standard redirect flow.
paymentTypeString (BANK_TRANSFER, CARD_PAYMENT, E_WALLET, MOBILE_WALLET, CASH, ...)Payment type identifier: CARD for card transactions, APM for alternative payment methods.
paymentMethodString (PAYPAL, IDEAL, GOOGLE_PAY, APPLE_PAY, EXTERNAL_HPP_GOOGLE_PAY, ...)APM method identifier (e.g. SMART_BANK_TRANSFER, PIX_QR). See apmPayload References.
FieldTypeDescription
errorsArray<KycValidationError>Every error found in the submission. Show each at its field, or at form level when field is null.
FieldTypeDescription
keyString
labelString
valueString
FieldTypeDescription
codeString (KYC_INVALID_FIELD, KYC_INVALID_IMAGE, KYC_IMAGE_TOO_LARGE, KYC_VALIDATION_FAILED)An error with field set to null applies to the submission as a whole rather than to one field.
fieldStringPath relative to kycData with zero-based indices, for example person.dateOfBirth; null for a form-level error.
messagesByLanguageMap<String, String>Customer-facing messages keyed by lowercase ISO 639-1 language code: en, es, pt. Submitted values are never echoed.
{
  "kycData": {
    "person": {
      "firstName": "Alex",
      "lastName": "Example",
      "dateOfBirth": "1990-05-01",
      "gender": "FEMALE"
    },
    "address": {
      "line1": "1 Example Street",
      "city": "Sydney",
      "state": "NSW",
      "postcode": "2000",
      "country": "AU"
    },
    "documents": [
      {
        "type": "DRIVING_LICENCE",
        "country": "AU",
        "number": "EXAMPLE123",
        "images": [
          {
            "side": "FRONT",
            "contentType": "image/png",
            "data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+jD1cAAAAASUVORK5CYII="
          },
          {
            "side": "BACK",
            "contentType": "image/png",
            "data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+jD1cAAAAASUVORK5CYII="
          }
        ]
      }
    ]
  }
}
{
  "requestId": "original-payout-request",
  "transactionId": "123456790",
  "transactionStatus": "PENDING",
  "paymentType": "APM",
  "apmResponseData": {
    "paymentMethod": "PAY_ID",
    "paymentType": "BANK_TRANSFER",
    "actionType": "NONE",
    "providerTransactionId": "payout-1"
  }
}

Idempotency: After an unconfirmed response (503 or 504), retry the same transaction with the same KYC data. After input errors, submit the corrected data for the same transaction. This endpoint accepts no requestId; never create a new transaction automatically.

#Error Responses

HTTP StatusDescription
400Malformed request, for example kycData is missing. Fix the request; the transaction is unchanged.
401Merchant authentication required.
403Missing payment-write permission, or the payout belongs to another merchant.
404No payout with this transactionId; a payment transactionId also returns 404 here.
413Request body larger than 16 MiB, or sent without Content-Length. Send fewer or smaller images; the transaction is unchanged.
422The payout is not waiting for KYC: its action is not KYC_REQUIRED or it already has a result. Do not resubmit; read the payout status instead.
503Result unconfirmed: verification could not be reached, or the platform returned an unexpected error. The payout is not declined by this response. Retry the same transaction with the same data a bounded number of times, then read the transaction status instead of retrying further.
504Result unconfirmed: verification did not finish in time. Retry the same transaction with the same data. If the payout has meanwhile received a result, the retry returns 422 and the status endpoint shows it.
429Too Many Requests — rate limit exceeded. Back off before retrying.
500Internal Server Error — an unexpected error occurred. Retry with exponential backoff.
curl -X POST https://sandbox.api.exirom.com/api/v1/payouts/apm/kyc/12345 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -d '{
  "kycData": {
    "person": {
      "firstName": "Alex",
      "lastName": "Example",
      "dateOfBirth": "1990-05-01",
      "gender": "FEMALE"
    },
    "address": {
      "line1": "1 Example Street",
      "city": "Sydney",
      "state": "NSW",
      "postcode": "2000",
      "country": "AU"
    },
    "documents": [
      {
        "type": "DRIVING_LICENCE",
        "country": "AU",
        "number": "EXAMPLE123",
        "images": [
          {
            "side": "FRONT",
            "contentType": "image/png",
            "data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+jD1cAAAAASUVORK5CYII="
          },
          {
            "side": "BACK",
            "contentType": "image/png",
            "data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+jD1cAAAAASUVORK5CYII="
          }
        ]
      }
    ]
  }
}'

#Try It

SandboxTry it
https://sandbox.api.exirom.com/api
transactionId=
Was this helpful?