Leads
Endpoints to create, fetch, update and move leads (deals) through the pipeline, plus tags, sequences and per-lead WhatsApp sending.
https://app.syncro.chat/api/v1AuthX-API-Key: crm_SUA_CHAVE_AQUIThe Lead object
Most endpoints return the lead in this base format (additional fields are added via ?include):
{
"id": 123,
"name": "João Silva",
"phone": "+5511999887766",
"email": "[email protected]",
"company": "ACME",
"birthday": "1990-01-15",
"value": 5000.0,
"source": "site",
"tags": ["vip", "enterprise"],
"pipeline_id": 1,
"stage_id": 5,
"notes": "Anotações do lead",
"utm_source": "google",
"utm_medium": "cpc",
"utm_campaign": "verao_2026",
"utm_term": null,
"utm_content": null,
"stage": { "id": 5, "name": "Proposta" },
"pipeline": { "id": 1, "name": "Vendas" },
"created_at": "2026-06-30T10:00:00Z",
"custom_fields": { "tamanho_empresa": "100+" }
}
List leads
/leadsleads:readLists the account leads, paginated, with filters.
Query parameters
pipeline_idintegeroptionalstage_idintegeroptionalassigned_tointegeroptionalsourcestringoptionalstatusstringoptionaltagsarrayoptionalqstringoptionalupdated_sincedate (ISO 8601)optionalcreated_fromdateoptionalcreated_todateoptionalpageintegeroptional1)per_pageintegeroptional50, max 200)includestringoptionalcurl "https://app.syncro.chat/api/v1/leads?pipeline_id=1&per_page=2&include=owner" \ -H "X-API-Key: crm_SUA_CHAVE_AQUI"
{
"success": true,
"data": [
{
"id": 123,
"name": "João Silva",
"phone": "+5511999887766",
"email": "[email protected]",
"company": "ACME",
"value": 5000,
"source": "site",
"tags": [
"vip"
],
"pipeline_id": 1,
"stage_id": 5,
"stage": {
"id": 5,
"name": "Proposta"
},
"pipeline": {
"id": 1,
"name": "Vendas"
},
"created_at": "2026-06-30T10:00:00Z",
"custom_fields": {},
"assigned_to": 12,
"owner": {
"id": 12,
"name": "Ana",
"email": "[email protected]"
}
}
],
"meta": {
"total": 250,
"per_page": 2,
"current_page": 1,
"last_page": 125,
"has_more": true
}
}Create lead
/leadsleads:writeCreates a new lead.
Body parameters
namestringrequiredpipeline_idintegerrequiredstage_idintegerrequiredphonestringoptionalemailstringoptionalvaluenumberoptionalsourcestringoptionaltagsarray(string)optionalnotesstringoptionalutm_source / utm_medium / utm_campaign / utm_term / utm_contentstringoptionalassigned_tointegeroptionalcustom_fieldsobjectoptionalfield_name: value (see [Custom fields](/en/custom-fields))If stage_id is a stage marked as won/lost, Syncro automatically creates the corresponding Sale (Sale) or Loss (LostSale).
Errors: 422 with limit_reached: true if the plan lead limit has been reached.
curl -X POST "https://app.syncro.chat/api/v1/leads" \
-H "X-API-Key: crm_SUA_CHAVE_AQUI" \
-H "Content-Type: application/json" \
-d '{
"name": "João Silva",
"phone": "+5511999887766",
"email": "[email protected]",
"value": 5000,
"source": "site",
"tags": [
"vip"
],
"pipeline_id": 1,
"stage_id": 5,
"assigned_to": 12,
"custom_fields": {
"tamanho_empresa": "100+"
}
}'{
"success": true,
"lead": {
"id": 123,
"name": "João Silva",
"pipeline_id": 1,
"stage_id": 5,
"stage": {
"id": 5,
"name": "Proposta"
},
"pipeline": {
"id": 1,
"name": "Vendas"
},
"created_at": "2026-06-30T10:00:00Z",
"custom_fields": {
"tamanho_empresa": "100+"
}
}
}Create or update lead (upsert)
/leads/upsertleads:writeCreates a new lead or updates an existing one, matching by email and/or phone. Ideal for synchronization. Accepts the same fields as POST /leads, plus the field below.
Body parameters
match_bystringoptionalemail, phone or email_or_phone (default email_or_phone)You must send email or phone (it is the match key). On update, only the sent (non-empty) fields are changed.
curl -X POST "https://app.syncro.chat/api/v1/leads/upsert" \
-H "X-API-Key: crm_SUA_CHAVE_AQUI" \
-H "Content-Type: application/json" \
-d '{
"name": "João Silva",
"email": "[email protected]",
"pipeline_id": 1,
"stage_id": 5,
"match_by": "email"
}'{
"success": true,
"created": true,
"lead": {
"id": 123,
"name": "João Silva",
"stage_id": 5
}
}Fetch lead by ID
/leads/123leads:readReturns a lead. Accepts ?include= to load relations.
curl "https://app.syncro.chat/api/v1/leads/123?include=owner%2Ctasks%2Cnotes" \ -H "X-API-Key: crm_SUA_CHAVE_AQUI"
{
"success": true,
"lead": {
"id": 123,
"name": "João Silva",
"stage_id": 5
}
}Move lead to another stage
/leads/123/stageleads:writeMoves the lead to another stage (and pipeline).
Body parameters
stage_idintegerrequiredpipeline_idintegerrequiredErrors: 422 with blocked: true and pending_tasks if the current stage has mandatory pending tasks.
curl -X PUT "https://app.syncro.chat/api/v1/leads/123/stage" \
-H "X-API-Key: crm_SUA_CHAVE_AQUI" \
-H "Content-Type: application/json" \
-d '{
"stage_id": 7,
"pipeline_id": 1
}'{
"success": true,
"lead_id": 123
}Mark as won
/leads/123/wonleads:writeMoves the lead to a won stage and records the sale.
Body parameters
stage_idintegerrequiredis_won = true)valuenumberoptionalErrors: 422 if the stage is not a won stage ("A etapa informada não é uma etapa de ganho.") or 422 blocked due to mandatory pending tasks.
curl -X PUT "https://app.syncro.chat/api/v1/leads/123/won" \
-H "X-API-Key: crm_SUA_CHAVE_AQUI" \
-H "Content-Type: application/json" \
-d '{
"stage_id": 10,
"value": 7500
}'{
"success": true,
"lead_id": 123
}Mark as lost
/leads/123/lostleads:writeMoves the lead to a lost stage and records the reason.
Body parameters
stage_idintegerrequiredis_lost = true)reason_idintegeroptionallost_reasons in [Pipelines](/en/pipelines))Errors: 422 if the stage is not a lost stage; 422 blocked due to pending tasks.
curl -X PUT "https://app.syncro.chat/api/v1/leads/123/lost" \
-H "X-API-Key: crm_SUA_CHAVE_AQUI" \
-H "Content-Type: application/json" \
-d '{
"stage_id": 11,
"reason_id": 3
}'{
"success": true,
"lead_id": 123
}Delete lead
/leads/123leads:writeRemoves the lead.
curl -X DELETE "https://app.syncro.chat/api/v1/leads/123" \ -H "X-API-Key: crm_SUA_CHAVE_AQUI"
{
"success": true
}Remove a tag
/leads/123/tags/vipleads:writeRemoves a tag by name.
curl -X DELETE "https://app.syncro.chat/api/v1/leads/123/tags/vip" \ -H "X-API-Key: crm_SUA_CHAVE_AQUI"
{
"success": true,
"lead_id": 123,
"tags": [
"enterprise"
]
}Enroll in nurture sequence
/leads/123/enroll-sequencesequences:writeEnrolls the lead in an active sequence. See the list of sequences in Sequences.
Body parameters
sequence_idintegerrequiredcurl -X POST "https://app.syncro.chat/api/v1/leads/123/enroll-sequence" \
-H "X-API-Key: crm_SUA_CHAVE_AQUI" \
-H "Content-Type: application/json" \
-d '{
"sequence_id": 1
}'{
"success": true,
"lead_id": 123,
"sequence_id": 1,
"lead_sequence_id": 45,
"status": "active",
"next_step_at": "2026-07-01T10:00:00Z"
}Remove from sequence
/leads/123/enroll-sequence/1sequences:writeRemoves the lead from a sequence.
curl -X DELETE "https://app.syncro.chat/api/v1/leads/123/enroll-sequence/1" \ -H "X-API-Key: crm_SUA_CHAVE_AQUI"
{
"success": true,
"lead_id": 123,
"sequence_id": 1,
"status": "exited_manual"
}Send WhatsApp (text or image)
/leads/123/send-whatsappwhatsapp:writeSends a text or image message to the lead phone. See connected numbers in WhatsApp.
Body parameters
typestringrequiredtext or imagebodystringconditionalmedia_url)media_urlstring (URL)conditionaltype=image)captionstringoptionalinstance_idintegeroptionalErrors: 422 if the lead has no phone; 422 with skip_reason: "window_closed" on Official API numbers outside the 24h window (use a template); 502 on provider failure.
curl -X POST "https://app.syncro.chat/api/v1/leads/123/send-whatsapp" \
-H "X-API-Key: crm_SUA_CHAVE_AQUI" \
-H "Content-Type: application/json" \
-d '{
"type": "text",
"body": "Olá! Tudo bem?",
"instance_id": 1
}'{
"success": true,
"conversation_id": 99,
"message_id": 456,
"provider_msg_id": "wamid.xyz123"
}Send template (HSM)
/leads/123/send-whatsapp-templatewhatsapp:writeSends an approved official template (required outside the 24h window on the Official API). See templates in WhatsApp.
Body parameters
template_idintegerrequiredAPPROVED)variablesarray(string)optionalheader_media_urlstring (URL)optionalinstance_idintegeroptionalcurl -X POST "https://app.syncro.chat/api/v1/leads/123/send-whatsapp-template" \
-H "X-API-Key: crm_SUA_CHAVE_AQUI" \
-H "Content-Type: application/json" \
-d '{
"template_id": 1,
"variables": [
"João",
"Proposta",
"30/07"
],
"instance_id": 2
}'{
"success": true,
"conversation_id": 99,
"message_id": 457,
"provider_msg_id": "wamid.xyz456",
"template_name": "lembrete_proposta"
}Extra relations (`?include`)
On GET /leads and GET /leads/{id}, use ?include= with comma-separated names to load additional data. Unknown tokens are ignored.
| include | What it adds |
|---|---|
owner |
assigned_to (int) + owner {id, name, email} |
products |
products[] {id, product_id, product_name, quantity, unit_price, discount_percent, total} |
contacts |
contacts[] {id, name, role, phone, email, is_primary} |
notes |
notes_list[] {id, body, author, created_at} |
sales |
sales[] {id, pipeline_id, value, closed_by, closed_at} + lost_sales[] {id, pipeline_id, reason_id, lost_at, lost_by} |
tasks |
tasks[] {id, subject, type, status, priority, due_date, due_time, completed_at, assigned_to} |
sequences |
active_sequence {id, name, current_step, total_steps, status} + sequences[] {id, sequence_id, name, status, next_step_at} |
score |
score (int) + score_updated_at |
siblings |
siblings[] (other deals from the same contact) + contact_totals |
events |
events[] {id, event_type, description, performed_by, created_at} |
conversation |
conversation {id, phone, status, last_message_at, unread_count, instance_id} |
events,conversationandsiblingsare only available onGET /leads/{id}(not in the listing, for cost reasons).