Skip to main content
Iron gives you full visibility into your customer onboarding — clear status at every stage, written feedback from our compliance team when something needs fixing, and real-time insight into your customer’s payment abilities.

Steps to Onboard and Activate a Customer

1

Create a new customer

POST /customersCreate a customer record. The customer is created in IdentificationRequired status.
curl --request POST \
     --header 'content-type: application/json; charset=utf-8' \
     --header 'idempotency-key: <unique-request-id>' \
     --header 'x-api-key: <your-api-key>' \
     --data '{"name": "new_amazing_customer", "email": "customer@example.com", "customer_type": "Person"}' \
     --url 'https://api.sandbox.iron.xyz/api/customers'
2

Verify the customer's identity

POST /customers/{id}/identifications/v2Create an identification using one of these methods:
  • Hosted Iron KYC link
  • SumSub token sharing
  • Outsourcing
curl --request POST \
     --header 'accept: application/json; charset=utf-8' \
     --header 'idempotency-key: <unique-request-id>' \
     --header 'x-api-key: <your-api-key>' \
     --url 'https://api.sandbox.iron.xyz/api/customers/<customer_id>/identifications/v2' \
     --data '{"type": "Link"}'
3

KYC is approved

Once approved, the customer status transitions to SigningsRequired.
4

Customer signs required documents

GET /customers/{id}/required-signingsRetrieve the required documents and present them to your customer. Mark each as signed via POST /customers/{id}/signings.
curl --request GET \
     --header 'accept: application/json; charset=utf-8' \
     --header 'x-api-key: <your-api-key>' \
     --url 'https://api.sandbox.iron.xyz/api/customers/<customer_id>/required-signings'
Example response from required-signings:
[
  {
    "display_name": "Terms and Conditions",
    "id": "019ababb-ddd6-7f02-8f5d-7469a0e8afb6",
    "url": "https://example.com/terms-and-conditions"
  }
]
Pass the url to your customer for review. When signing, always set content_type to "Url" in the signing request.
5

Customer is activated

Once all required signings are complete, the customer status becomes Active.
6

Check payout rail availability

Check abilities.fiat_payout to confirm payout rails are Active before initiating payouts.
A customer’s status may revert from Active to SigningsRequired or IdentificationRequired if new compliance actions are required (e.g. updated terms and conditions, fraud review, enhanced due diligence).

Handling Missing Information

If an identification becomes incomplete, the customer’s status moves back to IdentificationRequired and a url is returned on the Identification object. Redirect your customer to this URL — it opens a hosted step-up flow that collects only the missing data. This occurs when:
  • A data point is found to be invalid, expired, or inconsistent
  • A limit triggers additional due diligence requirements

Mapping Onboarding Statuses in Your App

Use customerStatus and identificationStatus together to drive a three-stage progress stepper.
customerStatusidentificationStatusStageWhat to show
IdentificationRequiredNoneSubmissionPrompt customer to start KYC
IdentificationRequiredPendingSubmissionPrompt customer to complete KYC
IdentificationRequiredExpiredSubmissionPrevious attempt expired — prompt to restart
IdentificationRequiredDeclinedSubmissionShow review_comment, prompt to retry
IdentificationRequiredProcessedCompliance ReviewShow waiting state — no customer action needed
IdentificationRequiredPendingReviewCompliance ReviewShow waiting state — under active review
SigningsRequiredApprovedActivationKYC approved — present required documents to sign
ActiveApprovedCompleteFully onboarded — customer can transact
Typical compliance review turnaround is 24–48 hours. Customers can re-enter SigningsRequired at any time (e.g. updated terms). Use the abilities endpoint to confirm banking rails are active — that’s when the customer is truly ready to transact.

Tracking EDD Status

Each identification includes a with_edd field that indicates whether Enhanced Due Diligence was applied. This field is an optional boolean:
  • true — EDD was triggered (either by the partner or automatically by Iron’s AML checks)
  • false — EDD was explicitly not required
  • null — Identification was created before this feature was available
with_edd can be set in two ways:
  1. Partner-initiated — Pass with_edd: true (Link flow) or include edd_questionnaire (Token/Person flow) when creating the identification. See Proactively Increasing Customer Limits.
  2. Automatically by Iron — If AML checks determine EDD is required (e.g. customer resides in a high-risk jurisdiction), Iron sets with_edd to true server-side.
Use status and with_edd together to understand where a customer is in the verification process:
statuswith_eddMeaning
Pendingnull / falseStandard KYC in progress
PendingtrueEDD flow in progress
PendingReviewnull / falseStandard KYC under manual review
PendingReviewtrueEDD complete at verification provider, awaiting compliance review
Approvednull / falseStandard KYC approved, no EDD
ApprovedtrueApproved through EDD
Declinednull / falseStandard KYC rejected
DeclinedtrueRejected after EDD review

Edge Cases

customerStatusMeaning
SuspendedBlocked — can happen at any stage. Contact support.
UserRequiredPartner-area user must be created first. Only applies if requires_user is enabled.

Displaying Onboarding Comments to Your Customer

If a customer’s KYC submission is incomplete or needs correction, our onboarding team may provide written feedback explaining what needs to be improved. This feedback is available on the identification object via review_comment and step_status.*.comment fields. Display these comments to your customer so they know exactly what to fix before resubmitting. Show these comments when identificationStatus is Pending or Declined.
Do not display step_status results directly to the customer. The per-step breakdown (e.g. “identity: Declined, selfie: Approved”) creates confusion and support tickets. Instead, extract the comment fields and combine them into a single message.
Example identification response with feedback:
{
  "id": "abc-123",
  "status": "Declined",
  "with_edd": false,
  "review_comment": "Please provide a clearer photo of your ID.",
  "step_status": {
    "identity": { "result": "Declined", "comment": "Document is blurry", "retry": true },
    "selfie": { "result": "Approved", "comment": null, "retry": false },
    "questionnaire": { "result": "Approved", "comment": null, "retry": false }
  }
}
Extract and display all comments in a single message box:
function getVerificationMessages(identification: Identification): string[] {
  const messages: string[] = [];
  if (identification.step_status) {
    for (const step of Object.values(identification.step_status)) {
      if (step?.comment) { messages.push(step.comment); }
    }
  }
  if (identification.review_comment) {
    messages.push(identification.review_comment);
  }
  return messages;
}

API Endpoints

EndpointPurpose
GET /customers/{id}Customer object with status and abilities
GET /customers/{id}/identificationsIdentifications with status, step_status, and review_comment
GET /customers/{id}/abilitiesCustomer capabilities including fiat_deposit and fiat_payout status

Status Reference

Customer Status

Returned on the customer object.
StatusDescription
IdentificationRequiredMust complete KYC/KYB
SigningsRequiredMust sign required documents
ActiveFully onboarded — can transact
SuspendedBlocked for compliance or fraud reasons
UserRequiredPartner-area user must be created first

Identification Status

Returned on each identification object.
StatusDescription
PendingCustomer has not started
ProcessedDocuments submitted, awaiting review
PendingReviewUnder compliance review
ApprovedApproved
DeclinedRejected
ExpiredExpired due to inactivity
Typical Flow: PendingProcessedPendingReviewApproved / Declined The identification object also includes with_edd (boolean, nullable) to indicate whether EDD was applied. See Tracking EDD Status for the full interpretation table.

Ability Status

Returned under abilities.fiat_payout and abilities.fiat_deposit.
StatusDescription
ActiveAvailable for use
PendingActivation in progress
UnavailableNot offered for this customer
BlockedBlocked for this customer
MaintenanceTemporarily unavailable