---
title: "Create an internal account"
method: POST
path: "/internal-accounts"
tags: ["Internal Accounts"]
---

# Create an internal account

`POST /internal-accounts`

## Request

- Base URL: `https://api.lightspark.com/grid/2025-10-13`
- URL: `https://api.lightspark.com/grid/2025-10-13/internal-accounts`
- Auth: HTTP basic

Create a rule-based internal account.

A rule-based account is an additional account number for an account holder
that already holds an account in the same currency. It carries a routing
rule: every payment that settles into it is attributed to that account
number and then swept to the rule's destination, so you can issue one number
per payer and reconcile incoming payments without matching on remittance
text.

Only `RULE_BASED` accounts can be created here. `INTERNAL_FIAT`,
`INTERNAL_CRYPTO`, and `EMBEDDED_WALLET` accounts are provisioned
automatically when an account holder is created or approved.

The response carries the account's own `fundingPaymentInstructions` — the
routable number payers send to for a `USD` account, or one deposit address
per supported network for a `USDC` or `USDT` account. Rule-based accounts
are currently available in `USD`, `USDC`, and `USDT`, for a customer or
for your platform itself. `USDC` and `USDT` rule-based accounts are enabled
per platform.

Sandbox platforms can create rule-based accounts and exercise the whole
flow. The account number is generated locally rather than issued by a
partner bank, and `POST /sandbox/internal-accounts/{accountId}/fund` stands
in for a settled deposit — funding the account triggers its sweep just as a
real deposit would.

Send an `Idempotency-Key` header to make retries safe: a request carrying a
key already used returns the account created by the first request with a
`200` instead of a `201`. Reusing a key for a materially different account
is rejected with `409`. Without a key a retry cannot be recognised, so each
request creates its own account and mints its own account number.

## Headers

- `Idempotency-Key` string

## Request body

