Pular para o conteúdo

Propostas

Base path: /api/v1/proposals Scopes: proposals:read | proposals:write

Propostas são documentos comerciais vinculados a um deal: estrutura de items, totais, status (draft, sent, accepted, declined, expired).

Lista propostas

GET /api/v1/proposals

Scope: proposals:read

ParamTipoDescrição
statusstringFiltra por status (draft, sent, accepted, etc.)
searchstringBusca em número/assunto
contactIdstringPropostas de um contato
clientIdstringPropostas de uma empresa
dealIdstringProposta de um deal específico
page / limitnumberPaginação

Busca uma proposta

GET /api/v1/proposals/:id

Scope: proposals:read

Retorna proposta com items[] aninhados, totais calculados, e contato/empresa/deal expandidos.

{
"id": "ckl4pp01...",
"number": "PR-2026-0042",
"subject": "Implantação CRM Enterprise",
"status": "sent",
"sentAt": "2026-05-20T10:00:00.000Z",
"dealId": "ckl4d01...",
"contactId": "ckl4z01...",
"clientId": "ckl4c01...",
"recipientName": "Maria Silva",
"recipientEmail": "maria@empresa.com.br",
"subtotal": 24000,
"discount": 0,
"adjustment": 0,
"total": 24000,
"items": [
{
"id": "ckl4i01...",
"order": 0,
"name": "Setup inicial + treinamento",
"qty": 1,
"unit": "Projeto",
"rate": 8000,
"total": 8000
},
{
"id": "ckl4i02...",
"order": 1,
"name": "Mensalidade plano Enterprise",
"qty": 12,
"unit": "Mês",
"rate": 1333.33,
"total": 16000
}
],
"createdAt": "2026-05-18T14:00:00.000Z"
}

Cria uma proposta

POST /api/v1/proposals

Scope: proposals:write

CampoTipoObrigatórioDescrição
subjectstringAssunto da proposta
dealIdstringVincula a um deal (1:1)
contactIdstringDestinatário (contato)
clientIdstringEmpresa cliente
recipientNamestringOverride do nome no PDF
recipientEmailstringOverride do email
itemsarrayItems da proposta (ver shape abaixo)
discountnumberDesconto absoluto sobre o subtotal
adjustmentnumberAjuste extra (pode ser negativo)
notesstringNotas/observações
ownerIdstringUser dono (default: caller)
statusdraft | sent | accepted | declined | expiredDefault draft

Shape de item:

CampoTipoDefault
namestringobrigatório
descriptionstring
qtynumber1
unitstringUnidade
ratenumber0
discountPctnumber0
taxPctnumber0
Terminal window
curl -X POST https://app.indutivacrm.com.br/api/v1/proposals \
-H "X-API-Key: crm_live_..." \
-H "Content-Type: application/json" \
-d '{
"subject": "Implantação CRM Enterprise — Acme",
"dealId": "ckl4d01...",
"items": [
{ "name": "Setup", "qty": 1, "rate": 8000 },
{ "name": "Mensalidade", "qty": 12, "rate": 1333.33 }
]
}'

O número (PR-YYYY-NNNN) é gerado automaticamente.

Atualiza uma proposta

PATCH /api/v1/proposals/:id

Scope: proposals:write

Atualização parcial. Útil pra mudar status:

Terminal window
# Cliente aceitou
curl -X PATCH https://app.indutivacrm.com.br/api/v1/proposals/ckl4pp01... \
-H "X-API-Key: crm_live_..." \
-H "Content-Type: application/json" \
-d '{"status": "accepted"}'

Mudanças de status disparam eventos internos (proposal.sent, proposal.accepted, etc.) que podem alimentar webhooks de saída ou automações no CRM.

Deleta uma proposta

DELETE /api/v1/proposals/:id

Scope: proposals:write

Soft-delete. O deal vinculado fica intacto.

Erros específicos

StatuserrorCenário
400invalid_statusstatus fora do enum permitido
400duplicate_proposal_for_dealJá existe proposta vinculada a esse dealId
400validation_failedsubject ausente ou items malformados
404not_foundid não existe