API reference

Webhook endpoint

An address TallyPip sends news to as it happens (the events below). Apps add their own with their key; a business can add them in Settings › Connected apps.

The webhook endpoint object

object string
Always "webhook_endpoint".
id id
The endpoint's id (a UUID). Use it to fetch it, or to refer to it from other things.
url string
The https address messages are sent to.
description string or null
What it's for.
all_events boolean
True if it gets every kind of event (now and later ones).
events list
The events it gets: customer.created, vendor.created, product.created, invoice.created, invoice.sent, invoice.paid, invoice.voided, payment.received, bill.created, expense.created.
status string
active, paused, turned_off (stopped answering for 48 hours) or stopped (its key was revoked).
created_at timestamp
When it was added, in UTC.
secret string
Only when it's added: the whsec_… secret to check each message's TallyPip-Signature. Keep it.

Example

{
  "object": "webhook_endpoint",
  "id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708109",
  "url": "https://hooks.example.com/tallypip",
  "description": "Orders sync",
  "all_events": false,
  "events": [
    "invoice.paid",
    "payment.received"
  ],
  "status": "active",
  "created_at": "2026-10-06T14:30:00.000Z",
  "secret": "whsec_8kZ2…"
}

List webhook endpoints

GET /api/v1/webhooks

The webhook endpoints this key added.

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/webhooks?limit=3 \
  -H "Authorization: Bearer tpk_your_key"

Answer: 200

{
  "object": "list",
  "url": "/api/v1/webhooks",
  "has_more": false,
  "data": [
    {
      "object": "webhook_endpoint",
      "id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708109",
      "url": "https://hooks.example.com/tallypip",
      "description": "Orders sync",
      "all_events": false,
      "events": [
        "invoice.paid",
        "payment.received"
      ],
      "status": "active",
      "created_at": "2026-10-06T14:30:00.000Z",
      "secret": "whsec_8kZ2…"
    }
  ]
}

Try it

With your own key (Settings › Connected apps). It stays in this page only, and reading can't change anything.

Add a webhook endpoint

POST /api/v1/webhooks

Subscribe: send these events to this https address. The answer has its signing secret, once.

Key: any (Read only works).

Body (JSON)

url string
Required. An https address on the public internet (not a private or internal one).
events list or "all"
Which events, from the list below. Default: all of them.
description string
Optional. Shown to the business in Settings › Connected apps.

Answers 201 with the new webhook endpoint. 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/webhooks \
  -H "Authorization: Bearer tpk_your_key" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: <a new id for each change>" \
  -d '{
    "url": "https://hooks.example.com/tallypip",
    "events": [
      "invoice.paid",
      "payment.received"
    ],
    "description": "Orders sync"
  }'

Answer: 201

{
  "object": "webhook_endpoint",
  "id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708109",
  "url": "https://hooks.example.com/tallypip",
  "description": "Orders sync",
  "all_events": false,
  "events": [
    "invoice.paid",
    "payment.received"
  ],
  "status": "active",
  "created_at": "2026-10-06T14:30:00.000Z",
  "secret": "whsec_8kZ2…"
}

Remove a webhook endpoint

DELETE /api/v1/webhooks/{id}

Unsubscribe (an endpoint this key added).

Key: any (Read only works).

Only an endpoint added with the same key. Answers { deleted: true }.

Request

curl -X DELETE https://tallypip.com/api/v1/webhooks/3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708109 \
  -H "Authorization: Bearer tpk_your_key"

Answer: 200

{
  "object": "webhook_endpoint",
  "id": "3f6c1e2a-8b4d-4c1e-9a7b-2d5e6f708109",
  "deleted": true
}