- InternalAccountCreateRequest: Request body for `POST /internal-accounts`. Only `RULE_BASED` accounts can be created today, and they are rejected without a `sweepRule` — the type and its rule are created together or not at all.
  - `customerId` string: The customer the account is created for. Omit it to create a platform-owned account. The account holder must already have a verified account in the same currency, which is where funds land when a sweep cannot be completed.
  - `type` 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET' | 'RULE_BASED' | 'BULK_SETTLEMENT', required: Classification of an internal account. - `INTERNAL_FIAT`: A Grid-managed fiat holding account (for example, the USD holding account used as the source for Payouts flows). - `INTERNAL_CRYPTO`: A Grid-managed crypto holding account denominated in a stablecoin such as USDC. - `EMBEDDED_WALLET`: A self-custodial Embedded Wallet provisioned for the customer. Outbound transfers require a session signature produced by the customer's device — see the Embedded Wallets guide. - `RULE_BASED`: An additional account number for an existing account holder, with a routing rule attached, so incoming payments can be attributed to a specific payer and swept automatically. Created with `POST /internal-accounts`. - `BULK_SETTLEMENT`: An account for receiving bulk payments (for example, a single settlement from a payment processor) that the platform then pays out to its customers. Only a platform can hold one, and funds in it can move only to the platform's customers.
  - `currency` string, required: Currency code the account is denominated in. Rule-based accounts are currently available in `USD`, `USDC`, and `USDT`. A `USD` account is issued its own bank account number; a `USDC` or `USDT` account is issued its own deposit address on each network your platform supports.
  - `onBehalfOfCustomerId` string: For regulated financial institutions only. The customer whose payments this platform-owned account receives. Only accepted when `customerId` is omitted, so the account stays yours; it records who incoming payments are for. The customer must belong to your platform. Several of your accounts can name the same customer.
  - `label` string: Your own name for the account, echoed back on reads. Useful for identifying which payer the account was issued for.
  - `sweepRule` SweepRuleRequest: The routing rule attached to a rule-based account. Every payment that settles into the account is swept to the rule's destination, carrying the payment metadata configured here.
    - `destination` SweepRuleDestinationRequest, required: The account a rule-based account sweeps its incoming payments to.
      - `accountId` string, required: Reference to the account that receives the swept funds. May be an external account or another internal account, but never a `RULE_BASED` internal account — that account's own rule would sweep the funds on again. The destination may be denominated in a different currency, in which case the sweep is converted at the prevailing rate.
      - `paymentRail` 'ACH' | 'ACH_COLOMBIA' | 'ACH_SAME_DAY' | 'BANK_TRANSFER' | 'BRE_B' | 'CIPS' | 'FAST' | 'FASTER_PAYMENTS' | 'FEDNOW' | 'INSTAPAY' | 'MOBILE_MONEY' | 'NEFT' | 'PAYNOW' | 'PESONET' | 'PIX' | 'RTGS' | 'RTP' | 'SEPA' | 'SEPA_INSTANT' | 'SPEI' | 'SWIFT' | 'UNIONPAY' | 'UPI' | 'WIRE': The payment rail used for the transfer. Payment rails represent the underlying payment network or system used to move funds between accounts. `ACH_SAME_DAY` requests same-business-day settlement for a USD payout and is priced separately. It is subject to the NACHA per-entry same-day limit, which the network applies to every originator: $1,000,000 per entry, rising to $10,000,000 on 2027-09-17. A payout above that limit is rejected rather than slowed — check the amount before requesting this rail, or send it over `ACH`, which settles on the standard schedule and has no such limit. `ACH` will settle on the standard next-business-day schedule. Until a date we announce in advance, `ACH` continues to settle same-business-day on production platforms; it already settles next-business-day on sandbox platforms. To guarantee same-day settlement after that date, request `ACH_SAME_DAY`.
    - `purposeOfPayment` 'GIFT' | 'SELF' | 'GOODS_OR_SERVICES' | 'EDUCATION' | 'HEALTH_OR_MEDICAL' | 'REAL_ESTATE_PURCHASE' | 'TAX_PAYMENT' | 'LOAN_PAYMENT' | 'UTILITY_BILL' | 'DONATION' | 'TRAVEL' | 'FAMILY_SUPPORT' | 'SALARY_PAYMENT' | 'EXPORTED_GOODS_PREPAYMENT' | 'EXPORTED_GOODS_POSTPAYMENT' | 'SERVICE_CHARGES' | 'OFFICE_EXPENSES' | 'DELIVERY_FEES' | 'HOTEL_ACCOMMODATION' | 'COMMISSION_ON_GOODS' | 'COMMISSION_ON_SERVICES' | 'ACCOUNTING_SERVICES' | 'EXHIBITION_SERVICES' | 'OTHER': The purpose of the payment. This may be required when sending to certain geographies (e.g. India). Some destinations accept only certain purposes. A business payout to China must use one of the purposes listed in [Supporting Documents](https://docs.lightspark.com/payouts-and-b2b/payment-flow/send-payment#supporting-documents), and each needs its own supporting documents.
    - `description` string: Free-form description recorded on each sweep. Not delivered to the recipient; use `remittanceInformation` for that.
    - `remittanceInformation` string: Free-form information that travels with each sweep to the recipient. The field this populates depends on the payment rail: for ACH it populates the Addenda record, for FedNow and RTP it populates the remittanceInformation field, and for wires it populates the OBI (Originator to Beneficiary Information) / beneficiary information. Only printable ASCII characters are accepted, because the underlying rails carry nothing else.
    - `platformFeeOverride` PlatformFeeOverride: Overrides the platform-collected fee for this transaction. When present, it replaces any configured platform-collected fees that would otherwise apply to the transaction. The fixed fee must be denominated in the quote's source currency.
      - `platformFixedFee` FixedFee, required: Fixed fee charged per transaction.
        - `amount` integer, required: Fee amount in the smallest unit of the fixed fee's `currency` (e.g., cents for USD).
        - `currency` string, required: Three-letter currency code (ISO 4217) the fixed fee is denominated in. Some cryptocurrencies may use their own ticker symbols (e.g. "BTC" for Bitcoin, "USDC" for USDC, etc.)
      - `platformVariableFeeBps` integer, required: Variable fee in basis points (1 bps = 0.01%) to apply to the transaction's source-currency amount.

## Response `200`

The `Idempotency-Key` was already used to create this account. The account created by the first request is returned unchanged.

- InternalAccount
  - `id` string, required: The ID of the internal account
  - `customerId` string: The ID of the customer associated with the internal account. If this field is empty, the internal account belongs to the platform.
  - `type` 'INTERNAL_FIAT' | 'INTERNAL_CRYPTO' | 'EMBEDDED_WALLET' | 'RULE_BASED' | 'BULK_SETTLEMENT', required: Classification of an internal account. - `INTERNAL_FIAT`: A Grid-managed fiat holding account (for example, the USD holding account used as the source for Payouts flows). - `INTERNAL_CRYPTO`: A Grid-managed crypto holding account denominated in a stablecoin such as USDC. - `EMBEDDED_WALLET`: A self-custodial Embedded Wallet provisioned for the customer. Outbound transfers require a session signature produced by the customer's device — see the Embedded Wallets guide. - `RULE_BASED`: An additional account number for an existing account holder, with a routing rule attached, so incoming payments can be attributed to a specific payer and swept automatically. Created with `POST /internal-accounts`. - `BULK_SETTLEMENT`: An account for receiving bulk payments (for example, a single settlement from a payment processor) that the platform then pays out to its customers. Only a platform can hold one, and funds in it can move only to the platform's customers.
  - `status` 'PENDING' | 'ACTIVE' | 'CLOSED' | 'FROZEN' | 'FAILED', required: Status of a Grid internal account. The status determines whether the account can send or receive payments. - `PENDING`: The account is under review and is being provisioned. The account cannot send or receive payments until provisioning completes. - `ACTIVE`: The account is ready to send and receive payments. - `CLOSED`: The account cannot send or receive payments. A customer can initiate the closing of an internal account, after which the account transitions to this status. - `FROZEN`: The account cannot send or receive payments. Grid may freeze an account in response to compliance or fraud signals; payments are blocked while the account remains frozen. - `FAILED`: The account could not be provisioned. Grid was unable to create the underlying account, so it cannot send or receive payments and requires remediation.
  - `balance` CurrencyAmount, required
    - `amount` integer, required: Amount in the smallest unit of the currency (e.g., cents for USD/EUR, satoshis for BTC)
    - `currency` Currency, required
      - `code` string: Three-letter currency code (ISO 4217) for fiat currencies. Some cryptocurrencies may use their own ticker symbols (e.g. "BTC" for Bitcoin, "USDC" for USDC, etc.)
      - `name` string: Full name of the currency
      - `symbol` string: Symbol of the currency
      - `decimals` integer: Number of decimal places for the currency
  - `totalBalance` CurrencyAmount, required
    - `amount` integer, required: Amount in the smallest unit of the currency (e.g., cents for USD/EUR, satoshis for BTC)
    - `currency` Currency, required
      - `code` string: Three-letter currency code (ISO 4217) for fiat currencies. Some cryptocurrencies may use their own ticker symbols (e.g. "BTC" for Bitcoin, "USDC" for USDC, etc.)
      - `name` string: Full name of the currency
      - `symbol` string: Symbol of the currency
      - `decimals` integer: Number of decimal places for the currency
  - `fundingPaymentInstructions` PaymentInstructions[], required: Payment instructions for funding the account. Empty while funding is withheld. Only bank (`USD_ACCOUNT`, `EUR_ACCOUNT`, `SWIFT_ACCOUNT`) and network wallet types appear here.
    - `instructionsNotes` string: Additional human-readable instructions for making the payment
    - `isPlatformAccount` boolean: Indicates whether the account is a platform account or a customer account.
    - `accountOrWalletInfo` union, required: Where to send the funds. Quotes can carry any of these types. Internal accounts return only `USD_ACCOUNT`, `EUR_ACCOUNT`, `SWIFT_ACCOUNT`, and the network wallet types; MXN, BRL, COP, ARS, Lightning, and Bitcoin L1 instructions appear only on real-time funded quotes.
      - PaymentUsdAccountInfo
        - `accountType` 'USD_ACCOUNT', required: Type of payment account or wallet
        - `accountNumber` string, required: The account number of the bank
        - `routingNumber` string, required: The ABA routing number
        - `bankName` string: The name of the financial institution holding the account. Optional on every rail, and recommended for wires, where it identifies the beneficiary's institution on the payment message. Not checked against `GET /discoveries`.
        - `intermediaryBankName` string: The name of the intermediary financial institution, for accounts reachable only through a correspondent bank. Used on the WIRE rail; ignored on ACH, RTP and FEDNOW.
        - `intermediaryRoutingNumber` string: The ABA routing number of the intermediary financial institution. Used on the WIRE rail; ignored on ACH, RTP and FEDNOW.
        - `fiToFiInformation` string: Bank-to-bank instructions carried alongside the payment. Used on the WIRE rail; ignored on ACH, RTP and FEDNOW.
        - `paymentRails` string[], required
        - `bankAccountType` 'CHECKING' | 'SAVINGS': Whether the account is a checking or a savings account. Grid uses this to set the ACH transaction code, so a value that does not match the account causes the receiving bank to return a notification of change.
        - `reference` string, required: Unique reference code that must be included with the payment to properly credit it
        - `bankAddress` string: The postal address of the financial institution holding the account, on a single line. Optional on every rail, and recommended for wires, where some originating banks require the beneficiary institution's address before they will send.
      - PaymentEurAccountInfo
        - `accountType` 'EUR_ACCOUNT', required: Type of payment account or wallet
        - `iban` string, required: The IBAN of the bank account
        - `swiftCode` string: The SWIFT/BIC code of the bank. When omitted, Grid derives it from the IBAN when possible. Provide it when automatic derivation is unavailable.
        - `paymentRails` string[], required
        - `reference` string, required: Unique reference code that must be included with the payment to properly credit it
      - PaymentSwiftAccountInfo: At least one of accountNumber or iban is always present: IBAN-only corridors (e.g. BR, GB) use iban, other corridors use accountNumber, and both appear when the bank exposes both identifiers for the same account.
        - `accountType` 'SWIFT_ACCOUNT', required: Type of payment account or wallet
        - `country` string, required: The ISO 3166-1 alpha-2 country code of the bank account
        - `swiftCode` string, required: The SWIFT/BIC code of the bank
        - `bankName` string, required: The name of the bank
        - `accountNumber` string: The bank account number. Required for most corridors. Use iban instead for IBAN-only corridors (e.g. BR, GB).
        - `iban` string: The IBAN of the bank account. Required for IBAN-only corridors (e.g. BR, GB). Use accountNumber for all other corridors.
        - `paymentRails` string[], required
        - `accountHolderName` string, required: The name of the account holder as it must appear on the wire. Remitting banks match this against the beneficiary name field, so payers should copy it exactly.
        - `bankAddress` string: The address of the bank holding the account, when known.
        - `reference` string: Reference code to include with the payment when present. SWIFT payments are attributed by the destination account number/IBAN, so this account type typically requires no reference.
      - PaymentMxnAccountInfo
        - `accountType` 'MXN_ACCOUNT', required: Type of payment account or wallet
        - `clabeNumber` string, required: The CLABE number of the bank
        - `paymentRails` string[], required
        - `reference` string, required: Unique reference code that must be included with the payment to properly credit it
      - PaymentBrlAccountInfo
        - `accountType` 'BRL_ACCOUNT', required: Type of payment account or wallet
        - `qrCode` string, required: A PIX QR code payload that can be used to fund the transaction. This can be rendered as a QR code image or pasted into a PIX-compatible banking app.
      - PaymentCopAccountInfo
        - `accountType` 'COP_ACCOUNT', required: Type of payment account or wallet
        - `paymentUrl` string, uri, required: A payment URL where the customer can complete their COP deposit.
      - PaymentArsAccountInfo
        - `accountType` 'ARS_ACCOUNT', required: Type of payment account or wallet
        - `accountNumber` string, required: The static CVU (Clave Virtual Uniforme) bank account number to pay to.
      - PaymentSparkWalletInfo
        - `accountType` 'SPARK_WALLET', required: Type of payment account or wallet
        - `address` string, required: Spark wallet address
        - `assetType` string, required: Type of asset or configured Spark token currency code
        - `invoice` string: Invoice for the payment
      - PaymentLightningInvoiceInfo
        - `accountType` 'LIGHTNING', required: Type of payment account or wallet
        - `invoice` string, required: Invoice for the payment
      - PaymentBitcoinDepositAddressInfo
        - `accountType` 'BITCOIN_L1', required: Type of payment account or wallet
        - `address` string, required: On-chain Bitcoin (L1) deposit address to send funds to
        - `network` 'BITCOIN': The blockchain network for the deposit address.
      - PaymentSolanaWalletInfo
        - `accountType` 'SOLANA_WALLET', required: Type of payment account or wallet
        - `address` string, required: Solana wallet address
        - `assetType` 'USDC' | 'USDT': Type of asset
      - PaymentEthereumWalletInfo
        - `accountType` 'ETHEREUM_WALLET', required: Type of payment account or wallet
        - `address` string, required: Ethereum L1 wallet address
        - `assetType` 'USDC' | 'USDT': Type of asset
      - PaymentBaseWalletInfo
        - `accountType` 'BASE_WALLET', required: Type of payment account or wallet
        - `address` string, required: Base eth wallet address
        - `assetType` 'USDC': Type of asset
      - PaymentPolygonWalletInfo
        - `accountType` 'POLYGON_WALLET', required: Type of payment account or wallet
        - `address` string, required: Polygon eth wallet address
        - `assetType` 'USDC': Type of asset
      - PaymentArbitrumWalletInfo
        - `accountType` 'ARBITRUM_WALLET', required: Type of payment account or wallet
        - `address` string, required: Arbitrum wallet address
        - `assetType` 'USDC' | 'USDT': Type of asset
      - PaymentTronWalletInfo
        - `accountType` 'TRON_WALLET', required: Type of payment account or wallet
        - `address` string, required: Tron wallet address
        - `assetType` 'USDT': Type of asset
      - PaymentPlasmaWalletInfo
        - `accountType` 'PLASMA_WALLET', required: Type of payment account or wallet
        - `address` string, required: Plasma wallet address
        - `assetType` 'USDT': Type of asset
      - PaymentEmbeddedWalletInfo
        - `accountType` 'EMBEDDED_WALLET', required: Discriminator value identifying this as Embedded Wallet payment instructions.
        - `payloadToSign` string, required: JSON-encoded transaction signing payload that must be stamped, as-is (byte-for-byte, without re-serialization), with the session private key of a verified authentication credential on the source Embedded Wallet. The resulting Grid wallet signature is passed as the `Grid-Wallet-Signature` header on `POST /quotes/{quoteId}/execute` to authorize the outbound transfer from the wallet.
  - `onBehalfOfCustomerId` string: The customer whose payments this platform-owned account receives. Only set by regulated financial institutions. Omitted for accounts that name no such customer, which includes every account owned by a customer.
  - `label` string: The platform-supplied label recorded when the account was created. Null for accounts that carry none.
  - `sweepRule` SweepRule: The routing rule attached to a rule-based account. Returned on the account rather than as a resource of its own, because the rule has no lifecycle apart from the account.
    - `destination` SweepRuleDestination, required: Where a rule-based account's credits are swept.
      - `accountId` string, required: The account that receives the swept funds.
      - `paymentRail` 'ACH' | 'ACH_COLOMBIA' | 'ACH_SAME_DAY' | 'BANK_TRANSFER' | 'BRE_B' | 'CIPS' | 'FAST' | 'FASTER_PAYMENTS' | 'FEDNOW' | 'INSTAPAY' | 'MOBILE_MONEY' | 'NEFT' | 'PAYNOW' | 'PESONET' | 'PIX' | 'RTGS' | 'RTP' | 'SEPA' | 'SEPA_INSTANT' | 'SPEI' | 'SWIFT' | 'UNIONPAY' | 'UPI' | 'WIRE': The payment rail used for the transfer. Payment rails represent the underlying payment network or system used to move funds between accounts. `ACH_SAME_DAY` requests same-business-day settlement for a USD payout and is priced separately. It is subject to the NACHA per-entry same-day limit, which the network applies to every originator: $1,000,000 per entry, rising to $10,000,000 on 2027-09-17. A payout above that limit is rejected rather than slowed — check the amount before requesting this rail, or send it over `ACH`, which settles on the standard schedule and has no such limit. `ACH` will settle on the standard next-business-day schedule. Until a date we announce in advance, `ACH` continues to settle same-business-day on production platforms; it already settles next-business-day on sandbox platforms. To guarantee same-day settlement after that date, request `ACH_SAME_DAY`.
    - `minimumAmount` CurrencyAmount
      - `amount` integer, required: Amount in the smallest unit of the currency (e.g., cents for USD/EUR, satoshis for BTC)
      - `currency` Currency, required
        - `code` string: Three-letter currency code (ISO 4217) for fiat currencies. Some cryptocurrencies may use their own ticker symbols (e.g. "BTC" for Bitcoin, "USDC" for USDC, etc.)
        - `name` string: Full name of the currency
        - `symbol` string: Symbol of the currency
        - `decimals` integer: Number of decimal places for the currency
    - `maximumAmount` CurrencyAmount
      - `amount` integer, required: Amount in the smallest unit of the currency (e.g., cents for USD/EUR, satoshis for BTC)
      - `currency` Currency, required
        - `code` string: Three-letter currency code (ISO 4217) for fiat currencies. Some cryptocurrencies may use their own ticker symbols (e.g. "BTC" for Bitcoin, "USDC" for USDC, etc.)
        - `name` string: Full name of the currency
        - `symbol` string: Symbol of the currency
        - `decimals` integer: Number of decimal places for the currency
    - `purposeOfPayment` 'GIFT' | 'SELF' | 'GOODS_OR_SERVICES' | 'EDUCATION' | 'HEALTH_OR_MEDICAL' | 'REAL_ESTATE_PURCHASE' | 'TAX_PAYMENT' | 'LOAN_PAYMENT' | 'UTILITY_BILL' | 'DONATION' | 'TRAVEL' | 'FAMILY_SUPPORT' | 'SALARY_PAYMENT' | 'EXPORTED_GOODS_PREPAYMENT' | 'EXPORTED_GOODS_POSTPAYMENT' | 'SERVICE_CHARGES' | 'OFFICE_EXPENSES' | 'DELIVERY_FEES' | 'HOTEL_ACCOMMODATION' | 'COMMISSION_ON_GOODS' | 'COMMISSION_ON_SERVICES' | 'ACCOUNTING_SERVICES' | 'EXHIBITION_SERVICES' | 'OTHER': The purpose of the payment. This may be required when sending to certain geographies (e.g. India). Some destinations accept only certain purposes. A business payout to China must use one of the purposes listed in [Supporting Documents](https://docs.lightspark.com/payouts-and-b2b/payment-flow/send-payment#supporting-documents), and each needs its own supporting documents.
    - `description` string: Free-form description recorded on each sweep. Not delivered to the recipient.
    - `remittanceInformation` string: Free-form information that travels with each sweep to the recipient.
    - `platformFeeOverride` PlatformFeeOverride: Overrides the platform-collected fee for this transaction. When present, it replaces any configured platform-collected fees that would otherwise apply to the transaction. The fixed fee must be denominated in the quote's source currency.
      - `platformFixedFee` FixedFee, required: Fixed fee charged per transaction.
        - `amount` integer, required: Fee amount in the smallest unit of the fixed fee's `currency` (e.g., cents for USD).
        - `currency` string, required: Three-letter currency code (ISO 4217) the fixed fee is denominated in. Some cryptocurrencies may use their own ticker symbols (e.g. "BTC" for Bitcoin, "USDC" for USDC, etc.)
      - `platformVariableFeeBps` integer, required: Variable fee in basis points (1 bps = 0.01%) to apply to the transaction's source-currency amount.
  - `privateEnabled` boolean: Whether wallet privacy is enabled for the Embedded Wallet. Only present for `EMBEDDED_WALLET` internal accounts.
  - `cardCapabilities` CardCapabilities: Actions supported by the card program associated with this resource.
    - `supportsVelocityLimits` boolean, required: Whether this card program supports platform-managed limits through `/card-velocity-limits`. Supported where Grid makes authorization decisions; false where the issuer makes them. Amounts use the card's currency, regardless of its funding source.
    - `supports3dSecurePassword` boolean, required: Whether cards in this program accept a caller-supplied `threeDSecurePassword`.
    - `supportsPanReveal` boolean, required: Whether cards in this program can be revealed through `POST /cards/{id}/reveal`.
    - `supportsDigitalWalletTokenization` boolean, required: Whether cards in this program can be added to Apple Pay, Google Pay, or Samsung Pay from your app through `POST /cards/{id}/tokenize`. Manual entry into a wallet works regardless of this flag.
  - `createdAt` string, date-time, required: Timestamp when the internal account was created
  - `updatedAt` string, date-time, required: Timestamp when the internal account was last updated

## Other responses

- `201`: Internal account created. `fundingPaymentInstructions` carries the account's own number.
- `400`: Bad request. Returned when `type` is not `RULE_BASED`, when `sweepRule` is missing, when the currency is not supported for rule-based accounts, when the account holder has no account in that currency yet, when the destination cannot accept the requested payment rail, and for general invalid parameters.
- `401`: Unauthorized
- `403`: Forbidden - rule-based accounts are not enabled for this platform.
- `404`: Customer or destination account not found
- `409`: Conflict - the `Idempotency-Key` was already used to create a materially different account. Use a new key for a new account.
- `500`: Internal service error

## Changes

> 115 revisions in range; 2 not diffed.

- **2026-10-28** `d996ddfb9d2b`: 5 info
  - added the optional property `details/missingFields` to the response with the `400` status
  - added the optional property `details/permission` to the response with the `403` status
  - added the optional property `details/policyDenialReason` to the response with the `403` status
  - added the optional property `details/refusalReason` to the response with the `400` status
  - …1 more
- **2026-10-28** `5abf2bb56bcb`: 1 warning
  - added the new `CORRIDOR_UNDER_MAINTENANCE` enum value to the `code` response property for the response status `403`
- **2026-10-27** `5fbda612feb8`: 6 breaking, 2 info
  - removed the required property `cardCapabilities/supportsSpendLimits` from the response with the `200` status
  - removed the required property `cardCapabilities/supportsSpendLimits` from the response with the `201` status
  - removed the required property `cardCapabilities/supportsSpendLimitsAtIssuance` from the response with the `200` status
  - removed the required property `cardCapabilities/supportsSpendLimitsAtIssuance` from the response with the `201` status
  - …4 more
- **2026-10-26** `f11f1e76bdd7`: 1 warning
  - added the new `PURCHASE_CARD_LIMIT_REACHED` enum value to the `code` response property for the response status `409`
- **2026-10-26** `0a6dad5815c7`: 1 warning
  - added the new `INVOICE_ALREADY_USED` enum value to the `code` response property for the response status `409`

[Operation history](https://skmtc.dev/lightsparkdev/apis/grid-api/changes/internal-accounts/post.md)

---

[API](https://skmtc.dev/lightsparkdev/apis/grid-api.md) - [All operations](https://skmtc.dev/lightsparkdev/apis/grid-api/llms.txt) - [OpenAPI document](https://skmtc.dev/lightsparkdev/apis/grid-api/revisions/7a1db46ec552?raw)
