---
title: "Create Crypto Transaction"
method: POST
path: "/accounts/{account_id}/crypto"
tags: ["Transfers"]
---

# Create Crypto Transaction

`POST /accounts/{account_id}/crypto`

## Request

- Base URL: `https://api.meow.com/v1`
- URL: `https://api.meow.com/v1/accounts/{account_id}/crypto`
- Auth: API key in header `x-api-key`
- TypeScript: <https://skmtc.dev/meow/apis/meow-api/docs/accounts/:account_id/crypto/post.ts> (a function with typed inputs; its response is checked against the schema)

Creates a new crypto transaction from a specified account. The currency and network are determined automatically from the destination's payment method. Provide exactly one of `static_memo_id` or `crypto_id` to identify the destination:

- **`static_memo_id`**: Use the ID from the contact's `payment_methods.static_memos` array. Supported for both banking and wallet accounts.
- **`crypto_id`**: Use the ID from the contact's `payment_methods.crypto` array. Supported for both banking and wallet accounts.

Supported currencies: `usdc`, `usdt`, `pyusd`, `cash`, `usdg`, `path_usd`.

Requires the `transfers:crypto:write` scope. Use this endpoint for all crypto transfers. The legacy `/usdc` endpoint is deprecated.

## Path parameters

- `account_id` string, required: The ID of the account.

## Headers

- `Idempotency-Key` string, nullable: A unique key you generate (1-50 printable ASCII characters, no spaces) so retrying this request never creates a duplicate. Reusing a key is rejected.
- `x-entity-id` string, uuid

## Request body

- CreateCryptoTransactionRequest
  - `amount` union, required: Amount to send, in USD.
    - number
    - string
  - `static_memo_id` string, uuid, nullable: Destination static memo. Provide exactly one of static_memo_id or crypto_id.
  - `crypto_id` string, uuid, nullable: Destination crypto address on a contact. Provide exactly one of static_memo_id or crypto_id.
  - `internal_note` string, nullable: Private note, visible only inside Meow.
  - `emails` string[], nullable: Addresses to notify when the transaction is sent, as a list.
  - `metadata` object, nullable: Your own key/value data to attach to this object. Meow stores it unchanged and returns it on every read of the object and on every webhook event about it, so you can match it back to your own records. Up to 20 pairs; keys up to 40 characters, values up to 200, and 5 KB serialized as JSON in total — note that a non-ASCII character counts as 6 bytes and an emoji as 12. Values must be strings. Meow never interprets it — do not put anything here that needs to stay private.

## Response `200`

Successful Response

- CreateCryptoTransactionResponse
  - `id` union: Identifier of the transaction, for use with Get Crypto Transaction. `null` until the transfer leaves the queue, so it is always absent while `status` is `processing` or `pending_approval`. Use `approval_id` as the stable handle instead.
    - string
    - string, uuid
  - `status` 'pending' | 'pending_approval' | 'canceled' | 'processing' | 'error' | 'sent' | 'returned' | 'void', required
  - `amount` string, required: Amount sent, in USD. Echoes the request.
  - `internal_note` string, nullable: Private note, visible only inside Meow. Echoes the request.
  - `created_time` integer, required: When the transaction was created, as a Unix timestamp in seconds.
  - `destination_address` string, required: On-chain address the funds were sent to.
  - `destination_payment_rail` 'arbitrum' | 'avalanche_c_chain' | 'base' | 'ethereum' | 'optimism' | 'polygon' | 'solana' | 'stellar' | 'sui' | 'tempo' | 'tron' | 'xdc' | 'ach' | 'ach_push' | 'ach_same_day' | 'fednow' | 'wire' | 'swift' | 'sepa' | 'faster_payments' | 'spei' | 'bridge_transfer', required
  - `destination_address_nickname` string, nullable: Nickname of the contact that owns the destination address. `null` when the address is not attached to a contact.
  - `approval_id` string, uuid, required: Handle for this transaction, returned whether or not an approval policy gated it. Pass it to `GET /approvals/{approval_id}` to follow the transaction to completion.
  - `message` string, nullable: Human-readable next step. Set only when `status` is `pending_approval`; otherwise `null`.
  - `metadata` object, nullable: The metadata attached when this object was created, unchanged. `null` when none was attached. Rarely, a `.created` webhook can be published before the create request finishes committing, and that one event reports `null`; every later event and every read of the object carries the metadata.

## Other responses

- `400`: The request could not be processed.
- `401`: Authentication failed.
- `403`: The API key is not authorized for this operation, or the user of a global API key is an admin or controller without approved KYC. The KYC case returns the message `KYC is required for controllers and admins.` until that user completes KYC in the Meow dashboard.
- `429`: Too many requests.

---

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