Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 10 additions & 12 deletions mintlify/global-p2p/onboarding/configuring-customers.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ Response:

3. Redirect the customer to `kycUrl`, or pass the optional `token` to the provider's SDK to embed verification directly in your UI.
4. After the user is redirected back to your app, they can continue with account setup until KYC review is complete.
5. Track the decision via the `KYC_STATUS` webhook, or poll `GET /customers/{customerId}` and inspect `kycStatus`. On `APPROVED`, the customer is ready to transact and you can unlock funding.
5. Track the decision via the `CUSTOMER.KYC_APPROVED` / `CUSTOMER.KYC_REJECTED` webhook (use the `CUSTOMER.KYB_*` siblings for business customers), or poll `GET /customers/{customerId}` and inspect `kycStatus`. On `APPROVED`, the customer is ready to transact and you can unlock funding.

### Handling KYC/KYB Webhooks

Expand Down Expand Up @@ -248,9 +248,9 @@ curl -sS -X POST "https://api.lightspark.com/grid/2025-10-13/customers/bulk/csv"
The CSV file should follow a specific format with required and optional columns based on customer type. Here's an example:

```csv
umaAddress,platformCustomerId,customerType,fullName,birthDate,addressLine1,city,state,postalCode,country,accountType,accountNumber,bankName,platformAccountId,businessLegalName,routingNumber,accountCategory
$john.doe@uma.domain.com,cust_user123,INDIVIDUAL,John Doe,1990-01-15,123 Main St,San Francisco,CA,94105,US,US_ACCOUNT,123456789,Chase Bank,chase_primary_1234,,222888888,SAVINGS
$acme@uma.domain.com,cust_biz456,BUSINESS,,,400 Commerce Way,Austin,TX,78701,US,US_ACCOUNT,987654321,Bank of America,boa_business_5678,Acme Corp,121212121,CHECKING
umaAddress,platformCustomerId,customerType,fullName,birthDate,addressLine1,city,state,postalCode,country,businessLegalName
$john.doe@uma.domain.com,cust_user123,INDIVIDUAL,John Doe,1990-01-15,123 Main St,San Francisco,CA,94105,US,
$acme@uma.domain.com,cust_biz456,BUSINESS,,,400 Commerce Way,Austin,TX,78701,US,Acme Corp
```

<Tip>
Expand All @@ -277,21 +277,19 @@ Example job status response:

```json
{
"jobId": "job_123456789",
"id": "Job:019542f5-b3e7-1d02-0000-000000000006",
"status": "PROCESSING",
"progress": {
"total": 5000,
"processed": 2500,
"successful": 2499,
"failed": 1
"successful": 2450,
"failed": 50
},
"errors": [
{
"platformCustomerId": "cust_biz456",
"error": {
"code": "validation_error",
"message": "Invalid bank account number"
}
"correlationId": "cust_biz456",
"code": "INVALID_FIELD",
"message": "Invalid bank account number"
}
]
}
Expand Down
18 changes: 9 additions & 9 deletions mintlify/global-p2p/onboarding/invitations.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -98,15 +98,15 @@ they claim it. The response will include the payment amount in the invitation de
}
```

When the invitee claims the invitation, your platform will receive an `INVITATION_CLAIMED` webhook. At this point, you should:
When the invitee claims the invitation, your platform will receive an `INVITATION.CLAIMED` webhook. At this point, you should:

1. Check the `amountToSend` field in the webhook payload
2. Create a quote for the payment amount (sender-locked)
3. Execute the payment to the invitee's UMA address

Note that the actual sending of the payment must be done by your platform after receiving the webhook. If your platform either does not send the payment or the payment fails, the invitee will not receive the amount. The `amountToSend` field is primarily used for display purposes on the claiming side of the invitation.

