---
title: "POST /crm/deals"
method: POST
path: "/crm/deals"
tags: ["CRM Deals"]
---

# POST /crm/deals

`POST /crm/deals`

## Request

- Base URL: `https://developer.meetergo.com` (the document declares no server; this is the origin it was published from)
- URL: `https://developer.meetergo.com/crm/deals`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer
  - API key in header `x-meetergo-api-user-id`

## Request body

- CreateDealDto
  - `name` string, required
  - `value` number
  - `currency` string
  - `expectedCloseDate` string
  - `notes` string
  - `crmCompanyId` string
  - `contactId` string
  - `pipelineId` string, required
  - `stageId` string, required
  - `ownerId` string, nullable: Account owner. Omit to default to the creating user; pass `null` to create the deal with no account owner at all.
  - `contacts` CreateDealContactDto[]
    - `contactId` string, required
    - `role` 'primary' | 'decision_maker' | 'influencer' | 'user' | 'other'
    - `isPrimary` boolean
  - `customFields` object

## Response `201`

- DealDto
  - `id` string, required
  - `name` string, required
  - `value` number
  - `currency` string
  - `expectedCloseDate` string, date-time
  - `notes` string
  - `crmCompanyId` string
  - `contactId` string
  - `pipelineId` string, required
  - `stageId` string, required
  - `ownerId` string, nullable
  - `companyId` string, required
  - `lostReason` string: Configurable per company, so a key rather than a fixed enum value.
  - `lostReasonNote` string
  - `wonReason` string: The won-side mirror, configurable in the same way.
  - `wonReasonNote` string
  - `wonAt` string, date-time
  - `lostAt` string, date-time
  - `archivedAt` string, date-time, nullable
  - `enteredStageAt` string, date-time, required
  - `customFields` object
  - `createdAt` string, date-time, required
  - `updatedAt` string, date-time, required
  - `winProbability` number, required: The probability the deal is forecast with: its own override, else the stage's.
  - `winProbabilityOverride` number, nullable, required: The per-deal value when one is set; null means the stage's applies.
  - `crmCompany` object
    - `id` string, required
    - `name` string, required
    - `domain` string
    - `iconUrl` string
  - `contact` object
    - `id` string, required
    - `firstName` string, required
    - `lastName` string, required
    - `email` string
    - `phoneNumber` string
    - `photoUrl` string, nullable
    - `additionalData` object
  - `stage` object
    - `id` string, required
    - `name` string, required
    - `color` string, required
    - `isWon` boolean, required
    - `isLost` boolean, required
    - `winProbability` number, required
    - `rottingDays` number
  - `contacts` DealContactDto[]
    - `id` string, required
    - `dealId` string, required
    - `contactId` string, required
    - `role` 'primary' | 'decision_maker' | 'influencer' | 'user' | 'other', required
    - `isPrimary` boolean, required
    - `createdAt` string, date-time, required
    - `contact` object
      - `id` string, required
      - `firstName` string, required
      - `lastName` string, required
      - `email` string
      - `phoneNumber` string
      - `photoUrl` string, nullable
      - `additionalData` object
  - `owner` object
    - `id` string, required
    - `givenName` string
    - `familyName` string
    - `email` string, required
  - `isRotting` boolean
  - `signal` DealSignalDto
    - `healthScore` number, required
    - `healthBand` object, required
    - `daysInStage` number, required
    - `daysSinceLastActivity` number, required
    - `daysSinceLastInbound` number, nullable
    - `daysSinceLastOutbound` number, nullable
    - `followUpsSinceLastReply` number, required
    - `hasReplyEver` boolean, required
    - `inboundCount` number, required
    - `outboundCount` number, required
    - `meetingsBooked` number, required
    - `meetingsHeld` number, required
    - `openTaskCount` number, required
    - `overdueTaskCount` number, required
    - `computedAt` string, date-time, required

## Other responses

- `400`: The request did not validate. `message` lists the constraints that failed.
- `401`: Missing, malformed, or expired credentials.
- `403`: Authenticated, but not allowed: the plan does not include this feature, or the token is scoped away from it.
- `429`: Rate limited. Back off and retry.

---

[API](https://skmtc.dev/meetergo/apis/meetergo-platform-api.md) · [All operations](https://skmtc.dev/meetergo/apis/meetergo-platform-api/llms.txt) · [OpenAPI document](https://skmtc.dev/meetergo/apis/meetergo-platform-api/revisions/b5d66cd8be67?raw)
