API & integrations
BetaMake proposals where you already work
Ask ChatGPT or Claude for a proposal in the middle of a conversation, or let your CRM start one through Zapier, Make or n8n. Proposals writes the draft with the same engine, brand and checks as the app, and hands back the link. The email stays yours to write.
Integrations are in beta and switched on per team. If you don't see Settings → Integrations in your account, write to support@proposals.co and we'll turn it on.
Start a proposal from three places
ChatGPT
Connect Proposals once as a connector. Paste your call notes into a chat and ask for a proposal.
Claude
Add Proposals as a custom connector and make the proposal in the same conversation where you prepared for the call.
Your CRM, through Zapier, Make or n8n
When a deal reaches the proposal stage, send its notes to the API and let the deal owner know when the draft is ready.
What it looks like in ChatGPT
A shortened, typical exchange. The question comes from Proposals; the email is written by ChatGPT and sent by you.
- You
Make a proposal for Lila Flowers from these call notes. Six pages, $9,000, half upfront and half on delivery. The contact is Anna Novak.
- ChatGPT
I've started the draft. One question from Proposals first: your notes also mention $12,000. Which amount is current?
- You
$9,000. The $12,000 was the version with product photography.
- ChatGPT
The draft is ready: a six-page store with a delivery-date picker and launch support, $9,000 net, 50% upfront. Nothing blocks publishing. Here's the preview in your Proposals account. Should I publish it?
- You
Publish it and write Anna a short email with the link.
- ChatGPT
Published. Here's a draft email to Anna with the link. Send it from your inbox, then tell me, and I'll mark the proposal as sent.
Proposals never sends the email. You send it from your own mailbox, and you see the proposal in your account like any other.
What stays in your control
Drafts are private
Creating a proposal never publishes it. Every draft is in your account, where you can review and edit it before anyone sees it.
Publishing is a separate permission
An integration can publish only if you gave it the publish permission, nothing blocks publishing, and the call confirms it explicitly. There is no way to force it.
You see where every proposal came from
Proposals made through an integration are marked, for example “Created in ChatGPT”, with a history of what the integration did. Publishing through an integration notifies the proposal owner.
No invented prices
The price you give is the price on the proposal. When the notes contradict each other, you get a question instead of a guess.
Permissions, in plain words
You pick them when you create an API key or approve a connector. A key or connection never has more rights than the person who set it up.
- Read brands
brands:read - See your brands, so the proposal goes out from the right one.
- Read proposals
proposals:read - See the status, questions, key facts and link, and whether the client opened or accepted.
- Create and change
proposals:write - Create proposals, answer their questions, ask for revisions and mark them as sent.
- Publish
proposals:publish - Make a proposal's link live or take it down. Off unless you turn it on.
Limits, in plain words
- One proposal per request. There is no bulk import and no mass sending.
- Up to 10 new proposals a minute per key or connected app, and at most 3 being written at once per team.
- Up to 60 reads a minute and 20 revisions every 10 minutes.
- A proposal made through an integration counts against your plan exactly like one made in the app. There's no separate fee.
For developers
A REST API with API keys for automations and your own code, and an MCP server with OAuth for assistants. Every POST takes an Idempotency-Key, so a retried request never creates a second proposal.
- REST API
- https://api.proposals.co/api/public/v1
- MCP server
- https://api.proposals.co/mcp
- OpenAPI
- https://api.proposals.co/api/public/v1/openapi.json
Create a proposal
curl -X POST https://api.proposals.co/api/public/v1/proposals \
-H "Authorization: Bearer $PROPOSALS_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: crm-deal-731-create" \
-d '{
"client": {
"name": "Lila Flowers",
"contact": { "name": "Anna Novak", "email": "anna@lila-flowers.example" }
},
"context": "Call notes: six-page store, delivery-date picker, launch in November...",
"pricing": { "amount": 9000, "currency": "USD", "tax_basis": "net", "billing": "one_off" },
"external_reference": "crm-deal-731"
}'Response
202 Accepted
{ "id": 123, "status": "generating", "next_poll_after_ms": 4000, ... }Full API reference →Setup guides
Step by step, from connecting to your first published proposal.
- OverviewAuthentication, permissions, statuses, errors, idempotency and limits.
- ChatGPTConnect Proposals and make your first proposal in a chat.
- ClaudeAdd Proposals as a custom connector and use it in a conversation.
- Zapier, Make and n8nCreate a proposal from a CRM deal and notify the owner when it's ready.
- API referenceEvery endpoint with request and response examples.