Internal Transfer

Changed on

Submit a signed internal ledger transfer between two exchange accounts. Sign with the source account owner or a non-expired trading key registered to the source account. Trading-key signatures require both accounts to belong to the same nonzero, exchange-managed account group. Owner signatures remain valid regardless of group membership.

Expired trading keys receive proxy_expired; other authorization failures receive signer_does_not_match_account. An unknown destination receives 400 destination account not found.

A 503 does not prove that the transfer was not submitted. Retry with backoff, honoring Retry-After when present, and resend the exact original signed request. Do not create a fresh signature, salt, or timestamp for the retry: it would identify a separate transfer. A signature_already_used rejection does not confirm whether the original transfer completed.

post/v1/account/internal-transfer

Request

  • Base URL: https://api.perpetuals.polymarket.com
  • URL: https://api.perpetuals.polymarket.com/v1/account/internal-transfer
  • Auth: none required

Request body

sigstring required

Signature in hex format

saltinteger required

Salt

tsinteger required

Request timestamp. Unix milliseconds for most operations; Unix seconds for withdrawals (must match the on-chain EIP-712 struct verified against block.timestamp).

labelstring

Human-readable label for a proxy key or internal transfer

Example request

{
  "op": {
    "args": {
      "account": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
      "token": "0xaf88d065e77c8cc2239327c5edb3a432268e5831",
      "amount": "100",
      "to": "0x1234567890abcdef1234567890abcdef12345678"
    }
  },
  "sig": "0x1234567890...",
  "salt": 1234567890,
  "ts": 1767225600000,
  "label": "trading-bot"
}

Response

The accepted transfer, carrying its transfer_id.

status'ok' required
transfer_idinteger required

Internal transfer ID

Changes

    • breaking

      added subschema #2 to the response body oneOf list for the response status

    • breaking

      the response's body type changed from object to no type for status

    • breaking

      removed the required property from the response with the status

    • breaking

      removed the required property from the response with the status

    • breaking

      removed the required property from the response with the status

    • info

      added the non-success response with the status