Trimline is in private beta. Public launch: June 2027.Join the waitlist →
Docs / Resources

Vendors

The companies you pay on a recurring basis, detected and deduplicated automatically.

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.

A vendor is a company you pay on a recurring basis. Trimline creates vendors automatically from invoices, receipts and card transactions, and merges duplicates. For example, “Acme Inc.” on an invoice and “ACME*SUBSCR” on a card statement become one vendor.

Endpoints

The vendor object

{
  "id": "ven_9xKd02",
  "object": "vendor",
  "name": "Acme CRM",
  "domain": "acmecrm.com",
  "category": "crm",
  "status": "active",
  "annual_spend": { "amount": 3840000, "currency": "usd" },
  "seats": { "paid": 40, "active": 31, "measured_at": "2026-11-02T06:00:00Z" },
  "keep": false,
  "owner_email": "sam@northwind.example",
  "contracts": ["ctr_4Lw7Yh"],
  "first_seen_at": "2024-02-14T00:00:00Z",
  "created_at": "2026-10-02T14:20:51Z",
  "livemode": false
}
namestringThe vendor’s normalized display name.
categoryenumOne of crm, communication, design, engineering, analytics, security, finance, hr, marketing, support, infrastructure or other.
statusenumactive while you’re paying them, cancelled once the last contract has ended.
annual_spendmoneyYour annualized spend across all active contracts with this vendor.
seatsobject, nullableSeats paid for and seats active in the last 60 days, when we can measure them through a connected SSO or admin export. null for vendors that aren’t priced per seat.
keepbooleanIf true, negotiations never threaten to cancel or mention competitors.
owner_emailstring, nullableThe person inside your company who owns the relationship. They’re copied on drafts if you enable it.

List vendors

GET/v1/vendors
statusenumFilter by active or cancelled.
categoryenumFilter by category.
annual_spend[gte]integerMinimum annual spend, in minor units.
qstringSearch by name or domain.
curl -G https://api.trimline.tech/v1/vendors \
  -H "Authorization: Bearer $TRIMLINE_API_KEY" \
  -d "status=active" \
  -d "annual_spend[gte]=500000"

Retrieve a vendor

GET/v1/vendors/:id

Add expand[]=contracts to get full contract objects instead of IDs.

curl -G https://api.trimline.tech/v1/vendors/ven_9xKd02 \
  -H "Authorization: Bearer $TRIMLINE_API_KEY" \
  -d "expand[]=contracts"

Update a vendor

PATCH/v1/vendors/:id

You can change your preferences for a vendor. Fields we derive from your data, such as annual_spend, are read-only.

keepbooleanMark the vendor as must-keep.
owner_emailstringSet or clear the internal owner.
categoryenumCorrect a category we got wrong.
ignorebooleanHide the vendor from the ledger and never negotiate with them, for example a one-off purchase that looked recurring.
curl -X PATCH https://api.trimline.tech/v1/vendors/ven_9xKd02 \
  -H "Authorization: Bearer $TRIMLINE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "keep": true, "owner_email": "priya@northwind.example" }'

Something unclear or missing? Email developers@trimline.tech.