Docs / Webhooks
Event types
Every event Trimline can send, and when each one fires.
Beta. The Trimline API is available to private beta customers. Endpoints may change before general availability in June 2027, and every breaking change is announced in the changelog. Request access.
Each event describes one thing that happened in your account. Its data.object is a snapshot of the affected object at the time of the event. Fetch the object again if you need its latest state.
The event object
{
"id": "evt_4Ks9Lw2",
"object": "event",
"type": "offer.received",
"created_at": "2026-12-03T16:42:10Z",
"livemode": true,
"data": {
"object": { "id": "neg_8Hk2Pq", "object": "negotiation", "...": "..." },
"previous_attributes": { "stage": "waiting_on_vendor" }
}
}
previous_attributes appears on *.updated events and lists the fields that changed, with their old values. Events are also available from GET /v1/events for 30 days, which is useful for catching up after downtime.
Renewals
| Type | Sent when |
|---|---|
renewal.created | A contract enters the 120-day renewal window. |
renewal.deadline_approaching | The notice deadline is 30, 14, 7 or 2 days away and no decision has been made. |
renewal.updated | The status or values change. |
renewal.closed | The renewal reaches renewed, cancelled or skipped. |
Negotiations and offers
| Type | Sent when |
|---|---|
negotiation.started | A negotiation is opened. |
negotiation.reply_received | The vendor replied to the thread. |
negotiation.call_requested | The vendor asked for a call. A brief is attached in data.object.call_brief. |
offer.received | We detected a concrete offer in a vendor reply. |
offer.accepted | You accepted an offer. |
negotiation.closed | The negotiation ended. |
Drafts
| Type | Sent when |
|---|---|
draft.created | A draft is waiting for approval. This is the most useful event for approval bots. |
draft.approved | Someone approved a draft, in any surface. |
draft.sent | The email left the mailbox. sent_at and the message ID are set. |
draft.expiring | A pending draft expires within 12 hours. |
draft.send_failed | The mailbox rejected the send, usually because the connection needs reauthorizing. |
Contracts, vendors and savings
| Type | Sent when |
|---|---|
vendor.created | We found a new recurring vendor. |
contract.created / contract.updated | Contract terms were extracted or corrected. |
contract.needs_review | A key field was extracted with low confidence. |
savings.estimated | New terms were agreed. |
savings.confirmed | The vendor’s first invoice at the new price arrived. |
Connections
| Type | Sent when |
|---|---|
connection.active | Authorization finished and the first sync started. |
connection.needs_reauth | The provider revoked or expired our token. Negotiations that send from this mailbox pause. |
We add new event types over time. Ignore types you don’t recognize rather than failing on them.
Something unclear or missing? Email developers@trimline.tech.