Create a Deal
owner_id is always the calling user (token.sub) — there’s no way to set a different owner at creation via this endpoint.
Omit stage_id and the deal is created with no stage (stage_id: null) — there’s no fallback to the org’s first stage. An unstaged deal still shows up in List Deals, but not in any column of the board, which is assembled per stage. Pass stage_id, or set it later with Update a Deal.
Five body fields are accepted but not persisted by this endpoint — the handler forwards only name, account_id, value, stage_id, close_date, currency, geo_scope and the owner, so the rest are silently dropped:
Auth
Requires a CRM manage scope and an active organization on the token. Any*:manage scope qualifies — in practice contacts:manage, deals:manage, companies:manage, or activities:manage.
Side effects
- Emits a
deal_creatednotification event (best-effort, via the org’s Temporal actor workflow). - Records a
deal_createdproduct-analytics event.
Response
201 with {"id": "<new deal id>"} — not the full deal row. Call Get a Deal to fetch it.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Deal name.
1Account (company) to link the deal to.
Deal value in currency.
Initial pipeline stage. Omit it and the deal is created with no stage (stage_id: null) — there is no fallback to the org's first stage — so it won't appear in any board column until a stage is set.
Expected close date, YYYY-MM-DD.
ISO 4217 currency code for value.
Free-text origin of the deal (e.g. inbound, referral). Accepted but not persisted by this endpoint — the create handler never passes it through; set it with PATCH /deals/{deal_id} after creating the deal.
Contact id of the internal champion. Accepted but not persisted by this endpoint — the create handler never passes it through; set it with PATCH /deals/{deal_id} after creating the deal.
Free-text notes. Accepted but not persisted by this endpoint — the create handler never passes it through; set it with PATCH /deals/{deal_id} after creating the deal.
Parent deal id, for renewal/expansion deals linked to a prior one. Accepted but not persisted by this endpoint — the create handler never passes it through, and PATCH /deals/{deal_id} does not accept it either, so there is currently no way to set it through the API.
Accepted but not persisted by this endpoint — the create handler never passes it through; use POST /deals/{deal_id}/competitors/detect instead.
Deal's geographic scope.
local, regional, international Response
Successful Response