VendeeDocs
Referência

Negócios

Oportunidades do funil de vendas.

GET    {BASE_URL}/api-v1-deals                 # lista
GET    {BASE_URL}/api-v1-deals/:id             # detalhe
POST   {BASE_URL}/api-v1-deals                 # cria
PATCH  {BASE_URL}/api-v1-deals/:id             # atualiza
POST   {BASE_URL}/api-v1-deals/:id/move-stage  # mover de etapa
POST   {BASE_URL}/api-v1-deals/:id/win         # marcar como ganho
POST   {BASE_URL}/api-v1-deals/:id/lose        # marcar como perdido

Use os endereços acima — são os que respondem hoje. A API está migrando para um endereço único ({BASE_URL}/api-v1/deals), que ainda não foi publicado: enquanto isso, qualquer chamada para ele devolve 404 not_found. Quando entrar no ar, esta página muda junto, e os endereços acima continuam valendo.

Escopos: deals:read para os GET; deals:write para a escrita.

PATCH não aceita status, stage_id, pipeline_id, won_at nem lost_at — mudança de etapa e fecho passam pelas ações.

Campos

CampoTipoEscritaNotas
iduuidsomente leitura
workspace_iduuidsomente leituraSempre o workspace da chave de API usada na chamada.
namestringcriar: obrigatório, editar: simDe 1 a 255 caracteres.
statusstringsomente leituraaberto | em_andamento | ganho | perdido. Só muda por /win, /lose e /move-stage.
valuenumbercriar: opcional, editar: simMínimo 0.
recurring_valuenumbercriar: opcional, editar: simMínimo 0.
pipeline_iduuidcriar: opcional, editar: nãoOmitido na criação, usa o funil padrão do cliente. formato uuid; deve existir na ficha pipelines.
stage_iduuidcriar: opcional, editar: nãoTrocar de etapa depois de criado é POST /deals/:id/move-stage. formato uuid.
owner_iduuidcriar: opcional, editar: simTraduzível pela ficha owners. formato uuid; deve existir na ficha owners.
contact_iduuidcriar: opcional, editar: simFormato uuid; deve existir na ficha contacts.
company_iduuidcriar: opcional, editar: simFormato uuid; deve existir na ficha companies.
expected_close_datedatecriar: opcional, editar: simData de calendário YYYY-MM-DD — nunca convertida para datetime. formato date.
lead_source_iduuidcriar: opcional, editar: simTraduzível pela ficha lead-sources. formato uuid; deve existir na ficha lead-sources.
loss_reason_iduuidsomente leituraPrimeiro motivo da lista. Traduzível pela ficha loss-reasons. Gravado por /lose.
loss_reason_idslista de textossomente leituraTodos os motivos de perda do negócio, na ordem registrada. Gravado por /lose. Campo montado pela API (não é coluna direta).
won_atdatetimesomente leitura
lost_atdatetimesomente leitura
stage_entered_atdatetimesomente leitura
external_idstringsomente leituraGravado só pela entrada de lead (leads), não por POST /deals.
sourcestringsomente leituraGravado só pela entrada de lead (leads), não por POST /deals.
notesstringcriar: opcional, editar: simMáximo 10000 caracteres.
custom_fieldsobjetocriar: opcional, editar: simObjeto chave→valor. As chaves são as definidas na ficha custom-fields. até 50 chaves; até 10 KB; omitido → {}.
created_atdatetimesomente leitura
updated_atdatetimesomente leitura

Listar negócios

GET {BASE_URL}/api-v1-deals

Parâmetro (query)TipoNotas
statusstringaberto/em_andamento devolvem os dois estados ativos. Valores: aberto, em_andamento, ganho, perdido. Compara: um dos valores.
pipeline_iduuid
stage_iduuid
owner_iduuid
sincedatetimeSó registros criados a partir desta data (ISO 8601). Compara: maior ou igual a.
limitnumberTamanho da página. Padrão 50, máximo 200.
cursoruuidPróxima página — use o meta.next_cursor da resposta anterior.

