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
Always "product".
id id
The product's id (a UUID). Use it to fetch it, or to refer to it from other things.
type string
service, non_inventory or inventory (inventory items are added in TallyPip).
name string
Its name.
sku string or null
Stock-keeping unit.
description string or null
What invoice lines say by default.
price_cents integer
Sales price for 1, in cents.
sell boolean
Sold (can go on invoices).
buy boolean
Bought (can go on bills and expenses).
income_account_id id or null
Where its sales go (an income account).
expense_account_id id or null
Where buying it goes.
taxable boolean
Charged sales tax by default.
tax_rate_id id or null
Its usual saved tax rate, if not the invoice's standard rate.
purchase_description string or null
What bills say when buying it.
cost_cents integer or null
What it usually costs to buy, in cents.
preferred_vendor_id id or null
Who it's usually bought from.
active boolean
False once it's made inactive in TallyPip (it's kept, with its history, but left out of pickers).
created_at 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
How many, 1 to 100 (default 25).
starting_after 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
Required.
type string
service (the default) or non_inventory. Inventory items are added in TallyPip.
price_cents integer
Its sale price for 1, in cents.
sell, buy boolean
sell defaults to true, buy to false.
income_account_id, expense_account_id id
Income defaults to Sales; buying needs an expense account.
taxable, tax_rate_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.