payments.transfer

Record an evidenced transfer that already occurred between company accounts. Records both sides and any supported FX; does not move funds.

What it does

Records an evidenced transfer that already occurred; does not move funds between accounts. Record an evidenced transfer between two distinct company bank or wallet accounts, without a contract, invoice, income, expense or party claim. Card and personal accounts are not own-account cash transfers. amount/currency is what left the source account.

For an exchange between currencies, also supply receivedAmount/receivedCurrency, what arrived in the destination account: each amount posts only in its own currency’s ledger, and each ledger balances on its own through equity account 3420 Currency exchange. A wallet side may name a token by its CAIP-19 instead of a currency: its amount is in the token’s smallest unit and posts in that token’s own ledger. No rate is supplied or applied and no exchange gain or loss is posted.

A transfer that takes the source account below zero is recorded as the overdraft it is; whether the bank allows it is the bank’s decision, not the ledger’s. Separate fees require their own evidenced economics.

Before you send it

An authorized OAuth connection may call it, including a headless client. Effective membership, application grant and token permissions still apply. Describe payments.transfer through GET /v1/catalog/commands/{name} before acting.

This command does not accept source_document_id in its envelope. Any input evidence requirements remain as documented below.

Inputs

Put these fields inside the envelope’s input object. The outer envelope names the command, a stable idempotency_key and effective_at; request and recovery rules explain those separately. Use exact minor-unit integer strings for monetary fields. Take existing IDs from prior reads or command results; choose a new identity only where the command asks for one.

Required means required within its containing object; an optional parent can be omitted.

FieldTypeRequiredMeaning and accepted values
fromAccountIdstringYesMinimum length: 1.
toAccountIdstringYesMinimum length: 1.
amountstringYesPattern: "^[1-9][0-9]*$".
currencystringYesMinimum length: 1.
receivedAmountstringNoPattern: "^[1-9][0-9]*$".
receivedCurrencystringNoMinimum length: 1.
effectiveAtstringYesFormat: date-time.
sourceFactIdstringYesMinimum length: 1.
evidencearrayYesItems: object. Minimum items: 1.
evidence[].kindstringYesChoose "tap_message", "x402_receipt", "chain_tx", "signed_doc", "stripe_object", "other".
evidence[].refstringYesMinimum length: 1.
evidence[].signerstringNoMinimum length: 1.

After acceptance

When the command emits events, its documented effects and receipt are recorded in the command transaction. The response returns commandId, replayed, the command-specific result below and emitted events with their IDs and CIDs. A command is not automatically a cash movement or revenue recognition: use the behavior above to determine what this command records.

Inspect result and the affected records or reports before continuing. Save returned identifiers for later calls. Fetch GET /v1/commands/{id} with commandId to recover the accepted receipt; retry the same intent with the same idempotency key if the response was lost. Some commands can succeed with events: [] and return a transient result and commandId without persisting a receipt. A lookup of that ID can return null; retain the returned result and verify the affected record. Retrying can re-evaluate the current state rather than replay a stored result. A domain no_change is a separate success outcome with no persisted receipt.

Result fields

Required means required within its containing object; an optional parent can be omitted.

FieldTypeRequiredMeaning and accepted values
paymentIdstringYesMinimum length: 1.

All commands · Operation and errors · Reusable schemas

Keep credentials out of prompts; rehearse writes only in a disposable sandbox.

Exact request schema

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "name": {
      "const": "payments.transfer"
    },
    "input": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "fromAccountId",
        "toAccountId",
        "amount",
        "currency",
        "effectiveAt",
        "sourceFactId",
        "evidence"
      ],
      "properties": {
        "fromAccountId": {
          "type": "string",
          "minLength": 1
        },
        "toAccountId": {
          "type": "string",
          "minLength": 1
        },
        "amount": {
          "type": "string",
          "pattern": "^[1-9][0-9]*$"
        },
        "currency": {
          "type": "string",
          "minLength": 1
        },
        "receivedAmount": {
          "type": "string",
          "pattern": "^[1-9][0-9]*$"
        },
        "receivedCurrency": {
          "type": "string",
          "minLength": 1
        },
        "effectiveAt": {
          "type": "string",
          "format": "date-time"
        },
        "sourceFactId": {
          "type": "string",
          "minLength": 1
        },
        "evidence": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "kind",
              "ref"
            ],
            "properties": {
              "kind": {
                "enum": [
                  "tap_message",
                  "x402_receipt",
                  "chain_tx",
                  "signed_doc",
                  "stripe_object",
                  "other"
                ]
              },
              "ref": {
                "type": "string",
                "minLength": 1
              },
              "signer": {
                "type": "string",
                "minLength": 1
              }
            }
          }
        }
      }
    },
    "idempotency_key": {
      "type": "string",
      "minLength": 1,
      "maxLength": 256
    },
    "effective_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
    }
  },
  "required": [
    "name",
    "input",
    "idempotency_key",
    "effective_at"
  ],
  "additionalProperties": false
}

Accepted command receipt

{
  "type": "object",
  "required": [
    "commandId",
    "replayed",
    "result",
    "events"
  ],
  "properties": {
    "commandId": {
      "type": "string"
    },
    "replayed": {
      "type": "boolean"
    },
    "imported": {
      "const": true,
      "description": "The command's events are history from before the business joined Economico, recorded as an import: free of monthly events."
    },
    "result": {
      "type": "object",
      "required": [
        "paymentId"
      ],
      "properties": {
        "paymentId": {
          "type": "string",
          "minLength": 1
        }
      }
    },
    "events": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "cid": {
            "type": "string"
          }
        }
      }
    }
  }
}
Navigate documentation