Skip to content
Logo

POST /customers/:id/kyc/sync-approvals

Catch a customer up with the verification checks that exist today. As new account types and capabilities roll out (for example Portage-issued USD virtual accounts), a customer who was verified before the rollout may be missing the review that gates them. This endpoint files the customer's saved profile with every check they have not started yet — and only those.

Checks that already ran are never disturbed: an approval stays an approval, a review in flight keeps running, and a rejected check still goes through the normal submit correction flow. Calling this when the customer is already up to date is a harmless no-op that returns the current state.

Dispatches against the right flow based on the customer's type: KYC for individuals, KYB for businesses.

What to expect after calling

  • RFIs. The new checks review the customer from scratch, so expect requests for information by email while they run. Answer them the same way as during initial onboarding.
  • A webhook on completion. When the review concludes, a customer.kyc.status_changed or customer.kyb.status_changed event fires with the new rolled-up status. If the customer already stands approved and the new check clears without moving that status, the event fires with the status unchanged and expanded: true.
  • New approvals appear on the approvals endpoints. Once approved, the corresponding entries on GET /customers/:id/virtual-account-approvals (and the pay-in/payout lists) move to approved, and the matching account can be created.

A typical flow: a customer requests a USD virtual account → GET /customers/:id/virtual-account-approvals shows the USD entry as not_started → call this endpoint → answer any RFIs → receive the status webhook → create the account.

Request body

Empty.

Response 200

The CustomerState after syncing, wrapped in the { type, state } envelope. A newly filed check puts the rolled-up status back under_review until it concludes.

{
  "type": "individual",
  "state": {
    "kyc_status": "under_review",
    "kyc_link": null,
    "missing_fields": [],
    "last_synced_at": "2026-08-25T16:00:00.000Z",
    "rejection_reason": null,
    "pending_rfi": false,
    "last_submitted_at": "2026-08-25T09:00:00.000Z"
  }
}

For businesses, state.kyb_status and state.kyb_link replace the kyc_* fields. The rest is identical.

Errors

  • 403 KybNotApproved: your organization's own KYB is not approved yet.
  • 404: unknown id, or the customer has never been submitted — use submit for the first submission.
  • 409 VerificationPaused: verification is paused by a compliance hold; syncing is disabled until the hold clears.
  • 409: another submission for this customer is already in progress.
  • 422 KycProfileIncomplete / 422 KybProfileIncomplete: the saved profile is missing fields the new checks require — the error carries the field paths. Update the profile and retry.

Example

curl -X POST "$SEISMIC_ORCHESTRATION_URL/v0/customers/$CUSTOMER_ID/kyc/sync-approvals" \
  -H "Api-Key: $SEISMIC_ORCHESTRATION_API_KEY"