Skip to content
Open
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
4 changes: 2 additions & 2 deletions mintlify/payouts-and-b2b/platform-tools/sandbox-testing.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ POST /customers/external-accounts
"customerId": "Customer:123",
"currency": "EUR",
"accountInfo": {
"accountType": "IBAN_ACCOUNT",
"accountType": "EUR_ACCOUNT",
"iban": "DE89370400440532013003",
"beneficiary": {
"beneficiaryType": "INDIVIDUAL",
Expand Down Expand Up @@ -183,7 +183,7 @@ All webhook events fire normally in sandbox. To test your webhook endpoint:
You can also manually trigger a test webhook:

```bash
POST /webhooks/test
POST /sandbox/webhooks/test

{
"url": "https://your-app.com/webhooks"
Expand Down
22 changes: 11 additions & 11 deletions mintlify/platform-overview/core-concepts/account-model.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,11 @@ Grid uses two types of accounts: **internal accounts** (Grid-managed balances) a
<Tab title="US Bank Accounts">
```json
{
"accountType": "US_ACCOUNT",
"accountType": "USD_ACCOUNT",
"currency": "USD",
"accountNumber": "1234567890",
"routingNumber": "110000000",
"accountCategory": "CHECKING",
"bankAccountType": "CHECKING",
"beneficiary": {
"beneficiaryType": "INDIVIDUAL",
"fullName": "Alice Johnson",
Expand All @@ -54,10 +54,10 @@ Grid uses two types of accounts: **internal accounts** (Grid-managed balances) a
<Tab title="IBAN (Europe)">
```json
{
"accountType": "IBAN",
"accountType": "EUR_ACCOUNT",
"currency": "EUR",
"iban": "DE89370400440532013000",
"swiftBic": "DEUTDEFF",
"swiftCode": "DEUTDEFF",
"bankName": "Deutsche Bank",
"beneficiary": {
"beneficiaryType": "INDIVIDUAL",
Expand All @@ -70,7 +70,7 @@ Grid uses two types of accounts: **internal accounts** (Grid-managed balances) a
<Tab title="PIX (Brazil)">
```json
{
"accountType": "PIX",
"accountType": "BRL_ACCOUNT",
"currency": "BRL",
"pixKey": "user@example.com",
"pixKeyType": "EMAIL",
Expand All @@ -87,7 +87,7 @@ Grid uses two types of accounts: **internal accounts** (Grid-managed balances) a
<Tab title="CLABE (Mexico)">
```json
{
"accountType": "CLABE",
"accountType": "MXN_ACCOUNT",
"clabeNumber": "012345678901234567",
"bankName": "BBVA Mexico",
"beneficiary": {
Expand All @@ -101,7 +101,7 @@ Grid uses two types of accounts: **internal accounts** (Grid-managed balances) a
<Tab title="UPI (India)">
```json
{
"accountType": "UPI",
"accountType": "INR_ACCOUNT",
"currency": "INR",
"vpa": "user@paytm",
"beneficiary": {
Expand Down Expand Up @@ -164,10 +164,10 @@ curl -X POST https://api.lightspark.com/grid/2025-10-13/customers/external-accou
"customerId": "Customer:019542f5-b3e7-1d02-0000-000000000001",
"currency": "USD",
"accountInfo": {
"accountType": "US_ACCOUNT",
"accountType": "USD_ACCOUNT",
"accountNumber": "9876543210",
"routingNumber": "110000000",
"accountCategory": "CHECKING",
"bankAccountType": "CHECKING",
"beneficiary": {
"beneficiaryType": "INDIVIDUAL",
"fullName": "Alice Johnson",
Expand All @@ -192,7 +192,7 @@ curl -X POST https://api.lightspark.com/grid/2025-10-13/customers/external-accou
"currency": "USD",
"status": "PENDING",
"accountInfo": {
"accountType": "US_ACCOUNT",
"accountType": "USD_ACCOUNT",
"accountNumber": "****3210",
"routingNumber": "110000000"
}
Expand All @@ -210,7 +210,7 @@ PENDING → ACTIVE
- **PENDING**: Created, undergoing verification/screening
- **ACTIVE**: Verified, ready for transactions
- **INACTIVE**: Disabled (can be reactivated)
- **REJECTED**: Failed verification
- **UNDER_REVIEW**: Additional review required

You'll receive `INTERNAL_ACCOUNT.BALANCE_UPDATED` webhooks as balance changes, and `INTERNAL_ACCOUNT.STATUS_UPDATED` webhooks when account status changes (e.g., ACTIVE to FROZEN).

Expand Down
19 changes: 6 additions & 13 deletions mintlify/ramps/accounts/external-accounts.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -130,10 +130,10 @@ curl -X POST 'https://api.lightspark.com/grid/2025-10-13/customers/external-acco
"currency": "USD",
"platformAccountId": "user_bank_usd_001",
"accountInfo": {
"accountType": "US_ACCOUNT",
"accountType": "USD_ACCOUNT",
"accountNumber": "123456789",
"routingNumber": "021000021",
"accountCategory": "CHECKING",
"bankAccountType": "CHECKING",
"bankName": "Chase Bank",
"beneficiary": {
"beneficiaryType": "INDIVIDUAL",
Expand Down Expand Up @@ -168,23 +168,16 @@ curl -X GET 'https://api.lightspark.com/grid/2025-10-13/customers/external-accou
-H 'Authorization: Basic $GRID_CLIENT_ID:$GRID_CLIENT_SECRET'
```

### Filter by account type

```bash
curl -X GET 'https://api.lightspark.com/grid/2025-10-13/customers/external-accounts?customerId=Customer:019542f5-b3e7-1d02-0000-000000000001&accountType=SPARK_WALLET' \
-H 'Authorization: Basic $GRID_CLIENT_ID:$GRID_CLIENT_SECRET'
```

## Account status and verification

External accounts move through verification states:

| Status | Description | Can Use for Conversions |
| ---------- | ------------------------ | ----------------------- |
| `PENDING` | Verification in progress | ❌ |
| `ACTIVE` | Verified and ready | ✅ |
| `FAILED` | Verification failed | ❌ |
| `DISABLED` | Manually disabled | ❌ |
| `PENDING` | Verification in progress | ❌ |
| `ACTIVE` | Verified and ready | ✅ |
| `UNDER_REVIEW` | Additional review required | ❌ |
| `INACTIVE` | Manually disabled | ❌ |

<Info>
Spark wallet accounts are immediately `ACTIVE`. Bank accounts may require
Expand Down
15 changes: 0 additions & 15 deletions mintlify/ramps/conversion-flows/self-custody-wallets.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,6 @@ curl -X POST 'https://api.lightspark.com/grid/2025-10-13/customers/external-acco
-d '{
"customerId": "Customer:019542f5-b3e7-1d02-0000-000000000001",
"currency": "BTC",
"beneficiary": {
"counterPartyType": "INDIVIDUAL",
"fullName": "John Doe",
"email": "john@example.com"
},
"accountInfo": {
"accountType": "SPARK_WALLET",
"address": "spark1pgssyuuuhnrrdjswal5c3s3rafw9w3y5dd4cjy3duxlf7hjzkp0rqx6dj6mrhu"
Expand All @@ -96,11 +91,6 @@ const externalAccount = await fetch(
body: JSON.stringify({
customerId: "Customer:019542f5-b3e7-1d02-0000-000000000001",
currency: "BTC",
beneficiary: {
counterPartyType: "INDIVIDUAL",
fullName: "John Doe",
email: "john@example.com",
},
accountInfo: {
accountType: "SPARK_WALLET",
address: sparkAddress,
Expand Down Expand Up @@ -129,11 +119,6 @@ response = requests.post(
json={
'customerId': 'Customer:019542f5-b3e7-1d02-0000-000000000001',
'currency': 'BTC',
'beneficiary': {
'counterPartyType': 'INDIVIDUAL',
'fullName': 'John Doe',
'email': 'john@example.com'
},
'accountInfo': {
'accountType': 'SPARK_WALLET',
'address': spark_address
Expand Down
4 changes: 2 additions & 2 deletions mintlify/snippets/cards/cardholder-setup.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ covers the requirements and the order they must be satisfied in.

## KYC must be APPROVED

`POST /cards` is rejected with `409 CARDHOLDER_KYC_NOT_APPROVED` if the
`POST /cards` is rejected with `400 CARDHOLDER_KYC_NOT_APPROVED` if the
cardholder's `kycStatus` is anything other than `APPROVED`. There is no
"issue and verify later" path.

Expand All @@ -26,7 +26,7 @@ time. The account must:

- Belong to the cardholder (no cross-customer funding in v1).
- Be denominated in a card-eligible currency. In v1 this is USDB; the
request is rejected with `409 FUNDING_SOURCE_INELIGIBLE` otherwise.
request is rejected with `400 FUNDING_SOURCE_INELIGIBLE` otherwise.

If the cardholder doesn't have an internal account yet, internal
accounts are created automatically when the customer is created based
Expand Down
4 changes: 2 additions & 2 deletions mintlify/snippets/cards/funding-sources.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ Each source must:
one currency.

If any source fails these checks, the request is rejected with
`409 FUNDING_SOURCE_INELIGIBLE`.
`400 FUNDING_SOURCE_INELIGIBLE`.

## Replacing the binding

Expand Down Expand Up @@ -62,7 +62,7 @@ post-change `Card` resource.

| Status | Code | What it means |
|--------|------|---------------|
| 409 | `FUNDING_SOURCE_INELIGIBLE` | A supplied account doesn't belong to the cardholder or isn't denominated in the card's currency. |
| 400 | `FUNDING_SOURCE_INELIGIBLE` | A supplied account doesn't belong to the cardholder or isn't denominated in the card's currency. |
| 409 | `CARD_NOT_MUTABLE` | The card is `CLOSED`. |
| 400 | `INVALID_INPUT` | The `fundingSources` array is empty (a card must have at least one source). |

Expand Down
2 changes: 1 addition & 1 deletion mintlify/snippets/cards/implementation-overview.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ Grid. You'll only need to:
A card can only be issued to a `Customer` with `kycStatus: APPROVED`.
This is the same gate you use for Grid's other features. If the
cardholder hasn't completed KYC, `POST /cards` returns
`409 CARDHOLDER_KYC_NOT_APPROVED` — see
`400 CARDHOLDER_KYC_NOT_APPROVED` — see
[Cardholder setup](/cards/onboarding/cardholder-setup) for how to drive
KYC to completion before issuing.

Expand Down
4 changes: 2 additions & 2 deletions mintlify/snippets/cards/issuing-cards.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,8 @@ cross your servers.

| Status | Code | What it means |
|--------|------|---------------|
| 409 | `CARDHOLDER_KYC_NOT_APPROVED` | Cardholder is not `kycStatus: APPROVED`. Drive KYC to completion before retrying. |
| 409 | `FUNDING_SOURCE_INELIGIBLE` | The supplied internal account doesn't belong to the cardholder or isn't denominated in a card-eligible currency. |
| 400 | `CARDHOLDER_KYC_NOT_APPROVED` | Cardholder is not `kycStatus: APPROVED`. Drive KYC to completion before retrying. |
| 400 | `FUNDING_SOURCE_INELIGIBLE` | The supplied internal account doesn't belong to the cardholder or isn't denominated in a card-eligible currency. |
| 400 | `INVALID_INPUT` | Validation failure on the request body. |

## Changing funding sources later
Expand Down
23 changes: 12 additions & 11 deletions mintlify/snippets/external-accounts.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -54,10 +54,10 @@ curl -X POST 'https://api.lightspark.com/grid/2025-10-13/customers/external-acco
"currency": "USD",
"platformAccountId": "user_123_primary_bank",
"accountInfo": {
"accountType": "US_ACCOUNT",
"accountType": "USD_ACCOUNT",
"accountNumber": "123456789",
"routingNumber": "021000021",
"accountCategory": "CHECKING",
"bankAccountType": "CHECKING",
"bankName": "Chase Bank",
"beneficiary": {
"beneficiaryType": "INDIVIDUAL",
Expand Down Expand Up @@ -92,7 +92,7 @@ curl -X POST 'https://api.lightspark.com/grid/2025-10-13/customers/external-acco
"currency": "MXN",
"platformAccountId": "mx_beneficiary_001",
"accountInfo": {
"accountType": "CLABE",
"accountType": "MXN_ACCOUNT",
"clabeNumber": "123456789012345678",
"bankName": "BBVA Mexico",
"beneficiary": {
Expand Down Expand Up @@ -125,10 +125,11 @@ curl -X POST 'https://api.lightspark.com/grid/2025-10-13/customers/external-acco
"currency": "BRL",
"platformAccountId": "br_pix_001",
"accountInfo": {
"accountType": "PIX",
"accountType": "BRL_ACCOUNT",
"pixKey": "user@email.com",
"pixKeyType": "EMAIL",
"bankName": "Nubank",
"taxId": "12345678900",
"beneficiary": {
"beneficiaryType": "INDIVIDUAL",
"fullName": "João Silva",
Expand Down Expand Up @@ -304,9 +305,9 @@ curl -X POST 'https://api.lightspark.com/grid/2025-10-13/customers/external-acco
"currency": "EUR",
"platformAccountId": "eu_iban_001",
"accountInfo": {
"accountType": "IBAN",
"accountType": "EUR_ACCOUNT",
"iban": "DE89370400440532013000",
"swiftBic": "DEUTDEFF",
"swiftCode": "DEUTDEFF",
"bankName": "Deutsche Bank",
"beneficiary": {
"beneficiaryType": "INDIVIDUAL",
Expand Down Expand Up @@ -409,7 +410,7 @@ curl -X POST 'https://api.lightspark.com/grid/2025-10-13/customers/external-acco
"currency": "INR",
"platformAccountId": "in_upi_001",
"accountInfo": {
"accountType": "UPI",
"accountType": "INR_ACCOUNT",
"vpa": "user@okbank",
"beneficiary": {
"beneficiaryType": "INDIVIDUAL",
Expand Down Expand Up @@ -821,10 +822,10 @@ curl -X POST 'https://api.lightspark.com/grid/2025-10-13/customers/external-acco
"currency": "USD",
"platformAccountId": "user_123_primary_bank",
"accountInfo": {
"accountType": "US_ACCOUNT",
"accountType": "USD_ACCOUNT",
"accountNumber": "123456789",
"routingNumber": "021000021",
"accountCategory": "CHECKING",
"bankAccountType": "CHECKING",
"bankName": "Chase Bank",
"beneficiary": {
"beneficiaryType": "INDIVIDUAL",
Expand Down Expand Up @@ -853,10 +854,10 @@ For business accounts, include business information:
"platformAccountId": "acme_corp_account",
"customerId": "Customer:019542f5-b3e7-1d02-0000-000000000001",
"accountInfo": {
"accountType": "US_ACCOUNT",
"accountType": "USD_ACCOUNT",
"accountNumber": "987654321",
"routingNumber": "021000021",
"accountCategory": "CHECKING",
"bankAccountType": "CHECKING",
"bankName": "Chase Bank",
"beneficiary": {
"beneficiaryType": "BUSINESS",
Expand Down
Loading
Loading