Skip to content
Merged
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
34 changes: 21 additions & 13 deletions .claude/skills/grid-api/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -420,29 +420,36 @@ values `SMS_OTP` (default) or `PASSKEY`.

### Same-Currency Transfers

Use `/quotes` with `"immediatelyExecute": true`. The `/transfer-in` and
`/transfer-out` endpoints are deprecated.

```bash
# Transfer in (external → internal, same currency)
# External → internal, same currency (source must support pull, e.g. ACH pull)
curl -s -u "$GRID_CLIENT_ID:$GRID_CLIENT_SECRET" \
-X POST -H "Content-Type: application/json" \
-d '{
"source": {"accountId": "<externalAccountId>"},
"destination": {"accountId": "<internalAccountId>"},
"amount": 10000
"source": {"sourceType": "ACCOUNT", "accountId": "<externalAccountId>"},
"destination": {"destinationType": "ACCOUNT", "accountId": "<internalAccountId>"},
"lockedCurrencySide": "SENDING",
"lockedCurrencyAmount": 10000,
"immediatelyExecute": true
}' \
"$GRID_BASE_URL/transfer-in" | jq .
"$GRID_BASE_URL/quotes" | jq .

# Transfer out (internal → external, same currency)
# Internal → external, same currency
# Optional: top-level "remittanceInformation" (memo, max 80 chars) and a "paymentRail"
# inside the destination to pick a specific supported rail.
curl -s -u "$GRID_CLIENT_ID:$GRID_CLIENT_SECRET" \
-X POST -H "Content-Type: application/json" \
-d '{
"source": {"accountId": "<internalAccountId>"},
"destination": {"accountId": "<externalAccountId>", "paymentRail": "<rail>"},
"amount": 10000,
"source": {"sourceType": "ACCOUNT", "accountId": "<internalAccountId>"},
"destination": {"destinationType": "ACCOUNT", "accountId": "<externalAccountId>", "paymentRail": "<rail>"},
"lockedCurrencySide": "SENDING",
"lockedCurrencyAmount": 10000,
"immediatelyExecute": true,
"remittanceInformation": "Invoice 1234"
}' \
"$GRID_BASE_URL/transfer-out" | jq .
"$GRID_BASE_URL/quotes" | jq .
```

### Transactions
Expand Down Expand Up @@ -535,11 +542,12 @@ Use `sourceType: "REALTIME_FUNDING"` with customer ID and currency. Only works w

### 3. Same-Currency Transfers

Direct transfers between accounts without currency conversion. No quote needed.
Transfers between accounts without currency conversion. These go through `/quotes`
like any other transfer; set `immediatelyExecute` to create and execute in one call.

```
External Account (USD) → Internal Account (USD) [transfer-in]
Internal Account (USD) → External Account (USD) [transfer-out]
External Account (USD) → Internal Account (USD)
Internal Account (USD) → External Account (USD)
```

## Interactive Payment Workflows
Expand Down
8 changes: 4 additions & 4 deletions .claude/skills/grid-api/references/endpoints.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,10 +118,12 @@ Internal accounts are auto-created when customers are created based on platform

## Same-Currency Transfers

Deprecated — use `POST /quotes` with `immediatelyExecute` instead.

| Method | Endpoint | Description |
|--------|----------|-------------|
| POST | `/transfer-in` | Create a transfer-in request (external to internal) |
| POST | `/transfer-out` | Create a transfer-out request (internal to external) |
| POST | `/transfer-in` | **Deprecated.** Create a transfer-in request (external to internal) |
| POST | `/transfer-out` | **Deprecated.** Create a transfer-out request (internal to external) |

## Receiver Lookup

