Create an opportunity
Create an opportunity. Fires your “opportunity created” workflows, exactly like creating one in the app.
POST
https://api.centerfy.ai/webhooks/inbound/opportunities Headers
| Header | Required | Value | Description |
|---|---|---|---|
x-api-key | Yes | your sub-account API key (cfy_…) | Authenticates the request; or use Authorization: Bearer <key>. |
Body parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
name | string | Yes | — | Opportunity name. |
pipeline_id | string (uuid) | Yes | — | Pipeline the opportunity belongs to. |
stage_id | string (uuid) | No | — | Stage within that pipeline. Defaults to the pipeline’s first stage. |
contact_id | string (uuid) | null | No | — | Linked contact; must be in this sub-account. |
company_id | string (uuid) | null | No | — | Linked company; must be in this sub-account. |
monetary_value | number | No | — | Deal value; minimum 0. Defaults to 0. |
source | string | null | No | — | Free-text lead source label. |
status | string | No | — | One of open, won, lost, abandoned. Defaults to open. |
assigned_to | string (uuid) | null | No | — | User id of a member of this sub-account. |
Request body
{
"name": "Acme — annual plan",
"pipeline_id": "7d2e9f10-4b3c-4a1d-9e8f-2a3b4c5d6e7f",
"contact_id": "3f1c2a9e-7b4d-4c8a-9e2f-1a2b3c4d5e6f",
"monetary_value": 1200,
"source": "website"
}Example
curl -X POST "https://api.centerfy.ai/webhooks/inbound/opportunities" \
-H "x-api-key: $CENTERFY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme — annual plan",
"pipeline_id": "7d2e9f10-4b3c-4a1d-9e8f-2a3b4c5d6e7f",
"contact_id": "3f1c2a9e-7b4d-4c8a-9e2f-1a2b3c4d5e6f",
"monetary_value": 1200,
"source": "website"
}' import { CenterfyClient } from "@centerfy/sdk";
const centerfy = new CenterfyClient({ apiKey: process.env.CENTERFY_API_KEY! });
const result = await centerfy.opportunities.create({
"name": "Acme — annual plan",
"pipeline_id": "7d2e9f10-4b3c-4a1d-9e8f-2a3b4c5d6e7f",
"contact_id": "3f1c2a9e-7b4d-4c8a-9e2f-1a2b3c4d5e6f",
"monetary_value": 1200,
"source": "website"
});
console.log(result); centerfy opportunities create '{"name":"Acme — annual plan","pipeline_id":"7d2e9f10-4b3c-4a1d-9e8f-2a3b4c5d6e7f","contact_id":"3f1c2a9e-7b4d-4c8a-9e2f-1a2b3c4d5e6f","monetary_value":1200,"source":"website"}' MCP tool: centerfy_opportunities_create (see MCP server)
Response
{
"status": "success",
"opportunity": {
"id": "9e4c5f61-7d8a-4b92-8c3d-4e5f6a7b8c93",
"name": "Acme — annual plan",
"contact_id": "3f1c2a9e-7b4d-4c8a-9e2f-1a2b3c4d5e6f",
"company_id": null,
"pipeline_id": "7d2e9f10-4b3c-4a1d-9e8f-2a3b4c5d6e7f",
"stage_id": "0b6f2c1e-3a4d-4e5f-8a9b-1c2d3e4f5a60",
"monetary_value": 1200,
"source": "website",
"status": "open",
"assigned_to": null,
"created_at": "2026-10-03T12:00:00.000Z",
"updated_at": "2026-10-03T12:00:00.000Z"
}
}Errors
400— if stage_id isn’t in the pipeline, the pipeline has no stages, or contact/company/assignee aren’t in this sub-account.404— if the pipeline is not in this sub-account.
Notes
Returns 201.