Reusable KYC Token Sharing

Reuse identity verifications you've already collected through Persona or Sumsub instead of asking your users to verify again with Coinflow.

Overview

If you already verify users through Persona or Sumsub, you can share that existing verification with Coinflow instead of asking your users to verify a second time. Reusing the verification gives your users a seamless payout experience and keeps your existing identity infrastructure as the source of truth.

Who should use this method

Reusable KYC token sharing is the right path for merchants who:

  • Already run an identity verification program through Persona or Sumsub.
  • Have users who are already verified through that provider.
  • Want to avoid asking those users to re-verify with Coinflow.

If you don’t yet run your own KYC, use Coinflow’s prebuilt KYC instead.

How it works

Regardless of which provider you use, the flow is the same:

  1. Your existing KYC provider produces a share token representing the verified user.
  2. You pass that share token to Coinflow’s /withdraw/kyc/share-token endpoint, along with a vendor field identifying the provider.
  3. Coinflow ingests the verification data and creates a Withdrawer record. The user can now receive payouts without re-verifying.

UI integration: If you use Coinflow’s prebuilt withdraw UI (e.g. CoinflowWithdraw), call the share-token endpoint before rendering the component so the verification record exists when the UI loads.

Setup

The setup steps differ by provider — pick the tab that matches your stack.

Persona share tokens use Persona’s Connect data-sharing partnership feature.

Step 1: Establish a Persona Connect partnership with Coinflow

Reach out to a Coinflow integrations representative to set up the Persona Connect partnership between your Persona account and Coinflow. You’ll receive a Coinflow connection ID once the partnership is approved.

Step 2: Generate a share token for the verified user

Call Persona’s Create Share Token endpoint to mint a share token for the user’s completed Inquiry, referencing the Coinflow connection ID from Step 1:

Create Share Token
1curl -X POST https://api.withpersona.com/api/v1/connect/share-tokens \
2 -H "Authorization: Bearer <YOUR_PERSONA_API_KEY>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "data": {
6 "attributes": {
7 "connection-id": "<COINFLOW_CONNECTION_ID>",
8 "source-id": "<INQUIRY_ID>"
9 }
10 }
11 }'

Step 3: Register the user with Coinflow

Call Coinflow’s Register User Via Share Token endpoint with vendor: "persona" and the share token from Step 2.

POST
/api/withdraw/kyc/share-token
1curl -X POST https://api-sandbox.coinflow.cash/api/withdraw/kyc/share-token \
2 -H "x-coinflow-auth-user-id: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "vendor": "sumsub",
6 "shareToken": "string",
7 "country": "string",
8 "email": "string"
9}'
Response
1{
2 "withdrawer": {
3 "_id": "string",
4 "wallet": "string",
5 "blockchain": "solana",
6 "wallets": [
7 {
8 "wallet": "string",
9 "blockchain": "solana"
10 }
11 ],
12 "email": "string",
13 "availability": {
14 "status": "Functional",
15 "reason": "string",
16 "editor": "string",
17 "updatedAt": "2024-01-15T09:30:00Z"
18 },
19 "currency": "USD",
20 "merchant": "string",
21 "verification": {
22 "reference": "string",
23 "status": "pending",
24 "vendor": "middesk",
25 "name": "string",
26 "attested": true,
27 "shareToken": "string",
28 "shareTokenStatus": "string",
29 "sessionToken": "string"
30 },
31 "riskScoreOverride": true,
32 "country": "string",
33 "user": true,
34 "watchlistExempt": "Unknown",
35 "originalCurrency": "USD",
36 "geoBlockOverride": {
37 "reason": "string",
38 "setBy": "string",
39 "setAt": "2024-01-15T09:30:00Z",
40 "expiresAt": "2024-01-15T09:30:00Z"
41 },
42 "createdAt": "2024-01-15T09:30:00Z",
43 "dwolla": {
44 "customerId": "string",
45 "status": "pending",
46 "acceptedTerms": "2024-01-15T09:30:00Z",
47 "verification": {
48 "reference": "string",
49 "status": "pending",
50 "vendor": "middesk",
51 "name": "string",
52 "attested": true,
53 "shareToken": "string",
54 "shareTokenStatus": "string",
55 "sessionToken": "string"
56 }
57 },
58 "watchlistId": "string"
59 }
60}

When you call Get Withdrawer after registration, Coinflow checks the share-token status to confirm the verification is complete before returning the withdrawer record. If Coinflow needs fields your inquiry didn’t capture, the user is prompted to fill in the remaining fields.

Next steps

After registering a withdrawer through token sharing, the flow is the same as any other payout:

  1. Get the withdrawer to confirm verification.status is approved or attested.
  2. Add a payout destination (bank account, debit card, IBAN, or PIX) — or use the Bank Authentication UI.
  3. Initiate the payout.

See the full merchant payout guide for end-to-end implementation.