Expand Down Expand Up @@ -281,8 +283,6 @@ The `/agents/me/*` endpoints are called by an agent using its own credentials (A
| POST | `/agents/me/quotes/{quoteId}/execute` | Execute a quote |
| GET | `/agents/me/actions` | List agent's own actions |
| GET | `/agents/me/actions/{actionId}` | Get an agent action |
| POST | `/agents/me/transfer-in` | Create a transfer-in |
| POST | `/agents/me/transfer-out` | Create a transfer-out |
| GET | `/agents/me/internal-accounts` | List agent's internal accounts |
| GET | `/agents/me/external-accounts` | List agent external accounts |
| POST | `/agents/me/external-accounts` | Add an external account |
Expand Down
3 changes: 0 additions & 3 deletions .stainless/stainless.yml
Original file line number Diff line number Diff line change
Expand Up @@ -505,7 +505,6 @@ resources:
pkr_beneficiary: "#/components/schemas/PkrBeneficiary"
ethereum_wallet_external_account_info: "#/components/schemas/EthereumWalletExternalAccountInfo"
verification_error: "#/components/schemas/VerificationError"
agent_transfer_details: "#/components/schemas/AgentTransferDetails"
slv_external_account_create_info: "#/components/schemas/SlvExternalAccountCreateInfo"
slv_beneficiary: "#/components/schemas/SlvBeneficiary"
individual_customer: "#/components/schemas/IndividualCustomer"
Expand Down Expand Up @@ -624,8 +623,6 @@ resources:
me:
methods:
retrieve: get /agents/me
create_transfer_in: post /agents/me/transfer-in
create_transfer_out: post /agents/me/transfer-out
list_internal_accounts: get /agents/me/internal-accounts
subresources:
transactions:
Expand Down
6 changes: 3 additions & 3 deletions components/grid-visualizer/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -204,10 +204,10 @@ Stablecoins: `SOLANA_WALLET` (USDC), `POLYGON_WALLET` (USDC), `BASE_WALLET` (USD
- `POST /customers/external-accounts` — Register external account
- `GET /customers/internal-accounts` — List customer internal accounts
- `GET /platform/internal-accounts` — List platform internal accounts
- `POST /quotes` — Create cross-currency transfer quote
- `POST /quotes` — Create a transfer quote (same-currency and cross-currency)
- `POST /quotes/{quoteId}/execute` — Execute quote
- `POST /transfer-out` — Same-currency internal → external
- `POST /transfer-in` — Same-currency external → internal
- `POST /transfer-out` — **Deprecated.** Same-currency internal → external; use `/quotes`
- `POST /transfer-in` — **Deprecated.** Same-currency external → internal; use `/quotes`

### Quote Request Shape

Expand Down
32 changes: 14 additions & 18 deletions mintlify/api-reference/sandbox-testing.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -23,23 +23,20 @@ The Grid sandbox environment simulates real payment flows without moving real mo

<SandboxExternalAccounts />

### Beneficiary name verification

<SandboxBeneficiaryVerification />

## Transfer in

In production, internal accounts are funded by sending a bank transfer to the account's payment instructions or by pulling from an external account. In sandbox, you have two options:
<SandboxTransferPatterns />

### Transfer in from an external account
These outcomes apply whenever the account is used, as the source of a pull or the
destination of a payout.

Use the `/transfer-in` endpoint to pull funds from an external account into an internal account. The external account's number suffix determines the outcome:
### Beneficiary name verification

<SandboxTransferPatterns />
<SandboxBeneficiaryVerification />

### Sandbox fund endpoint
## Funding an internal account

Instantly add funds to any internal account using `/sandbox/internal-accounts/{accountId}/fund`:
Internal accounts are funded from their payment instructions or by pulling from an external
account — see [Internal Accounts](/payouts-and-b2b/depositing-funds/internal-accounts) for
both. Sandbox adds a shortcut that skips the wait:

```bash
curl -X POST https://api.lightspark.com/grid/2025-10-13/sandbox/internal-accounts/{accountId}/fund \
Expand All @@ -48,15 +45,18 @@ curl -X POST https://api.lightspark.com/grid/2025-10-13/sandbox/internal-account
-d '{ "amount": 100000 }'
```

## Creating quotes (cross-currency transfers)
To exercise the pull path instead, create a quote with an external account as the source and
`immediatelyExecute` set to `true`. The account's suffix decides the outcome.

## Creating quotes

<SandboxQuotePatterns />

### Executing a quote

After creating a quote, you need to fund it to trigger execution. There are two ways to do this in sandbox:

**Prefunded internal account** — If your quote's source is an internal account, fund the account using one of the methods described in [transfer in](#transfer-in), then call the quote execute endpoint to trigger the transaction:
**Prefunded internal account** — If your quote's source is an internal account, fund the account using one of the methods described in [funding an internal account](#funding-an-internal-account), then call the quote execute endpoint to trigger the transaction:

```bash
curl -X POST https://api.lightspark.com/grid/2025-10-13/quotes/{quoteId}/execute \
Expand All @@ -75,10 +75,6 @@ curl -X POST https://api.lightspark.com/grid/2025-10-13/sandbox/send \
}'
```

## Transferring out funds

Use the `/transfer-out` endpoint to push funds from an internal account to an external account in the same currency. The external account's number suffix controls the outcome using the same patterns as [transfer in](#transfer-in-from-an-external-account).

## Sending to a UMA address

<SandboxUmaAddresses />
Expand Down
19 changes: 19 additions & 0 deletions mintlify/changelog.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,25 @@ changes and roadmap, [book a live demo](https://www.lightspark.com/contact) or

<Update label="August 2026">

## `/transfer-in` and `/transfer-out` are deprecated

Same-currency transfers now go through the quote endpoint, so one integration covers
same-currency and cross-currency alike.

- Use `POST /quotes` with `immediatelyExecute: true` to create and execute a
same-currency transfer in a single request.
- `amount` becomes `lockedCurrencyAmount` with `lockedCurrencySide: "SENDING"`; source
and destination gain `sourceType: "ACCOUNT"` and `destinationType: "ACCOUNT"`.
`remittanceInformation`, `purposeOfPayment`, and the destination `paymentRail` carry
over unchanged.
- The response is a `Quote` rather than a `Transaction`—read `transactionId` from it to
track the resulting transaction.
- `POST /transfer-in` and `POST /transfer-out` continue to work with unchanged request
and response shapes.

See [Send a payment](/payouts-and-b2b/payment-flow/send-payment#send-a-payment)
for the updated flow.

## Assess your own fees on every transaction

Charge your customers a platform fee and keep the margin—Grid collects it for you and
Expand Down
5 changes: 2 additions & 3 deletions mintlify/global-accounts/agents/approvals-and-audit.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,8 @@ An approval is not always a guarantee that the action will execute. Your product
- `agentId` — the agent that submitted the action
- `customerId` / `platformCustomerId` — the customer on whose behalf the agent acted
- `status` — `PENDING_APPROVAL` while awaiting a decision; transitions to `APPROVED`, `REJECTED`, or `FAILED`
- `type` — `EXECUTE_QUOTE`, `TRANSFER_OUT`, or `TRANSFER_IN`
- `quote` — for `EXECUTE_QUOTE` actions, the full quote object including amounts, currencies, exchange rate, and destination
- `transferDetails` — for `TRANSFER_OUT` / `TRANSFER_IN` actions, amount, currency, and source/destination account IDs
- `type` — `EXECUTE_QUOTE`
- `quote` — the full quote object including amounts, currencies, exchange rate, and destination
- `transaction` — populated after the action is approved and execution begins; absent while pending or rejected
- `rejectionReason` — optional reason string set when your platform rejects the action
- `createdAt` / `updatedAt` — timestamps for the action lifecycle
Expand Down
5 changes: 2 additions & 3 deletions mintlify/global-accounts/agents/policies-and-permissions.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,8 @@ Grid exposes explicit allowlists instead of broad agent access. Available permis
| Permission | What it allows |
|---|---|
| `VIEW_TRANSACTIONS` | List and retrieve transactions and account balances |
| `CREATE_TRANSFERS` | Initiate same-currency transfers |
| `CREATE_QUOTES` | Create cross-currency quotes |
| `EXECUTE_QUOTES` | Execute cross-currency quotes |
| `CREATE_QUOTES` | Create quotes |
| `EXECUTE_QUOTES` | Execute quotes |
| `MANAGE_EXTERNAL_ACCOUNTS` | Create and manage external accounts |

These permissions are intentionally narrow and map to concrete Grid-backed actions rather than broad scopes such as "manage wallet."
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,23 @@ title: "Sending Payments"
icon: "/images/icons/paper-plane-top-right.svg"
"og:image": "/images/og/og-global-p2p.png"
---
This guide covers three methods to send payments:
Every payment goes through `POST /quotes`. What changes is where you are sending:

1. Same-currency transfer to an external account
2. Cross-currency transfer with a quote
3. Sending to an UMA address
1. To an account — internal or external, with or without currency conversion
2. To an UMA address

## Choosing the right method

- **Same-currency**: Best for domestic payouts when sender and recipient use the same currency. Uses local payment rails (e.g., RTP, SEPA Instant, PIX, FPS) for low cost and fast settlement.
- **Cross-currency**: Use when conversion is required or when paying globally across borders. Also supports sending to a crypto wallet address when configured.
- **Account**: Pay an internal or external account. Grid converts when the currencies differ and settles over local payment rails (e.g., ACH, RTP, SEPA Instant, PIX, FPS) when they match. Also covers sending to a crypto wallet address when configured.
- **UMA**: Send using a Universal Money Address. Ideal for global counterparties on networks.

import SameCurrency from '/snippets/sending/same-currency.mdx'
import SendToAccount from '/snippets/sending/accounts.mdx'

<SameCurrency />
<SendToAccount />

import CrossCurrency from '/snippets/sending/cross-currency.mdx'
import CryptoFunding from '/snippets/sending/crypto-funding.mdx'

<CrossCurrency />
<CryptoFunding />

import SendUMA from '/snippets/sending/uma.mdx'

Expand Down
Loading
Loading