API reference
Expense
Money already spent from a bank, card or cash account (a purchase, a check).
The expense object
- object string
- string
- Always "expense".
- id id
- id
- The expense's id (a UUID). Use it to fetch it, or to refer to it from other things.
- vendor_id id or null
- id or null
- Who was paid, if known.
- date date
- date
- When.
- paid_from_account_id id
- id
- The bank, card or cash account it came out of.
- method string or null
- string or null
- How it was paid.
- currency string
- string
- The business's currency: USD or CAD. All _cents amounts are in it.
- total_cents integer
- integer
- The total.
- memo string or null
- string or null
- Memo.
- location_id id or null
- id or null
- Its location (Locations), if any.
- created_at timestamp
- timestamp
- When it was added, in UTC.
- lines list
- list
- Only when fetching one expense. Lines as on a bill.
Example
{
"object": "expense",
"id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708107",
"vendor_id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708102",
"date": "2026-10-06",
"paid_from_account_id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708133",
"method": "Card",
"currency": "USD",
"total_cents": 8950,
"memo": null,
"location_id": null,
"created_at": "2026-10-06T14:30:00.000Z",
"lines": [
{
"id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708170",
"account_id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708130",
"description": "Gloves and masks",
"amount_cents": 8950,
"tax_cents": 0,
"product_id": null,
"quantity": null,
"rate_cents": null,
"project_id": null,
"class_id": null
}
]
}List expenses
GET /api/v1/expenses
Expenses (paid straight away), newest first.
Key: any (Read only works).
Query
- limit integer
- integer
- How many, 1 to 100 (default 25).
- starting_after id
- id
- The last id of the page before, for the next page (when has_more is true).
- filters
- vendor_id
Newest first. Answers a list: { object: "list", url, has_more, data }.
Request
curl https://tallypip.com/api/v1/expenses?limit=3 \ -H "Authorization: Bearer tpk_your_key"
Answer: 200
{
"object": "list",
"url": "/api/v1/expenses",
"has_more": false,
"data": [
{
"object": "expense",
"id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708107",
"vendor_id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708102",
"date": "2026-10-06",
"paid_from_account_id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708133",
"method": "Card",
"currency": "USD",
"total_cents": 8950,
"memo": null,
"location_id": null,
"created_at": "2026-10-06T14:30:00.000Z",
"lines": [
{
"id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708170",
"account_id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708130",
"description": "Gloves and masks",
"amount_cents": 8950,
"tax_cents": 0,
"product_id": null,
"quantity": null,
"rate_cents": null,
"project_id": null,
"class_id": null
}
]
}
]
}Try it
With your own key (Settings › Connected apps). It stays in this page only, and reading can't change anything.
Create an expense
POST /api/v1/expenses
Record an expense paid from a bank, card or cash account.
Key: Read and change.
Body (JSON)
- paid_from_account_id id
- id
- Required. A bank, card or cash account from /accounts.
- lines, items list
- list
- As on a bill.
- vendor_id, date, method, memo, location_id …
- …
- Optional. date defaults to today.
Answers 201 with the new expense. Refused with 400 and the reason (nothing is saved); send an Idempotency-Key so a retry can't make it twice.
Request
curl https://tallypip.com/api/v1/expenses \
-H "Authorization: Bearer tpk_your_key" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: <a new id for each change>" \
-d '{
"paid_from_account_id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708133",
"vendor_id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708102",
"lines": [
{
"account_id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708130",
"amount_cents": 8950
}
]
}'Answer: 201
{
"object": "expense",
"id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708107",
"vendor_id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708102",
"date": "2026-10-06",
"paid_from_account_id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708133",
"method": "Card",
"currency": "USD",
"total_cents": 8950,
"memo": null,
"location_id": null,
"created_at": "2026-10-06T14:30:00.000Z",
"lines": [
{
"id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708170",
"account_id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708130",
"description": "Gloves and masks",
"amount_cents": 8950,
"tax_cents": 0,
"product_id": null,
"quantity": null,
"rate_cents": null,
"project_id": null,
"class_id": null
}
]
}Retrieve an expense
GET /api/v1/expenses/{id}
One expense with its lines.
Key: any (Read only works).
Request
curl https://tallypip.com/api/v1/expenses/3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708107 \ -H "Authorization: Bearer tpk_your_key"
Answer: 200
{
"object": "expense",
"id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708107",
"vendor_id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708102",
"date": "2026-10-06",
"paid_from_account_id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708133",
"method": "Card",
"currency": "USD",
"total_cents": 8950,
"memo": null,
"location_id": null,
"created_at": "2026-10-06T14:30:00.000Z",
"lines": [
{
"id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708170",
"account_id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708130",
"description": "Gloves and masks",
"amount_cents": 8950,
"tax_cents": 0,
"product_id": null,
"quantity": null,
"rate_cents": null,
"project_id": null,
"class_id": null
}
]
}Try it
With your own key (Settings › Connected apps). It stays in this page only, and reading can't change anything.