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_changedorcustomer.kyb.status_changedevent fires with the new rolled-up status. If the customer already standsapprovedand the new check clears without moving that status, the event fires with the status unchanged andexpanded: 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 toapproved, 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 — usesubmitfor 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"