Docs

Create a transaction template

POST /api/v1/programmatic/transaction-templates

POST/api/v1/programmatic/transaction-templates
Transaction Templatesv1transaction_templates:create

Creates a user-saved transaction template in the PAT workspace. At least one transaction default besides direction and name is required.

Parameters

NameInType Description
Idempotency-KeyheaderstringRequired Unique 16–128 character retry key. Reuse it only when retrying the identical template. template_20260722_01J2Y8M4R1

Request body

application/json

Reusable transaction defaults. Wallet references are optional; their role depends on the selected direction. Supply at least one wallet, category, amount, description, or notes value.

{
  "direction": "expense",
  "name": "Lunch",
  "source_wallet_id": "<asset-wallet-id>",
  "amount_minor": "1250",
  "currency_code": "USD",
  "description": "Weekday lunch"
}

Code examples

curl --request POST \
  --url 'https://api.tetri.app/api/v1/programmatic/transaction-templates' \
  --header 'Authorization: Bearer $TETRI_API_TOKEN' \
  --header 'Idempotency-Key: template_20260722_01J2Y8M4R1' \
  --header 'Content-Type: application/json' \
  --data '{ "direction": "expense", "name": "Lunch", "source_wallet_id": "<asset-wallet-id>", "amount_minor": "1250", "currency_code": "USD", "description": "Weekday lunch" }'

Responses

201Transaction template created with resolved references.
{
  "data": {
    "id": "<uuid>",
    "source": "user_saved",
    "name": "<string>",
    "direction": "income",
    "fields": {
      "sourceWallet": {},
      "targetWallet": {},
      "category": {},
      "amountMinor": "1250",
      "currencyCode": "USD",
      "description": "<string>",
      "notes": "<string>",
      "note": "<string>",
      "tags": [
        "<string>"
      ],
      "recurrencePreset": "daily"
    },
    "usageCount": 0,
    "lastUsedAt": "2026-07-12T12:00:00Z"
  },
  "side_effects": [
    {
      "domain": "wallets",
      "id": "<string>",
      "action": "upsert",
      "data": {}
    }
  ]
}
400Request parameters or payload failed validation. Inspect `code` and `message`.
{
  "statusCode": 400,
  "code": "PROGRAMMATIC_PAGINATION_MODE_CONFLICT",
  "message": "<string>",
  "error": "Bad Request",
  "request_id": "8cf64dcc-0f73-4f8d-a845-3d80c1040475"
}
401The personal access token is missing, invalid, expired, or revoked.
{
  "statusCode": 400,
  "code": "PROGRAMMATIC_PAGINATION_MODE_CONFLICT",
  "message": "<string>",
  "error": "Bad Request",
  "request_id": "8cf64dcc-0f73-4f8d-a845-3d80c1040475"
}
403The token lacks the required scope or no longer has workspace access.
{
  "statusCode": 400,
  "code": "PROGRAMMATIC_PAGINATION_MODE_CONFLICT",
  "message": "<string>",
  "error": "Bad Request",
  "request_id": "8cf64dcc-0f73-4f8d-a845-3d80c1040475"
}
409The idempotency key was reused with a different request or the resource state conflicts.
{
  "statusCode": 400,
  "code": "PROGRAMMATIC_PAGINATION_MODE_CONFLICT",
  "message": "<string>",
  "error": "Bad Request",
  "request_id": "8cf64dcc-0f73-4f8d-a845-3d80c1040475"
}
422The payload is syntactically valid but violates a domain constraint.
{
  "statusCode": 400,
  "code": "PROGRAMMATIC_PAGINATION_MODE_CONFLICT",
  "message": "<string>",
  "error": "Bad Request",
  "request_id": "8cf64dcc-0f73-4f8d-a845-3d80c1040475"
}
429The credential exceeded its request rate limit.
{
  "statusCode": 400,
  "code": "PROGRAMMATIC_PAGINATION_MODE_CONFLICT",
  "message": "<string>",
  "error": "Bad Request",
  "request_id": "8cf64dcc-0f73-4f8d-a845-3d80c1040475"
}