These payments can only be sender-locked, meaning that the sender will not know ahead of time how much the receiver will receive in their local currency. The exchange rate will be determined at the time the payment is executed. If you'd like, you can also send a push notification to your sending user when you receive the `INVITATION_CLAIMED` webhook and have them approve the payment interactively instead.
These payments can only be sender-locked, meaning that the sender will not know ahead of time how much the receiver will receive in their local currency. The exchange rate will be determined at the time the payment is executed. If you'd like, you can also send a push notification to your sending user when you receive the `INVITATION.CLAIMED` webhook and have them approve the payment interactively instead.

### Best practices

Expand All @@ -132,7 +132,7 @@ A successful claim will:

1. Associate the invitee's UMA address with the invitation
2. Change the invitation status from `PENDING` to `CLAIMED`
3. Trigger an `INVITATION_CLAIMED` webhook to notify the inviter's platform of the claim
3. Trigger an `INVITATION.CLAIMED` webhook to notify the inviter's platform of the claim

## Cancelling Invitations

Expand Down Expand Up @@ -177,7 +177,7 @@ You can check the status of an invitation at any time by making a GET request to

## Webhook Integration

When an invitation is claimed, the Grid API will send an `INVITATION_CLAIMED` webhook to your configured webhook endpoint. This allows you to:
When an invitation is claimed, the Grid API will send an `INVITATION.CLAIMED` webhook to your configured webhook endpoint. This allows you to:

- Track invitation usage and conversion rates
- Apply referral bonuses or rewards to the inviter
Expand All @@ -187,18 +187,18 @@ Example webhook payload:

```json
{
"invitation": {
"id": "Webhook:019542f5-b3e7-1d02-0000-000000000008",
"type": "INVITATION.CLAIMED",
"timestamp": "2023-09-01T15:45:00Z",
"data": {
"code": "019542f5",
"createdAt": "2023-09-01T14:30:00Z",
"claimedAt": "2023-09-01T15:45:00Z",
"inviterUma": "$inviter@uma.domain",
"inviteeUma": "$invitee@uma.domain",
"url": "https://uma.me/i/019542f5",
"status": "CLAIMED"
},
"timestamp": "2023-09-01T15:45:00Z",
"webhookId": "Webhook:019542f5-b3e7-1d02-0000-000000000008",
"type": "INVITATION_CLAIMED"
}
}
```

Expand Down
67 changes: 20 additions & 47 deletions mintlify/payouts-and-b2b/onboarding/configuring-customers.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -62,16 +62,19 @@ curl -X PATCH "https://api.lightspark.com/grid/2025-10-13/customers/{customerId}
-u "$GRID_CLIENT_ID:$GRID_CLIENT_SECRET" \
-H "Content-Type: application/json" \
-d '{
"bankAccountInfo": {
"accountType": "US_ACCOUNT",
"accountNumber": "123456789",
"routingNumber": "987654321",
"bankName": "Chase Bank"
"customerType": "INDIVIDUAL",
"currencies": ["USD", "EUR", "USDC"],
"address": {
"line1": "456 Market St",
"city": "San Francisco",
"state": "CA",
"postalCode": "94103",
"country": "US"
}
}'
```

Note that not all customer information can be updated. Particularly for non-regulated platforms, you cannot update personal information after the customer has been created.
Note that not all customer information can be updated. Particularly for non-regulated platforms, you cannot update personal information after the customer has been created. The `customerType` discriminator is required on PATCH so the API knows which set of optional fields to validate. To update bank-account details, use the `/customers/external-accounts` endpoints — bank accounts are no longer managed inline on the customer resource.

## Bank Account Information

Expand Down Expand Up @@ -212,9 +215,9 @@ curl -X POST "https://api.lightspark.com/grid/2025-10-13/customers/bulk/csv" \
The CSV file should follow a specific format with required and optional columns based on customer type. Here's an example:

```csv
platformCustomerId,customerType,fullName,birthDate,addressLine1,city,state,postalCode,country,accountType,accountNumber,bankName,platformAccountId,businessLegalName,routingNumber,accountCategory
customer123,INDIVIDUAL,John Doe,1990-01-15,123 Main St,San Francisco,CA,94105,US,US_ACCOUNT,123456789,Chase Bank,chase_primary_1234,,222888888,SAVINGS
biz456,BUSINESS,,,400 Commerce Way,Austin,TX,78701,US,US_ACCOUNT,987654321,Bank of America,boa_business_5678,Acme Corp,121212121,CHECKING
umaAddress,platformCustomerId,customerType,fullName,birthDate,addressLine1,city,state,postalCode,country,businessLegalName
$john.doe@uma.domain.com,customer123,INDIVIDUAL,John Doe,1990-01-15,123 Main St,San Francisco,CA,94105,US,
$acme@uma.domain.com,biz456,BUSINESS,,,400 Commerce Way,Austin,TX,78701,US,Acme Corp
```

<Tip>
Expand All @@ -241,21 +244,19 @@ Example job status response:

```json
{
"jobId": "job_123456789",
"id": "Job:019542f5-b3e7-1d02-0000-000000000006",
"status": "PROCESSING",
"progress": {
"total": 5000,
"processed": 2500,
"successful": 2499,
"failed": 1
"successful": 2450,
"failed": 50
},
"errors": [
{
"platformCustomerId": "biz456",
"error": {
"code": "validation_error",
"message": "Invalid bank account number"
}
"correlationId": "biz456",
"code": "INVALID_FIELD",
"message": "Invalid bank account number"
}
]
}
Expand All @@ -277,6 +278,7 @@ The CSV file should have the following columns:

Required columns for all customers:

- umaAddress: The customer's UMA address (e.g., `$john.doe@uma.domain.com`)
- platformCustomerId: Your platform's unique identifier for the customer
- customerType: Either "INDIVIDUAL" or "BUSINESS"

Expand All @@ -289,9 +291,6 @@ Required columns for individual customers:
- state: State/Province/Region
- postalCode: Postal/ZIP code
- country: Country code (ISO 3166-1 alpha-2)
- accountType: Bank account type (CLABE, US_ACCOUNT, PIX, IBAN, UPI)
- accountNumber: Bank account number
- bankName: Name of the bank

Required columns for business customers:

Expand All @@ -301,9 +300,6 @@ Required columns for business customers:
- state: State/Province/Region
- postalCode: Postal/ZIP code
- country: Country code (ISO 3166-1 alpha-2)
- accountType: Bank account type (CLABE, US_ACCOUNT, PIX, IBAN, UPI)
- accountNumber: Bank account number
- bankName: Name of the bank

Optional columns for all customers:

Expand All @@ -320,28 +316,5 @@ Optional columns for business customers:
- businessRegistrationNumber: Business registration number
- businessTaxId: Tax identification number

Additional required columns based on account type:

For US_ACCOUNT:

- routingNumber: ACH routing number (9 digits)
- accountCategory: Either "CHECKING" or "SAVINGS"

For CLABE:

- clabeNumber: 18-digit CLABE number

For PIX:

- pixKey: PIX key value
- pixKeyType: Type of PIX key (CPF, CNPJ, EMAIL, PHONE, RANDOM)

For UPI:

- vpa: Virtual Payment Address for UPI payments

For IBAN:

- iban: International Bank Account Number
- swiftBic: SWIFT/BIC code (8 or 11 characters)
Bank-account details are no longer part of the bulk customer CSV — manage them separately via the `/customers/external-accounts` endpoints.

2 changes: 1 addition & 1 deletion mintlify/payouts-and-b2b/quickstart.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ The hosted interface handles document collection, verification checks, and compl
</Info>

