API reference
Product or service
Something the business sells (or buys): its price, description, income account and tax. An invoice line can name one.
The product or service object
- object string
- string
- Always "product".
- id id
- id
- The product's id (a UUID). Use it to fetch it, or to refer to it from other things.
- type string
- string
- service, non_inventory or inventory (inventory items are added in TallyPip).
- name string
- string
- Its name.
- sku string or null
- string or null
- Stock-keeping unit.
- description string or null
- string or null
- What invoice lines say by default.
- price_cents integer
- integer
- Sales price for 1, in cents.
- sell boolean
- boolean
- Sold (can go on invoices).
- buy boolean
- boolean
- Bought (can go on bills and expenses).
- income_account_id id or null
- id or null
- Where its sales go (an income account).
- expense_account_id id or null
- id or null
- Where buying it goes.
- taxable boolean
- boolean
- Charged sales tax by default.
- tax_rate_id id or null
- id or null
- Its usual saved tax rate, if not the invoice's standard rate.
- purchase_description string or null
- string or null
- What bills say when buying it.
- cost_cents integer or null
- integer or null
- What it usually costs to buy, in cents.
- preferred_vendor_id id or null
- id or null
- Who it's usually bought from.
- active boolean
- boolean
- False once it's made inactive in TallyPip (it's kept, with its history, but left out of pickers).
- created_at timestamp
- timestamp
- When it was added, in UTC.
Example
{
"object": "product",
"id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708103",
"type": "service",
"name": "Cleaning",
"sku": "CLN-1",
"description": "Standard cleaning visit",
"price_cents": 12000,
"sell": true,
"buy": false,
"income_account_id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708131",
"expense_account_id": null,
"taxable": false,
"tax_rate_id": null,
"purchase_description": null,
"cost_cents": null,
"preferred_vendor_id": null,
"active": true,
"created_at": "2026-10-06T14:30:00.000Z"
}List products and services
GET /api/v1/products
Products and services, 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).
Newest first. Answers a list: { object: "list", url, has_more, data }.
Request
curl https://tallypip.com/api/v1/products?limit=3 \ -H "Authorization: Bearer tpk_your_key"
Answer: 200
{
"object": "list",
"url": "/api/v1/products",
"has_more": false,
"data": [
{
"object": "product",
"id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708103",
"type": "service",
"name": "Cleaning",
"sku": "CLN-1",
"description": "Standard cleaning visit",
"price_cents": 12000,
"sell": true,
"buy": false,
"income_account_id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708131",
"expense_account_id": null,
"taxable": false,
"tax_rate_id": null,
"purchase_description": null,
"cost_cents": null,
"preferred_vendor_id": null,
"active": true,
"created_at": "2026-10-06T14:30:00.000Z"
}
]
}Try it
With your own key (Settings › Connected apps). It stays in this page only, and reading can't change anything.
Create a product or service
POST /api/v1/products
Add a service or non-inventory item.
Key: Read and change.
Body (JSON)
- name string
- string
- Required.
- type string
- string
- service (the default) or non_inventory. Inventory items are added in TallyPip.
- price_cents integer
- integer
- Its sale price for 1, in cents.
- sell, buy boolean
- boolean
- sell defaults to true, buy to false.
- income_account_id, expense_account_id id
- id
- Income defaults to Sales; buying needs an expense account.
- taxable, tax_rate_id boolean, id
- boolean, id
- Optional.
- sku, description, purchase_description, cost_cents, preferred_vendor_id …
- …
- Optional.
Answers 201 with the new product or service. 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/products \
-H "Authorization: Bearer tpk_your_key" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: <a new id for each change>" \
-d '{
"name": "Cleaning",
"price_cents": 12000,
"description": "Standard cleaning visit",
"sku": "CLN-1"
}'Answer: 201
{
"object": "product",
"id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708103",
"type": "service",
"name": "Cleaning",
"sku": "CLN-1",
"description": "Standard cleaning visit",
"price_cents": 12000,
"sell": true,
"buy": false,
"income_account_id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708131",
"expense_account_id": null,
"taxable": false,
"tax_rate_id": null,
"purchase_description": null,
"cost_cents": null,
"preferred_vendor_id": null,
"active": true,
"created_at": "2026-10-06T14:30:00.000Z"
}Retrieve a product or service
GET /api/v1/products/{id}
One product or service.
Key: any (Read only works).
Request
curl https://tallypip.com/api/v1/products/3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708103 \ -H "Authorization: Bearer tpk_your_key"
Answer: 200
{
"object": "product",
"id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708103",
"type": "service",
"name": "Cleaning",
"sku": "CLN-1",
"description": "Standard cleaning visit",
"price_cents": 12000,
"sell": true,
"buy": false,
"income_account_id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708131",
"expense_account_id": null,
"taxable": false,
"tax_rate_id": null,
"purchase_description": null,
"cost_cents": null,
"preferred_vendor_id": null,
"active": true,
"created_at": "2026-10-06T14:30:00.000Z"
}Try it
With your own key (Settings › Connected apps). It stays in this page only, and reading can't change anything.