Ordenação: id crescente. Paginação por cursor.

curl "{BASE_URL}/api-v1-deals?status=aberto" \
  -H "X-API-Key: vnd_sua_chave_aqui"
{
  "data": [ /* registros */ ],
  "meta": { "next_cursor": "8f3c...", "has_more": true }
}

Consultar um registro

GET {BASE_URL}/api-v1-deals/:id → o recurso completo, ou 404 not_found.

O detalhe traz blocos embutidos (cada um é um objeto ou null):

BlocoFichaNotas
contactcontactsApontado por contact_id.
companycompaniesApontado por company_id.
last_activityactivitiesAtividade mais recente do negócio (completed_at, scheduled_at, created_at desc).
curl "{BASE_URL}/api-v1-deals/8f3c..." \
  -H "X-API-Key: vnd_sua_chave_aqui"

Criar

POST {BASE_URL}/api-v1-deals — escopo deals:write.

CampoTipoObrigatórioNotas
namestringSimDe 1 a 255 caracteres.
valuenumberNãoMínimo 0.
recurring_valuenumberNãoMínimo 0.
pipeline_iduuidNãoOmitido na criação, usa o funil padrão do cliente. formato uuid; deve existir na ficha pipelines.
stage_iduuidNãoTrocar de etapa depois de criado é POST /deals/:id/move-stage. formato uuid.
owner_iduuidNãoTraduzível pela ficha owners. formato uuid; deve existir na ficha owners.
contact_iduuidNãoFormato uuid; deve existir na ficha contacts.
company_iduuidNãoFormato uuid; deve existir na ficha companies.
expected_close_datedateNãoData de calendário YYYY-MM-DD — nunca convertida para datetime. formato date.
lead_source_iduuidNãoTraduzível pela ficha lead-sources. formato uuid; deve existir na ficha lead-sources.
notesstringNãoMáximo 10000 caracteres.
custom_fieldsobjetoNãoObjeto chave→valor. As chaves são as definidas na ficha custom-fields. até 50 chaves; até 10 KB; omitido → {}.
curl -X POST "{BASE_URL}/api-v1-deals" \
  -H "X-API-Key: vnd_sua_chave_aqui" \
  -H "Content-Type: application/json" \
  -d '{ "name": "..." }'

Atualizar

PATCH {BASE_URL}/api-v1-deals/:id — escopo deals:write. Todos os campos são opcionais; só o que vier no corpo muda.

CampoTipoObrigatórioNotas
namestringNãoDe 1 a 255 caracteres.
valuenumberNãoMínimo 0.
recurring_valuenumberNãoMínimo 0.
owner_iduuidNãoTraduzível pela ficha owners. formato uuid; deve existir na ficha owners.
contact_iduuidNãoFormato uuid; deve existir na ficha contacts.
company_iduuidNãoFormato uuid; deve existir na ficha companies.
expected_close_datedateNãoData de calendário YYYY-MM-DD — nunca convertida para datetime. formato date.
lead_source_iduuidNãoTraduzível pela ficha lead-sources. formato uuid; deve existir na ficha lead-sources.
notesstringNãoMáximo 10000 caracteres.
custom_fieldsobjetoNãoObjeto chave→valor. As chaves são as definidas na ficha custom-fields. até 50 chaves; até 10 KB; omitido → {}.
curl -X PATCH "{BASE_URL}/api-v1-deals/8f3c..." \
  -H "X-API-Key: vnd_sua_chave_aqui" \
  -H "Content-Type: application/json" \
  -d '{ "name": "...", "value": 0, "recurring_value": 0 }'

Ações

Mover de etapa

POST {BASE_URL}/api-v1-deals/:id/move-stage — escopo deals:write.

CampoTipoObrigatórioNotas
stage_iduuidSimFormato uuid.

Publica o webhook deal.stage_changed.