### Track the decision
Reaching the `redirectUri` only means the customer **finished the hosted flow** — not that they were approved. Wait for the final decision via the `KYC_STATUS` webhook (recommended) or by polling `GET /customers/{customerId}` and inspecting `kycStatus`. On `APPROVED`, the customer is ready to transact and you can unlock funding.
Reaching the `redirectUri` only means the customer **finished the hosted flow** — not that they were approved. Wait for the final decision via the `CUSTOMER.KYC_APPROVED` / `CUSTOMER.KYC_REJECTED` webhook (use the `CUSTOMER.KYB_*` siblings for business customers) — recommended — or by polling `GET /customers/{customerId}` and inspecting `kycStatus`. On `APPROVED`, the customer is ready to transact and you can unlock funding.

## Get the Customer's Internal Account

Expand Down
8 changes: 5 additions & 3 deletions mintlify/ramps/onboarding/configuring-customers.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ curl -X POST 'https://api.lightspark.com/grid/2025-10-13/customers' \
<Accordion title="Business customers" icon="building">
For corporate conversions and business accounts.

**Required fields:** `businessName`, `email`, `taxId`, `address`
**Required fields:** `customerType`. Most providers also require `businessInfo.legalName` and `address` for KYB.

```bash
curl -X POST 'https://api.lightspark.com/grid/2025-10-13/customers' \
Expand All @@ -68,9 +68,11 @@ curl -X POST 'https://api.lightspark.com/grid/2025-10-13/customers' \
-d '{
"platformCustomerId": "biz_67890",
"customerType": "BUSINESS",
"businessName": "Acme Corporation",
"email": "finance@acme.com",
"taxId": "12-3456789",
"businessInfo": {
"legalName": "Acme Corporation",
"taxId": "12-3456789"
},
"address": {...}
}'
```
Expand Down
20 changes: 13 additions & 7 deletions mintlify/ramps/platform-tools/webhooks.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -105,17 +105,23 @@ Grid sends webhooks for key events in the ramp lifecycle:
</Warning>
</Tab>

<Tab title="KYC_STATUS">
Sent when customer KYC verification completes (required before conversions).
<Tab title="CUSTOMER.KYC_*">
Sent when customer KYC verification completes (required before conversions). Business customers emit the `CUSTOMER.KYB_*` siblings.

```json
{
"webhookId": "Webhook:019542f5-b3e7-1d02-0000-000000000020",
"type": "KYC_STATUS",
"id": "Webhook:019542f5-b3e7-1d02-0000-000000000020",
"type": "CUSTOMER.KYC_APPROVED",
"timestamp": "2025-10-03T14:32:00Z",
"customerId": "Customer:019542f5-b3e7-1d02-0000-000000000001",
"kycStatus": "APPROVED",
"platformCustomerId": "user_12345"
"data": {
"id": "Customer:019542f5-b3e7-1d02-0000-000000000001",
"platformCustomerId": "user_12345",
"customerType": "INDIVIDUAL",
"kycStatus": "APPROVED",
"fullName": "Jane Doe",
"createdAt": "2025-07-21T17:32:28Z",
"updatedAt": "2025-10-03T14:32:00Z"
}
}
```

Expand Down
14 changes: 13 additions & 1 deletion mintlify/rewards/onboarding/configuring-customers.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ The `platformCustomerId` field is optional but recommended. Use your existing us
When a customer is created successfully, internal accounts are automatically created for each currency configured on your platform. These accounts can be used as sources or destinations for transfers.
</Info>

### Hanlding KYC/KYC Webhooks
### Handling KYC/KYB Webhooks

<KycWebhooks />

Expand Down Expand Up @@ -79,6 +79,18 @@ Filter customers updated after this timestamp (ISO 8601)
Filter customers updated before this timestamp (ISO 8601)
</ParamField>

<ParamField query="region" type="string">
Filter by customer region (ISO 3166-1 alpha-2 country code)
</ParamField>

<ParamField query="currency" type="string">
Filter by currency code. Returns customers that have this currency in their enabled currencies list.
</ParamField>

<ParamField query="umaAddress" type="string">
Filter by UMA address
</ParamField>

<ParamField query="isIncludingDeleted" type="boolean">
Whether to include deleted customers in results (default: false)
</ParamField>
Expand Down
Loading
Loading