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

Negotiations

The conversation with a vendor about a renewal: strategy, messages and offers.

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 negotiation is the conversation with a vendor about one renewal. It holds the strategy you’ve set, every message exchanged, and every offer the vendor has made. Negotiations move forward through drafts: we prepare the next message, and you approve it.

Endpoints

The negotiation object

{
  "id": "neg_8Hk2Pq",
  "object": "negotiation",
  "renewal": "ren_1Pq8sT2v",
  "status": "open",
  "stage": "countering",
  "counterparty": { "name": "Priya N.", "email": "priya@acmecrm.example", "role": "Account Executive" },
  "strategy": {
    "target_annual_value": { "amount": 3000000, "currency": "usd" },
    "walkaway_annual_value": { "amount": 3500000, "currency": "usd" },
    "levers": ["seats", "uplift", "term"],
    "max_term_months": 24,
    "tone": "neutral",
    "mention_alternatives": true
  },
  "offers": [
    {
      "id": "off_6Tg2Ws",
      "received_at": "2026-12-03T16:42:10Z",
      "annual_value": { "amount": 3379200, "currency": "usd" },
      "term_months": 24,
      "quantity": 32,
      "uplift": null,
      "summary": "32 seats, 24 months, 12% off the current per-seat rate, flat for both years"
    }
  ],
  "next_follow_up_at": "2026-12-06T14:00:00Z",
  "pending_draft": "drf_3Nc81Ab",
  "livemode": false
}
statusenumopen, paused or closed.
stageenumWhere the conversation is: opening, waiting_on_vendor, countering, finalizing or done.
walkaway_annual_valuemoney, nullableAbove this price we’ll recommend cancelling rather than accepting. It’s never shared with the vendor.
mention_alternativesbooleanWhether messages may refer to competing quotes. Always false for vendors marked keep.
next_follow_up_attimestamp, nullableWhen we’ll draft a follow-up if the vendor hasn’t replied.

Retrieve a negotiation

GET/v1/negotiations/:id

List messages

GET/v1/negotiations/:id/messages

Returns the email thread in order, oldest first. Each message has a direction (outbound or inbound), from, to, sent_at and, for outbound messages, the draft it was sent from. Trimline doesn’t store message bodies. body is fetched live from your connected mailbox when you call this endpoint, and is null if that mailbox has been disconnected.

Update strategy

PATCH/v1/negotiations/:id

Change the target, walk-away price, levers or tone at any point. The change applies to the next draft we prepare, and messages already sent aren’t affected.

curl -X PATCH https://api.trimline.tech/v1/negotiations/neg_8Hk2Pq \
  -H "Authorization: Bearer $TRIMLINE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "strategy": { "tone": "firm", "walkaway_annual_value": { "amount": 3300000, "currency": "usd" } } }'

Accept an offer

POST/v1/negotiations/:id/offers/:offer_id/accept

Accepts the vendor’s offer. We draft a confirmation email for your approval and, once the vendor sends the order form, check it against the agreed terms. The renewal moves to accepted. Requires an idempotency key.

Accepting an offer through the API doesn’t sign anything. You still sign the vendor’s order form yourself, and we’ll flag any differences from the agreed terms before you do.

Pause, resume or close

  • POST/v1/negotiations/:id/pause
  • POST/v1/negotiations/:id/resume
  • POST/v1/negotiations/:id/close

Pausing stops follow-ups and new drafts, but keeps listening for vendor replies. Closing ends the negotiation, and the renewal falls back to upcoming unless an offer has been accepted.

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