Create a quote

Create an open quote or estimate from line items. The number (QUO-YYYY-NNN or EST-YYYY-NNN) is assigned automatically. Nothing is emailed.

POST https://api.centerfy.ai/webhooks/inbound/quotes

Headers

HeaderRequiredValueDescription
x-api-keyYesyour sub-account API key (cfy_…)Authenticates the request; or use Authorization: Bearer <key>.

Body parameters

NameTypeRequiredDefaultDescription
contact_idstring (uuid)Yes—Contact in this sub-account.
titlestringYes—Quote title.
descriptionstringNo—Longer description.
items{ item, quantity, amount }[]Yes—Line items (1–200). item: non-empty string; quantity: integer ≥ 1; amount: unit price, number ≥ 0.01. The total is the sum of amount × quantity, rounded to cents.
valid_untilstring (YYYY-MM-DD)No—Expiry date. Defaults to 30 days from today.
notesstringNo—Notes shown on the quote.
typestringNo—quote or estimate. Defaults to quote.

Request body

{
  "contact_id": "3f1c2a9e-7b4d-4c8a-9e2f-1a2b3c4d5e6f",
  "title": "Website project",
  "description": "Redesign and three months of hosting",
  "items": [
    {
      "item": "Website redesign",
      "quantity": 1,
      "amount": 1500
    },
    {
      "item": "Monthly hosting",
      "quantity": 3,
      "amount": 25
    }
  ],
  "valid_until": "2026-11-05"
}

Example

curl -X POST "https://api.centerfy.ai/webhooks/inbound/quotes" \
  -H "x-api-key: $CENTERFY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "contact_id": "3f1c2a9e-7b4d-4c8a-9e2f-1a2b3c4d5e6f",
  "title": "Website project",
  "description": "Redesign and three months of hosting",
  "items": [
    {
      "item": "Website redesign",
      "quantity": 1,
      "amount": 1500
    },
    {
      "item": "Monthly hosting",
      "quantity": 3,
      "amount": 25
    }
  ],
  "valid_until": "2026-11-05"
}'
import { CenterfyClient } from "@centerfy/sdk";

const centerfy = new CenterfyClient({ apiKey: process.env.CENTERFY_API_KEY! });

const result = await centerfy.quotes.create({
  "contact_id": "3f1c2a9e-7b4d-4c8a-9e2f-1a2b3c4d5e6f",
  "title": "Website project",
  "description": "Redesign and three months of hosting",
  "items": [
    {
      "item": "Website redesign",
      "quantity": 1,
      "amount": 1500
    },
    {
      "item": "Monthly hosting",
      "quantity": 3,
      "amount": 25
    }
  ],
  "valid_until": "2026-11-05"
});
console.log(result);
centerfy quotes create '{"contact_id":"3f1c2a9e-7b4d-4c8a-9e2f-1a2b3c4d5e6f","title":"Website project","description":"Redesign and three months of hosting","items":[{"item":"Website redesign","quantity":1,"amount":1500},{"item":"Monthly hosting","quantity":3,"amount":25}],"valid_until":"2026-11-05"}'

MCP tool: centerfy_quotes_create (see MCP server)

Response

{
  "status": "success",
  "quote": {
    "id": "f2a3b4c5-d6e7-4f8a-9b0c-1d2e3f4a5b6c",
    "quote_number": "QUO-2026-007",
    "type": "quote",
    "contact_id": "3f1c2a9e-7b4d-4c8a-9e2f-1a2b3c4d5e6f",
    "title": "Website project",
    "description": "Redesign and three months of hosting",
    "status": "open",
    "total_amount": 1575,
    "valid_until": "2026-11-05",
    "items": [
      {
        "item": "Website redesign",
        "quantity": 1,
        "amount": 1500
      },
      {
        "item": "Monthly hosting",
        "quantity": 3,
        "amount": 25
      }
    ],
    "notes": null,
    "payment_link": null,
    "invoice_id": null,
    "invoiced_at": null,
    "sent_at": null,
    "accepted_at": null,
    "rejected_at": null,
    "created_at": "2026-10-06T10:00:00.000Z",
    "updated_at": "2026-10-06T10:00:00.000Z"
  }
}

Errors

  • 400 — if title is empty, contact_id is not a UUID, an item is invalid, or valid_until is not a valid date.
  • 404 — if the contact is not in this sub-account.

Notes

Returns 201.

© 2026 Centerfy AI. All rights reserved.