curl -X POST "{BASE_URL}/api-v1-deals/8f3c.../move-stage" \
  -H "X-API-Key: vnd_sua_chave_aqui" \
  -H "Content-Type: application/json" \
  -d '{ "stage_id": "8f3c..." }'

Marcar como ganho

POST {BASE_URL}/api-v1-deals/:id/win — escopo deals:write.

Idempotente: repetir não muda nada nem republica o evento.

CampoTipoObrigatórioNotas
won_atdatetimeNãoFormato datetime.

Publica o webhook deal.won.

curl -X POST "{BASE_URL}/api-v1-deals/8f3c.../win" \
  -H "X-API-Key: vnd_sua_chave_aqui" \
  -H "Content-Type: application/json" \
  -d '{ "won_at": "2026-08-01T14:00:00Z" }'

Marcar como perdido

POST {BASE_URL}/api-v1-deals/:id/lose — escopo deals:write.

Idempotente. loss_reason_ids manda sobre loss_reason_id quando os dois vêm.

CampoTipoObrigatórioNotas
loss_reason_iduuidNãoFormato uuid; deve existir na ficha loss-reasons.
loss_reason_idslista de textosNãoDe 1 a 20 itens; deve existir na ficha loss-reasons.
notesstringNãoMáximo 10000 caracteres.

Publica o webhook deal.lost.

curl -X POST "{BASE_URL}/api-v1-deals/8f3c.../lose" \
  -H "X-API-Key: vnd_sua_chave_aqui" \
  -H "Content-Type: application/json" \
  -d '{ "loss_reason_id": "8f3c..." }'

Webhooks desta ficha

  • deal.created
  • deal.stage_changed
  • deal.won
  • deal.lost
  • deal.stale

Formato do envio, cabeçalhos e verificação da assinatura em Webhooks.

Erros

HTTPcodeQuando
401missing_api_key / invalid_api_key / revoked_api_keyAutenticação.
403insufficient_scopeA chave não tem deals:read / deals:write.
404not_foundO registro não existe neste cliente.
422validation_errorCampo fora das regras da tabela acima.
422invalid_referencepipeline_id, owner_id, contact_id, company_id, lead_source_id aponta para fora deste cliente.
422invalid_cursorO cursor enviado não é válido.
405method_not_allowedMétodo não suportado neste endereço.
500internal_errorFalha interna.

Catálogo completo em Erros.

Idempotência

Envie um header Idempotency-Key (1–255 caracteres, qualquer string única sua) para tornar o POST acima seguro de reenviar em caso de timeout de rede ou retry automático:

curl -X POST "{BASE_URL}/api-v1-deals" \
  -H "X-API-Key: vnd_sua_chave_aqui" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: pedido-9f21" \
  -d '{ "name": "Projeto Q3 - Empresa Exemplo", "value": 24000 }'
  • Mesma chave, mesmo corpo: a segunda chamada não cria outro negócio — responde 200 OK com o corpo da resposta original (não 201), e o webhook deal.created não é reemitido.
  • Mesma chave, corpo diferente (ou reusada em outro recurso): 422 idempotency_conflict — a chave é sua, reusá-la para outra coisa é erro do cliente.
  • Mesma chave, requisição original ainda processando: 409 idempotency_in_progress — duas chamadas concorrentes com a mesma chave; espere e tente de novo.
  • Janela: a chave fica registrada por 24 horas; depois disso pode ser reusada como se fosse nova.
  • Sem o header: comportamento idêntico ao de hoje — cada POST cria um negócio novo.

Erros específicos desta ficha

HTTPcodeQuando
400bad_requestCorpo ausente/JSON inválido (escrita).
422no_default_pipeline / pipeline_has_no_stage / no_owner_availableFalha ao resolver pipeline/etapa/responsável na criação.
400invalid_idempotency_keyIdempotency-Key fora de 1–255 caracteres.
422idempotency_conflictMesma Idempotency-Key com corpo ou recurso diferente.
409idempotency_in_progressMesma Idempotency-Key já em processamento (corrida).

Nesta página