Desenvolvedores
API do Atende360
Integre o CRM, o ERP ou o BI com a sua operação: contatos, campanhas, ligações, atendimentos digitais e pesquisas, com uma chave de API criada no console e permissões por área.
Visão geral
A API do Atende360 deixa o sistema do seu cliente ler e alterar dados da conta: contatos, campanhas do discador, ligações com transcrição e gravação, atendimentos de WhatsApp, Telegram, site e e-mail, e as respostas das pesquisas de satisfação.
https://api.atende360.ia.br/v1Comece em três passos
- No console, abra Administração › Chaves de API e clique em Nova chave.
- Escolha as permissões e copie a chave. Ela aparece uma única vez.
- Chame
GET /v1/mecom a chave para conferir que está tudo certo.
Convenções
- Datas e horas saem em ISO 8601, em UTC:
2026-10-28T13:58:02Z. - Filtros de dia usam
AAAA-MM-DDno fuso de São Paulo. - Telefones entram no formato internacional, como
+5511987654321, e saem só com os dígitos. - Cada chave pertence a uma conta e só enxerga os dados dela.
- O contrato completo está no openapi.yaml (OpenAPI 3.1), pronto para importar no Postman ou no Insomnia.
curl https://api.atende360.ia.br/v1/me \
-H "Authorization: Bearer $ATENDE360_API_KEY"{
"key": {
"id": "0b6c2f1e-5d1a-4c55-9a43-1f0f6b3d2a71",
"name": "CRM Pipedrive",
"prefix": "a360_Pk2v",
"expiresAt": null,
"allowedIps": []
},
"tenant": {
"id": "clinica-bem-viver",
"name": "Clínica Bem Viver"
},
"permissions": {
"contacts": "write",
"campaigns": "write",
"calls": "none",
"conversations": "none",
"surveys": "none"
},
"rateLimit": {
"perMinute": 120
}
}Autenticação
Mande a chave no cabeçalho Authorization de toda chamada, depois da palavra Bearer. Toda chave começa com a360_.
- Use a chave só no servidor. Quem tem a chave lê os dados da conta: ela não pode ir para o código de um site, de um aplicativo ou para uma planilha compartilhada. Chamadas feitas de um navegador, com a origem de outro site, são recusadas.
- Nunca mande a chave na URL: ela fica gravada em logs pelo caminho.
- Se a chave vazar, revogue no console. O efeito é imediato.
- Uma chave por sistema deixa revogar uma sem parar as outras.
- O que a chave cria aparece no console como “API · nome da chave”.
| Status | code | Quando |
|---|---|---|
| 401 | api_key_invalid | Chave ausente, inexistente, revogada ou vencida. |
| 403 | permission_denied | A chave não tem a permissão que a rota pede. A mensagem diz qual. |
| 403 | ip_not_allowed | A chave tem lista de IPs e a chamada veio de outro. |
| 403 | route_not_allowed | A rota existe, mas não faz parte da API pública. |
| 403 | tenant_billing_blocked | A conta está bloqueada pela cobrança: só leituras passam. |
GET /v1/contacts HTTP/1.1
Host: api.atende360.ia.br
Authorization: Bearer a360_Pk2v…9fQa{
"code": "api_key_invalid",
"message": "a chave de API é inválida, foi revogada ou venceu"
}Erros
Os erros voltam com o status HTTP certo e um corpo application/problem+json com code, estável para o seu sistema tratar, message, para gente ler, e, nos erros de preenchimento, fields com o motivo de cada campo.
| Status | code | Quando |
|---|---|---|
| 400 | invalid_request | Um parâmetro ou o corpo veio em formato inválido. |
| 401 | api_key_invalid | Veja Autenticação. |
| 403 | permission_denied | Falta permissão à chave. |
| 404 | resource_not_found | O registro não existe nesta conta. |
| 409 | resource_conflict | A mudança não vale no estado atual, como iniciar uma campanha encerrada. |
| 412 | revision_mismatch | Alguém alterou o registro antes. Leia de novo e repita. |
| 422 | validation_failed | Algum campo veio errado. Veja fields. |
| 428 | revision_required | Faltou o cabeçalho If-Match. |
| 429 | rate_limited | Passou do limite por minuto. Veja Limites de uso. |
| 5xx | Erro do nosso lado. Pode repetir depois de alguns segundos. |
{
"code": "validation_failed",
"message": "revise the highlighted fields",
"fields": {
"name": "Informe o nome."
}
}Limites de uso
Cada chave faz até 120 chamadas por minuto. Passando disso, a resposta é 429, com o cabeçalho Retry-After dizendo em quantos segundos tentar de novo. Toda resposta diz quanto ainda resta.
X-RateLimit-Limit: chamadas por minuto da chave.X-RateLimit-Remaining: quantas ainda cabem no minuto atual.- O corpo da requisição vai até 64 KB; a inclusão no mailing aceita até 8 MB e 20.000 contatos por chamada.
- Cada conta tem até 20 chaves ativas.
Para sincronizar muito volume, prefira páginas grandes, com o limit no máximo de cada rota, a muitas chamadas pequenas.
HTTP/1.1 429 Too Many Requests
Retry-After: 12
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 0
Content-Type: application/problem+json
{
"code": "rate_limited",
"message": "limite de 120 chamadas por minuto atingido"
}Paginação
As listas vêm em páginas, de dois jeitos, conforme a rota:
- limit e offset (contatos, mailing e pesquisas): a resposta traz
total. Some olimitaooffsetaté passar do total. - Cursor (ligações): repita a chamada com
before_started_atebefore_iddo último item recebido. Quando vier uma página menor que olimit, acabou.
O cursor não perde nem repete ligações quando chegam ligações novas no meio da leitura.
curl "https://api.atende360.ia.br/v1/conversations?limit=50&before_started_at=2026-10-28T13:58:02Z&before_id=3f2a8c1d-6b4e-4a9f-8c2d-1e0b7a6f5d43" \
-H "Authorization: Bearer $ATENDE360_API_KEY"Alterações seguras
Registros que podem ser alterados têm revision, que também vem no cabeçalho ETag. Para alterar, mande a revisão que você leu em If-Match.
- Se ninguém mexeu no registro, a alteração passa e a revisão sobe.
- Se alguém alterou antes, outra integração ou um atendente no console, a resposta é 412. Leia de novo, refaça a mudança e mande outra vez.
- Sem
If-Match, a resposta é 428.
Assim uma integração nunca apaga, sem saber, o que um atendente acabou de escrever.
{
"code": "revision_mismatch",
"message": "resource changed; reload before saving"
}Conta
Ver a chave em uso
/v1/mePermissão da chave: Qualquer chave
Diz qual chave fez a chamada, de qual conta ela é e o que pode fazer. Use para testar a integração logo depois de criar a chave.
Respostas
- 200A chave é válida.
- 401Chave ausente, revogada ou vencida.
- 429Passou do limite de chamadas por minuto.
curl "https://api.atende360.ia.br/v1/me" \
-H "Authorization: Bearer $ATENDE360_API_KEY"const resposta = await fetch("https://api.atende360.ia.br/v1/me", {
headers: {
Authorization: `Bearer ${process.env.ATENDE360_API_KEY}`,
},
});
const dados = await resposta.json();import os
import requests
resposta = requests.get(
"https://api.atende360.ia.br/v1/me",
headers={"Authorization": f"Bearer {os.environ['ATENDE360_API_KEY']}"},
)
dados = resposta.json(){
"key": {
"id": "0b6c2f1e-5d1a-4c55-9a43-1f0f6b3d2a71",
"name": "CRM Pipedrive",
"prefix": "a360_Pk2v",
"expiresAt": null,
"allowedIps": []
},
"tenant": {
"id": "clinica-bem-viver",
"name": "Clínica Bem Viver"
},
"permissions": {
"contacts": "write",
"campaigns": "write",
"calls": "none",
"conversations": "none",
"surveys": "none"
},
"rateLimit": {
"perMinute": 120
}
}Contatos
Listar contatos
/v1/contactsPermissão da chave: Contatos · ler
Lista os contatos da conta, do mais recente para o mais antigo. A busca olha nome, telefone, documento e e-mail.
Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
q | texto | Busca por nome |
tag | texto | Só contatos com esta etiqueta. |
limit | inteiro | Quantos trazer. Padrão 50 |
offset | inteiro | Quantos pular |
Respostas
- 200Página de contatos, mesmo vazia.
- 401Chave ausente, revogada ou vencida.
- 403A chave não tem a permissão desta rota.
- 429Passou do limite de chamadas por minuto.
curl "https://api.atende360.ia.br/v1/contacts?q=mariana&limit=20" \
-H "Authorization: Bearer $ATENDE360_API_KEY"const resposta = await fetch("https://api.atende360.ia.br/v1/contacts?q=mariana&limit=20", {
headers: {
Authorization: `Bearer ${process.env.ATENDE360_API_KEY}`,
},
});
const dados = await resposta.json();import os
import requests
resposta = requests.get(
"https://api.atende360.ia.br/v1/contacts",
params={
"q": "mariana",
"limit": 20
},
headers={"Authorization": f"Bearer {os.environ['ATENDE360_API_KEY']}"},
)
dados = resposta.json(){
"contacts": [
{
"id": "c8d1e0a4-2b7f-4e8e-9d1c-6a5b4f3e2d10",
"name": "Mariana Alves",
"kind": "person",
"document": "12345678909",
"company": "",
"tags": [
"paciente",
"convenio"
],
"identities": [
{
"kind": "phone",
"value": "5511987654321"
},
{
"kind": "email",
"value": "mariana@example.com"
}
],
"attendances30d": 3,
"lastAttendance": {
"channel": "whatsapp",
"startedAt": "2026-10-27T18:31:00Z",
"protocol": "20261027000184",
"live": false
},
"channels": [
"voice",
"whatsapp"
],
"revision": 4,
"createdAt": "2026-09-14T13:02:11Z",
"updatedAt": "2026-10-27T18:40:03Z"
}
],
"total": 1
}Criar contato
/v1/contactsPermissão da chave: Contatos · ler e alterar
Cria o contato e devolve o registro completo. No console, o contato aparece criado por “API · nome da chave”. Se um telefone ou e-mail já tinha atendimentos sem contato, eles passam para o contato novo e linkedHistory diz quantos.
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
nameobrigatório | texto | Nome do contato. |
kind | texto | Pessoa ou empresa. Valores: person, company. |
document | texto | CPF ou CNPJ. |
company | texto | Empresa do contato. |
tags | lista de texto | Etiquetas. |
notes | texto | Observações internas. |
identities | lista | Formas de contato. O telefone vai no formato internacional, como +5511987654321. |
identities[].kindobrigatório | texto | Valores: phone, email, telegram, site, instagram, facebook. |
identities[].valueobrigatório | texto | |
identities[].label | texto | Rótulo opcional |
Respostas
- 201Criado. O cabeçalho ETag traz a revisão.
- 422Algum campo veio errado; fields diz qual e por quê.
- 401Chave ausente, revogada ou vencida.
- 403A chave não tem a permissão desta rota.
- 429Passou do limite de chamadas por minuto.
curl -X POST "https://api.atende360.ia.br/v1/contacts" \
-H "Authorization: Bearer $ATENDE360_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Mariana Alves",
"document": "12345678909",
"tags": [
"paciente"
],
"identities": [
{
"kind": "phone",
"value": "+5511987654321"
},
{
"kind": "email",
"value": "mariana@example.com"
}
]
}'const resposta = await fetch("https://api.atende360.ia.br/v1/contacts", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.ATENDE360_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"name": "Mariana Alves",
"document": "12345678909",
"tags": [
"paciente"
],
"identities": [
{
"kind": "phone",
"value": "+5511987654321"
},
{
"kind": "email",
"value": "mariana@example.com"
}
]
}),
});
const dados = await resposta.json();import os
import requests
resposta = requests.post(
"https://api.atende360.ia.br/v1/contacts",
headers={"Authorization": f"Bearer {os.environ['ATENDE360_API_KEY']}"},
json={
"name": "Mariana Alves",
"document": "12345678909",
"tags": [
"paciente"
],
"identities": [
{
"kind": "phone",
"value": "+5511987654321"
},
{
"kind": "email",
"value": "mariana@example.com"
}
]
},
)
dados = resposta.json(){
"contact": {
"id": "c8d1e0a4-2b7f-4e8e-9d1c-6a5b4f3e2d10",
"name": "Mariana Alves",
"kind": "person",
"document": "12345678909",
"company": "",
"tags": [
"paciente"
],
"identities": [
{
"kind": "phone",
"value": "5511987654321"
},
{
"kind": "email",
"value": "mariana@example.com"
}
],
"attendances30d": 0,
"channels": [],
"revision": 1,
"createdAt": "2026-10-28T14:02:11Z",
"updatedAt": "2026-10-28T14:02:11Z",
"notes": "",
"createdByName": "API · CRM Pipedrive",
"attendances": []
},
"linkedHistory": 0
}Ver um contato
/v1/contacts/{id}Permissão da chave: Contatos · ler
Traz o contato com observações e os últimos atendimentos. O cabeçalho ETag traz a revisão para usar no If-Match ao alterar.
Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
idobrigatório | uuid | Identificador do registro. |
Respostas
- 200Contato encontrado.
- 404O registro não existe nesta conta.
- 401Chave ausente, revogada ou vencida.
- 403A chave não tem a permissão desta rota.
- 429Passou do limite de chamadas por minuto.
curl "https://api.atende360.ia.br/v1/contacts/c8d1e0a4-2b7f-4e8e-9d1c-6a5b4f3e2d10" \
-H "Authorization: Bearer $ATENDE360_API_KEY"const resposta = await fetch("https://api.atende360.ia.br/v1/contacts/c8d1e0a4-2b7f-4e8e-9d1c-6a5b4f3e2d10", {
headers: {
Authorization: `Bearer ${process.env.ATENDE360_API_KEY}`,
},
});
const dados = await resposta.json();import os
import requests
resposta = requests.get(
"https://api.atende360.ia.br/v1/contacts/c8d1e0a4-2b7f-4e8e-9d1c-6a5b4f3e2d10",
headers={"Authorization": f"Bearer {os.environ['ATENDE360_API_KEY']}"},
)
dados = resposta.json(){
"id": "c8d1e0a4-2b7f-4e8e-9d1c-6a5b4f3e2d10",
"name": "Mariana Alves",
"kind": "person",
"document": "12345678909",
"company": "",
"tags": [
"paciente",
"convenio"
],
"identities": [
{
"kind": "phone",
"value": "5511987654321"
}
],
"attendances30d": 3,
"channels": [
"voice",
"whatsapp"
],
"revision": 4,
"createdAt": "2026-09-14T13:02:11Z",
"updatedAt": "2026-10-27T18:40:03Z",
"notes": "Prefere contato à tarde.",
"createdByName": "API · CRM Pipedrive",
"attendances": [
{
"id": "5f1c2e9a-0b3d-4c7e-8a6f-2d9b1e0c3a74",
"protocol": "20261027000184",
"channel": "whatsapp",
"direction": "inbound",
"startedAt": "2026-10-27T18:31:00Z",
"live": false,
"identityKind": "phone",
"identity": "5511987654321",
"handledBy": "Paula Reis"
}
]
}Atualizar contato
/v1/contacts/{id}Permissão da chave: Contatos · ler e alterar
Substitui os dados do contato: mande o registro inteiro, não só o que mudou. A revisão lida vai no If-Match; se alguém alterou o contato antes, a resposta é 412.
Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
idobrigatório | uuid | Identificador do registro. |
If-Matchobrigatório | texto | Revisão atual entre aspas, como "4". Vem no ETag e no campo revision. |
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
nameobrigatório | texto | Nome do contato. |
kind | texto | Pessoa ou empresa. Valores: person, company. |
document | texto | CPF ou CNPJ. |
company | texto | Empresa do contato. |
tags | lista de texto | Etiquetas. |
notes | texto | Observações internas. |
identities | lista | Formas de contato. O telefone vai no formato internacional, como +5511987654321. |
identities[].kindobrigatório | texto | Valores: phone, email, telegram, site, instagram, facebook. |
identities[].valueobrigatório | texto | |
identities[].label | texto | Rótulo opcional |
Respostas
- 200Atualizado; a revisão sobe.
- 412Alguém alterou o registro antes. Leia de novo e repita.
- 422Algum campo veio errado; fields diz qual e por quê.
- 428Faltou o cabeçalho If-Match.
- 401Chave ausente, revogada ou vencida.
- 403A chave não tem a permissão desta rota.
- 429Passou do limite de chamadas por minuto.
curl -X PUT "https://api.atende360.ia.br/v1/contacts/c8d1e0a4-2b7f-4e8e-9d1c-6a5b4f3e2d10" \
-H "Authorization: Bearer $ATENDE360_API_KEY" \
-H 'If-Match: "4"' \
-H "Content-Type: application/json" \
-d '{
"name": "Mariana Alves Souza",
"document": "12345678909",
"tags": [
"paciente",
"convenio"
],
"identities": [
{
"kind": "phone",
"value": "+5511987654321"
}
]
}'const resposta = await fetch("https://api.atende360.ia.br/v1/contacts/c8d1e0a4-2b7f-4e8e-9d1c-6a5b4f3e2d10", {
method: "PUT",
headers: {
Authorization: `Bearer ${process.env.ATENDE360_API_KEY}`,
"Content-Type": "application/json",
"If-Match": '"4"',
},
body: JSON.stringify({
"name": "Mariana Alves Souza",
"document": "12345678909",
"tags": [
"paciente",
"convenio"
],
"identities": [
{
"kind": "phone",
"value": "+5511987654321"
}
]
}),
});
const dados = await resposta.json();import os
import requests
resposta = requests.put(
"https://api.atende360.ia.br/v1/contacts/c8d1e0a4-2b7f-4e8e-9d1c-6a5b4f3e2d10",
headers={"Authorization": f"Bearer {os.environ['ATENDE360_API_KEY']}", "If-Match": '"4"'},
json={
"name": "Mariana Alves Souza",
"document": "12345678909",
"tags": [
"paciente",
"convenio"
],
"identities": [
{
"kind": "phone",
"value": "+5511987654321"
}
]
},
)
dados = resposta.json(){
"contact": {
"id": "c8d1e0a4-2b7f-4e8e-9d1c-6a5b4f3e2d10",
"name": "Mariana Alves Souza",
"revision": 5
},
"linkedHistory": 0
}Histórico do contato
/v1/contacts/{id}/attendancesPermissão da chave: Contatos · ler
Ligações e conversas digitais do contato, da mais recente para a mais antiga, com o protocolo, quem atendeu e as notas de CSAT e NPS quando houver.
Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
idobrigatório | uuid | Identificador do registro. |
channel | texto | Só um canal: voice, whatsapp, telegram, site ou email. |
from | data e hora | Início, em RFC 3339 (2026-10-01T00:00:00-03:00). |
to | data e hora | Fim |
Respostas
- 200Histórico, mesmo vazio.
- 404O registro não existe nesta conta.
- 401Chave ausente, revogada ou vencida.
- 403A chave não tem a permissão desta rota.
- 429Passou do limite de chamadas por minuto.
curl "https://api.atende360.ia.br/v1/contacts/c8d1e0a4-2b7f-4e8e-9d1c-6a5b4f3e2d10/attendances?channel=whatsapp" \
-H "Authorization: Bearer $ATENDE360_API_KEY"const resposta = await fetch("https://api.atende360.ia.br/v1/contacts/c8d1e0a4-2b7f-4e8e-9d1c-6a5b4f3e2d10/attendances?channel=whatsapp", {
headers: {
Authorization: `Bearer ${process.env.ATENDE360_API_KEY}`,
},
});
const dados = await resposta.json();import os
import requests
resposta = requests.get(
"https://api.atende360.ia.br/v1/contacts/c8d1e0a4-2b7f-4e8e-9d1c-6a5b4f3e2d10/attendances",
params={
"channel": "whatsapp"
},
headers={"Authorization": f"Bearer {os.environ['ATENDE360_API_KEY']}"},
)
dados = resposta.json(){
"attendances": [
{
"id": "5f1c2e9a-0b3d-4c7e-8a6f-2d9b1e0c3a74",
"protocol": "20261027000184",
"channel": "whatsapp",
"direction": "inbound",
"startedAt": "2026-10-27T18:31:00Z",
"endedAt": "2026-10-27T18:52:40Z",
"live": false,
"identityKind": "phone",
"identity": "5511987654321",
"conversationId": "a7c2e9f1-3b5d-4e8a-9c1f-6d2b0e4a8c35",
"channelName": "WhatsApp da recepção",
"messages": 14,
"handledBy": "Paula Reis",
"groupName": "Recepção",
"csat": 5,
"contact": {
"id": "c8d1e0a4-2b7f-4e8e-9d1c-6a5b4f3e2d10",
"name": "Mariana Alves",
"linkedBy": "auto"
}
}
]
}Campanhas
Listar campanhas
/v1/campaignsPermissão da chave: Campanhas · ler
As campanhas do discador com a situação e o andamento do mailing. status pode ser draft (rascunho), running, paused, stopped (encerrada por alguém) ou completed (o mailing acabou).
Respostas
- 200Lista, mesmo vazia.
- 401Chave ausente, revogada ou vencida.
- 403A chave não tem a permissão desta rota.
- 429Passou do limite de chamadas por minuto.
curl "https://api.atende360.ia.br/v1/campaigns" \
-H "Authorization: Bearer $ATENDE360_API_KEY"const resposta = await fetch("https://api.atende360.ia.br/v1/campaigns", {
headers: {
Authorization: `Bearer ${process.env.ATENDE360_API_KEY}`,
},
});
const dados = await resposta.json();import os
import requests
resposta = requests.get(
"https://api.atende360.ia.br/v1/campaigns",
headers={"Authorization": f"Bearer {os.environ['ATENDE360_API_KEY']}"},
)
dados = resposta.json(){
"version": 1,
"items": [
{
"id": "7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47",
"name": "Retorno de exames",
"description": "Pacientes com exame pronto",
"destinationKind": "group",
"destinationName": "Recepção",
"status": "running",
"maxLines": 10,
"maxAttempts": 3,
"retryIntervalMinutes": 60,
"windowStartMinute": 540,
"windowEndMinute": 1080,
"weekdays": [
1,
2,
3,
4,
5
],
"timezone": "America/Sao_Paulo",
"mailing": {
"total": 1204,
"pending": 388,
"dialing": 6,
"done": 790,
"exhausted": 18,
"suppressed": 2,
"ready": 371,
"blocked": 0
},
"revision": 7,
"createdAt": "2026-10-20T12:00:00Z",
"updatedAt": "2026-10-28T13:10:00Z"
}
]
}Ver uma campanha
/v1/campaigns/{id}Permissão da chave: Campanhas · ler
Configuração, situação e andamento de uma campanha. O cabeçalho ETag traz a revisão.
Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
idobrigatório | uuid | Identificador do registro. |
Respostas
- 200Campanha encontrada.
- 404O registro não existe nesta conta.
- 401Chave ausente, revogada ou vencida.
- 403A chave não tem a permissão desta rota.
- 429Passou do limite de chamadas por minuto.
curl "https://api.atende360.ia.br/v1/campaigns/7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47" \
-H "Authorization: Bearer $ATENDE360_API_KEY"const resposta = await fetch("https://api.atende360.ia.br/v1/campaigns/7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47", {
headers: {
Authorization: `Bearer ${process.env.ATENDE360_API_KEY}`,
},
});
const dados = await resposta.json();import os
import requests
resposta = requests.get(
"https://api.atende360.ia.br/v1/campaigns/7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47",
headers={"Authorization": f"Bearer {os.environ['ATENDE360_API_KEY']}"},
)
dados = resposta.json(){
"id": "7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47",
"name": "Retorno de exames",
"status": "running",
"destinationKind": "group",
"maxLines": 10,
"mailing": {
"total": 1204,
"pending": 388,
"dialing": 6,
"done": 790,
"exhausted": 18,
"suppressed": 2,
"ready": 371,
"blocked": 0
},
"dialable": true,
"revision": 7
}Ver o mailing
/v1/campaigns/{id}/contactsPermissão da chave: Campanhas · ler
Contatos do mailing com a situação de cada um: pending (na fila), dialing (em ligação), done (concluído), exhausted (acabaram as tentativas) ou suppressed (retirado).
Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
idobrigatório | uuid | Identificador do registro. |
status | texto | Só contatos nesta situação. |
search | texto | Busca por nome |
limit | inteiro | Padrão 50 |
offset | inteiro | Quantos pular. |
Respostas
- 200Página do mailing.
- 401Chave ausente, revogada ou vencida.
- 403A chave não tem a permissão desta rota.
- 429Passou do limite de chamadas por minuto.
curl "https://api.atende360.ia.br/v1/campaigns/7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47/contacts?status=pending&limit=100" \
-H "Authorization: Bearer $ATENDE360_API_KEY"const resposta = await fetch("https://api.atende360.ia.br/v1/campaigns/7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47/contacts?status=pending&limit=100", {
headers: {
Authorization: `Bearer ${process.env.ATENDE360_API_KEY}`,
},
});
const dados = await resposta.json();import os
import requests
resposta = requests.get(
"https://api.atende360.ia.br/v1/campaigns/7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47/contacts",
params={
"status": "pending",
"limit": 100
},
headers={"Authorization": f"Bearer {os.environ['ATENDE360_API_KEY']}"},
)
dados = resposta.json(){
"items": [
{
"id": "e41b6c9a-0d2f-4a8e-b7c3-5f1d9e2a6b80",
"phone": "5511987654321",
"name": "Mariana Alves",
"document": "",
"customerCode": "PAC-1042",
"extra": {
"exame": "Hemograma"
},
"priority": 0,
"status": "pending",
"attempts": 0,
"lastDisposition": "",
"nextAttemptAt": "2026-10-28T14:00:00Z",
"revision": 1
}
],
"total": 388
}Incluir números no mailing
/v1/campaigns/{id}/contactsPermissão da chave: Campanhas · ler e alterar
Acrescenta contatos ao mailing da campanha. Números repetidos e números da blocklist não entram, e a resposta conta cada caso. Até 20.000 contatos por chamada; o que passar disso é ignorado e volta truncated true.
Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
idobrigatório | uuid | Identificador do registro. |
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
contactsobrigatório | lista | Contatos a incluir. |
contacts[].phoneobrigatório | texto | Telefone com DDD; aceita +55 na frente. |
contacts[].name | texto | Nome |
contacts[].document | texto | CPF ou CNPJ. |
contacts[].customerCode | texto | Código do cliente no seu sistema. |
contacts[].extra | objeto | Campos livres |
contacts[].priority | inteiro | Maior liga antes. |
Respostas
- 200Processado; veja os contadores.
- 404O registro não existe nesta conta.
- 422Algum campo veio errado; fields diz qual e por quê.
- 401Chave ausente, revogada ou vencida.
- 403A chave não tem a permissão desta rota.
- 429Passou do limite de chamadas por minuto.
curl -X POST "https://api.atende360.ia.br/v1/campaigns/7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47/contacts" \
-H "Authorization: Bearer $ATENDE360_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contacts": [
{
"phone": "+5511987654321",
"name": "Mariana Alves",
"customerCode": "PAC-1042",
"extra": {
"exame": "Hemograma"
}
},
{
"phone": "+5521998877665",
"name": "João Pereira"
}
]
}'const resposta = await fetch("https://api.atende360.ia.br/v1/campaigns/7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47/contacts", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.ATENDE360_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"contacts": [
{
"phone": "+5511987654321",
"name": "Mariana Alves",
"customerCode": "PAC-1042",
"extra": {
"exame": "Hemograma"
}
},
{
"phone": "+5521998877665",
"name": "João Pereira"
}
]
}),
});
const dados = await resposta.json();import os
import requests
resposta = requests.post(
"https://api.atende360.ia.br/v1/campaigns/7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47/contacts",
headers={"Authorization": f"Bearer {os.environ['ATENDE360_API_KEY']}"},
json={
"contacts": [
{
"phone": "+5511987654321",
"name": "Mariana Alves",
"customerCode": "PAC-1042",
"extra": {
"exame": "Hemograma"
}
},
{
"phone": "+5521998877665",
"name": "João Pereira"
}
]
},
)
dados = resposta.json(){
"added": 2,
"duplicate": 0,
"rejected": 0,
"blocked": 0,
"reasons": [],
"mailing": {
"total": 1206,
"pending": 390,
"dialing": 6,
"done": 790,
"exhausted": 18,
"suppressed": 2,
"ready": 373,
"blocked": 0
},
"truncated": false
}Iniciar campanha
/v1/campaigns/{id}/startPermissão da chave: Campanhas · ler e alterar
Coloca a campanha para discar. Ela só liga dentro da janela de horário configurada. Mande a revisão da campanha no If-Match; a resposta traz a campanha com a revisão nova.
Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
idobrigatório | uuid | Identificador do registro. |
If-Matchobrigatório | texto | Revisão atual entre aspas, como "4". Vem no ETag e no campo revision. |
Respostas
- 200A campanha com a situação e a revisão novas.
- 409A mudança não vale no estado atual, como iniciar uma campanha encerrada.
- 412Alguém alterou o registro antes. Leia de novo e repita.
- 401Chave ausente, revogada ou vencida.
- 403A chave não tem a permissão desta rota.
- 429Passou do limite de chamadas por minuto.
curl -X POST "https://api.atende360.ia.br/v1/campaigns/7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47/start" \
-H "Authorization: Bearer $ATENDE360_API_KEY" \
-H 'If-Match: "7"'const resposta = await fetch("https://api.atende360.ia.br/v1/campaigns/7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47/start", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.ATENDE360_API_KEY}`,
"If-Match": '"7"',
},
});
const dados = await resposta.json();import os
import requests
resposta = requests.post(
"https://api.atende360.ia.br/v1/campaigns/7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47/start",
headers={"Authorization": f"Bearer {os.environ['ATENDE360_API_KEY']}", "If-Match": '"7"'},
)
dados = resposta.json(){
"id": "7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47",
"name": "Retorno de exames",
"status": "running",
"revision": 8
}Pausar campanha
/v1/campaigns/{id}/pausePermissão da chave: Campanhas · ler e alterar
Para de discar sem encerrar: as ligações em curso terminam e a campanha volta a discar quando for iniciada de novo. Mande a revisão no If-Match.
Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
idobrigatório | uuid | Identificador do registro. |
If-Matchobrigatório | texto | Revisão atual entre aspas, como "4". Vem no ETag e no campo revision. |
Respostas
- 200A campanha com a situação e a revisão novas.
- 409A mudança não vale no estado atual, como iniciar uma campanha encerrada.
- 412Alguém alterou o registro antes. Leia de novo e repita.
- 401Chave ausente, revogada ou vencida.
- 403A chave não tem a permissão desta rota.
- 429Passou do limite de chamadas por minuto.
curl -X POST "https://api.atende360.ia.br/v1/campaigns/7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47/pause" \
-H "Authorization: Bearer $ATENDE360_API_KEY" \
-H 'If-Match: "8"'const resposta = await fetch("https://api.atende360.ia.br/v1/campaigns/7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47/pause", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.ATENDE360_API_KEY}`,
"If-Match": '"8"',
},
});
const dados = await resposta.json();import os
import requests
resposta = requests.post(
"https://api.atende360.ia.br/v1/campaigns/7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47/pause",
headers={"Authorization": f"Bearer {os.environ['ATENDE360_API_KEY']}", "If-Match": '"8"'},
)
dados = resposta.json(){
"id": "7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47",
"name": "Retorno de exames",
"status": "running",
"revision": 8
}Encerrar campanha
/v1/campaigns/{id}/stopPermissão da chave: Campanhas · ler e alterar
Encerra a campanha de vez: ela não volta a discar. Para continuar o mesmo mailing, crie outra campanha no console. Mande a revisão no If-Match.
Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
idobrigatório | uuid | Identificador do registro. |
If-Matchobrigatório | texto | Revisão atual entre aspas, como "4". Vem no ETag e no campo revision. |
Respostas
- 200A campanha com a situação e a revisão novas.
- 409A mudança não vale no estado atual, como iniciar uma campanha encerrada.
- 412Alguém alterou o registro antes. Leia de novo e repita.
- 401Chave ausente, revogada ou vencida.
- 403A chave não tem a permissão desta rota.
- 429Passou do limite de chamadas por minuto.
curl -X POST "https://api.atende360.ia.br/v1/campaigns/7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47/stop" \
-H "Authorization: Bearer $ATENDE360_API_KEY" \
-H 'If-Match: "9"'const resposta = await fetch("https://api.atende360.ia.br/v1/campaigns/7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47/stop", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.ATENDE360_API_KEY}`,
"If-Match": '"9"',
},
});
const dados = await resposta.json();import os
import requests
resposta = requests.post(
"https://api.atende360.ia.br/v1/campaigns/7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47/stop",
headers={"Authorization": f"Bearer {os.environ['ATENDE360_API_KEY']}", "If-Match": '"9"'},
)
dados = resposta.json(){
"id": "7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47",
"name": "Retorno de exames",
"status": "running",
"revision": 8
}Ligações
Listar ligações
/v1/conversationsPermissão da chave: Ligações e gravações · ler
Ligações recebidas e feitas, inclusive as atendidas pela IA, da mais recente para a mais antiga. Para a próxima página, repita a chamada com before_started_at e before_id do último item; quando vier menos que o limit, acabou.
Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
date_from | data | Primeiro dia, AAAA-MM-DD, no fuso de São Paulo. Vai junto com date_to. |
date_to | data | Último dia, AAAA-MM-DD. Vai junto com date_from. |
phone | texto | Número do cliente. |
direction | texto | inbound (recebida) ou outbound (feita). |
campaign_id | uuid | Só ligações desta campanha. |
protocol | texto | Protocolo do atendimento. |
limit | inteiro | Padrão 50 |
before_started_at | data e hora | Cursor: startedAt do último item, em RFC 3339. |
before_id | uuid | Cursor: id do último item. |
Respostas
- 200Página de ligações.
- 400Um parâmetro veio em formato inválido.
- 401Chave ausente, revogada ou vencida.
- 403A chave não tem a permissão desta rota.
- 429Passou do limite de chamadas por minuto.
curl "https://api.atende360.ia.br/v1/conversations?date_from=2026-10-28&date_to=2026-10-28&direction=inbound&limit=50" \
-H "Authorization: Bearer $ATENDE360_API_KEY"const resposta = await fetch("https://api.atende360.ia.br/v1/conversations?date_from=2026-10-28&date_to=2026-10-28&direction=inbound&limit=50", {
headers: {
Authorization: `Bearer ${process.env.ATENDE360_API_KEY}`,
},
});
const dados = await resposta.json();import os
import requests
resposta = requests.get(
"https://api.atende360.ia.br/v1/conversations",
params={
"date_from": "2026-10-28",
"date_to": "2026-10-28",
"direction": "inbound",
"limit": 50
},
headers={"Authorization": f"Bearer {os.environ['ATENDE360_API_KEY']}"},
)
dados = resposta.json(){
"version": 1,
"conversations": [
{
"id": "3f2a8c1d-6b4e-4a9f-8c2d-1e0b7a6f5d43",
"callId": "9a1c4e7f-2d3b-5c6a-8e9f-0b1a2c3d4e5f",
"phone": "5511987654321",
"did": "551123910055",
"direction": "inbound",
"answered": true,
"endReason": "completed",
"durationSeconds": 184,
"startedAt": "2026-10-28T13:58:02Z",
"lastMessageAt": "2026-10-28T14:01:06Z",
"messageCount": 12,
"preview": "Queria remarcar meu exame de amanhã.",
"hasRecording": true,
"agentName": "Recepção IA",
"groupName": "Recepção",
"campaignId": "",
"protocol": "20261028000231"
}
]
}Ver uma ligação
/v1/conversations/{id}Permissão da chave: Ligações e gravações · ler
Detalhe da ligação com a transcrição: cada fala do cliente (user) e da IA (assistant), na ordem, e os eventos do fluxo (event), como transferência e encerramento.
Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
idobrigatório | uuid | Identificador do registro. |
Respostas
- 200Ligação encontrada.
- 404O registro não existe nesta conta.
- 401Chave ausente, revogada ou vencida.
- 403A chave não tem a permissão desta rota.
- 429Passou do limite de chamadas por minuto.
curl "https://api.atende360.ia.br/v1/conversations/3f2a8c1d-6b4e-4a9f-8c2d-1e0b7a6f5d43" \
-H "Authorization: Bearer $ATENDE360_API_KEY"const resposta = await fetch("https://api.atende360.ia.br/v1/conversations/3f2a8c1d-6b4e-4a9f-8c2d-1e0b7a6f5d43", {
headers: {
Authorization: `Bearer ${process.env.ATENDE360_API_KEY}`,
},
});
const dados = await resposta.json();import os
import requests
resposta = requests.get(
"https://api.atende360.ia.br/v1/conversations/3f2a8c1d-6b4e-4a9f-8c2d-1e0b7a6f5d43",
headers={"Authorization": f"Bearer {os.environ['ATENDE360_API_KEY']}"},
)
dados = resposta.json(){
"id": "3f2a8c1d-6b4e-4a9f-8c2d-1e0b7a6f5d43",
"callId": "9a1c4e7f-2d3b-5c6a-8e9f-0b1a2c3d4e5f",
"phone": "5511987654321",
"direction": "inbound",
"answered": true,
"durationSeconds": 184,
"startedAt": "2026-10-28T13:58:02Z",
"hasRecording": true,
"protocol": "20261028000231",
"messages": [
{
"role": "assistant",
"content": "Olá! Aqui é a recepção da Clínica Bem Viver. Como posso ajudar?",
"createdAt": "2026-10-28T13:58:04Z"
},
{
"role": "user",
"content": "Queria remarcar meu exame de amanhã.",
"createdAt": "2026-10-28T13:58:09Z"
}
]
}Link da gravação
/v1/conversations/{id}/recording-urlPermissão da chave: Ligações e gravações · ler
Gera um link para ouvir a gravação. O link vale 15 minutos: guarde o id da ligação, não o link, e peça outro quando precisar.
Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
idobrigatório | uuid | Identificador do registro. |
Respostas
- 200Link pronto.
- 404A ligação não existe ou não foi gravada.
- 401Chave ausente, revogada ou vencida.
- 403A chave não tem a permissão desta rota.
- 429Passou do limite de chamadas por minuto.
curl "https://api.atende360.ia.br/v1/conversations/3f2a8c1d-6b4e-4a9f-8c2d-1e0b7a6f5d43/recording-url" \
-H "Authorization: Bearer $ATENDE360_API_KEY"const resposta = await fetch("https://api.atende360.ia.br/v1/conversations/3f2a8c1d-6b4e-4a9f-8c2d-1e0b7a6f5d43/recording-url", {
headers: {
Authorization: `Bearer ${process.env.ATENDE360_API_KEY}`,
},
});
const dados = await resposta.json();import os
import requests
resposta = requests.get(
"https://api.atende360.ia.br/v1/conversations/3f2a8c1d-6b4e-4a9f-8c2d-1e0b7a6f5d43/recording-url",
headers={"Authorization": f"Bearer {os.environ['ATENDE360_API_KEY']}"},
)
dados = resposta.json(){
"url": "https://storage.example.com/gravacoes/9a1c4e7f.wav?X-Amz-Expires=900&X-Amz-Signature=3b1f…"
}Atendimentos digitais
Listar atendimentos
/v1/digital/conversationsPermissão da chave: Atendimentos digitais · ler
Conversas de WhatsApp, Telegram, chat do site e e-mail, da mais recente para a mais antiga. status é bot (com a IA ou o fluxo), queued (na fila), assigned (com um atendente) ou closed.
Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
status | texto | Uma ou mais situações separadas por vírgula: bot, queued, assigned, closed. |
channelId | uuid | Só conversas deste canal. |
search | texto | Busca por nome |
limit | inteiro | Quantas trazer. |
Respostas
- 200Lista, mesmo vazia.
- 401Chave ausente, revogada ou vencida.
- 403A chave não tem a permissão desta rota.
- 429Passou do limite de chamadas por minuto.
curl "https://api.atende360.ia.br/v1/digital/conversations?status=queued%2Cassigned&limit=50" \
-H "Authorization: Bearer $ATENDE360_API_KEY"const resposta = await fetch("https://api.atende360.ia.br/v1/digital/conversations?status=queued%2Cassigned&limit=50", {
headers: {
Authorization: `Bearer ${process.env.ATENDE360_API_KEY}`,
},
});
const dados = await resposta.json();import os
import requests
resposta = requests.get(
"https://api.atende360.ia.br/v1/digital/conversations",
params={
"status": "queued,assigned",
"limit": 50
},
headers={"Authorization": f"Bearer {os.environ['ATENDE360_API_KEY']}"},
)
dados = resposta.json(){
"version": 1,
"items": [
{
"id": "a7c2e9f1-3b5d-4e8a-9c1f-6d2b0e4a8c35",
"channelId": "f6847618-2c1e-4b3a-9d5f-7e0a1c2b3d4e",
"contactIdentity": "5511987654321",
"contactName": "Mariana Alves",
"status": "assigned",
"assigneeName": "Paula Reis",
"preview": "Pode ser às 15h?",
"unreadCount": 1,
"pendingReply": true,
"windowOpen": true,
"lastMessageAt": "2026-10-28T14:01:37Z",
"createdAt": "2026-10-28T13:40:12Z",
"protocol": "20261028000187",
"revision": 12
}
]
}Ver um atendimento
/v1/digital/conversations/{id}Permissão da chave: Atendimentos digitais · ler
A conversa com as mensagens, da mais antiga para a mais nova. authorKind diz quem escreveu: contact (o cliente), user (um atendente), bot (a IA ou o fluxo) ou system.
Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
idobrigatório | uuid | Identificador do registro. |
limit | inteiro | Mensagens a trazer. Padrão 200 |
Respostas
- 200Conversa encontrada.
- 404O registro não existe nesta conta.
- 401Chave ausente, revogada ou vencida.
- 403A chave não tem a permissão desta rota.
- 429Passou do limite de chamadas por minuto.
curl "https://api.atende360.ia.br/v1/digital/conversations/a7c2e9f1-3b5d-4e8a-9c1f-6d2b0e4a8c35" \
-H "Authorization: Bearer $ATENDE360_API_KEY"const resposta = await fetch("https://api.atende360.ia.br/v1/digital/conversations/a7c2e9f1-3b5d-4e8a-9c1f-6d2b0e4a8c35", {
headers: {
Authorization: `Bearer ${process.env.ATENDE360_API_KEY}`,
},
});
const dados = await resposta.json();import os
import requests
resposta = requests.get(
"https://api.atende360.ia.br/v1/digital/conversations/a7c2e9f1-3b5d-4e8a-9c1f-6d2b0e4a8c35",
headers={"Authorization": f"Bearer {os.environ['ATENDE360_API_KEY']}"},
)
dados = resposta.json(){
"conversation": {
"id": "a7c2e9f1-3b5d-4e8a-9c1f-6d2b0e4a8c35",
"contactName": "Mariana Alves",
"status": "assigned",
"protocol": "20261028000187"
},
"messages": [
{
"id": "1d7e3c5a-9b2f-4e6a-8c1d-0f3b5a7c9e21",
"direction": "inbound",
"authorKind": "contact",
"body": "Oi, queria remarcar meu exame.",
"status": "received",
"createdAt": "2026-10-28T13:40:12Z"
},
{
"id": "6b8a0c2e-4d1f-4a3b-9e5c-7f2d4b6a8c03",
"direction": "outbound",
"authorKind": "user",
"authorName": "Paula Reis",
"body": "Claro! Temos amanhã às 15h.",
"status": "read",
"createdAt": "2026-10-28T13:41:03Z"
}
]
}Pesquisas
Respostas de CSAT
/v1/reports/csat/responsesPermissão da chave: Pesquisas · ler
Notas de 1 a 5 dadas ao fim dos atendimentos digitais, com comentário, canal e atendente. Sem from e to, traz os últimos 7 dias.
Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
from | data | Primeiro dia, AAAA-MM-DD (São Paulo). |
to | data | Último dia |
score | texto | Uma nota (1 a 5) ou uma faixa: low (1–2), mid (3), high (4–5). |
comments | texto | 1 para só respostas com comentário. |
channel_id | uuid | Só este canal. |
limit | inteiro | Padrão 100 |
offset | inteiro | Quantas pular. |
Respostas
- 200Página de respostas.
- 400Um parâmetro veio em formato inválido.
- 401Chave ausente, revogada ou vencida.
- 403A chave não tem a permissão desta rota.
- 429Passou do limite de chamadas por minuto.
curl "https://api.atende360.ia.br/v1/reports/csat/responses?from=2026-10-01&to=2026-10-28&comments=1" \
-H "Authorization: Bearer $ATENDE360_API_KEY"const resposta = await fetch("https://api.atende360.ia.br/v1/reports/csat/responses?from=2026-10-01&to=2026-10-28&comments=1", {
headers: {
Authorization: `Bearer ${process.env.ATENDE360_API_KEY}`,
},
});
const dados = await resposta.json();import os
import requests
resposta = requests.get(
"https://api.atende360.ia.br/v1/reports/csat/responses",
params={
"from": "2026-10-01",
"to": "2026-10-28",
"comments": "1"
},
headers={"Authorization": f"Bearer {os.environ['ATENDE360_API_KEY']}"},
)
dados = resposta.json(){
"version": 1,
"items": [
{
"surveyId": "2c4e6a8b-0d1f-4a3c-9e5b-7d9f1b3d5f70",
"conversationId": "a7c2e9f1-3b5d-4e8a-9c1f-6d2b0e4a8c35",
"closedAt": "2026-10-28T14:10:02Z",
"answeredAt": "2026-10-28T14:12:40Z",
"contactName": "Mariana Alves",
"contactIdentity": "5511987654321",
"channelName": "WhatsApp da recepção",
"channelKind": "whatsapp",
"attendantKind": "user",
"attendantName": "Paula Reis",
"groupName": "Recepção",
"status": "answered",
"score": 5,
"comment": "Atendimento rápido!"
}
],
"total": 1,
"limit": 100,
"offset": 0
}Respostas de NPS
/v1/reports/nps/responsesPermissão da chave: Pesquisas · ler
Notas de 0 a 10 de recomendação. category já vem calculada: promoter (9 e 10), passive (7 e 8) ou detractor (0 a 6). Sem from e to, traz os últimos 7 dias.
Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
from | data | Primeiro dia, AAAA-MM-DD (São Paulo). |
to | data | Último dia |
category | texto | Só esta categoria. |
unhandled | texto | 1 para só detratores que ninguém tratou ainda. |
comments | texto | 1 para só respostas com comentário. |
limit | inteiro | Padrão 100 |
offset | inteiro | Quantas pular. |
Respostas
- 200Página de respostas.
- 400Um parâmetro veio em formato inválido.
- 401Chave ausente, revogada ou vencida.
- 403A chave não tem a permissão desta rota.
- 429Passou do limite de chamadas por minuto.
curl "https://api.atende360.ia.br/v1/reports/nps/responses?from=2026-10-01&category=detractor" \
-H "Authorization: Bearer $ATENDE360_API_KEY"const resposta = await fetch("https://api.atende360.ia.br/v1/reports/nps/responses?from=2026-10-01&category=detractor", {
headers: {
Authorization: `Bearer ${process.env.ATENDE360_API_KEY}`,
},
});
const dados = await resposta.json();import os
import requests
resposta = requests.get(
"https://api.atende360.ia.br/v1/reports/nps/responses",
params={
"from": "2026-10-01",
"category": "detractor"
},
headers={"Authorization": f"Bearer {os.environ['ATENDE360_API_KEY']}"},
)
dados = resposta.json(){
"version": 1,
"items": [
{
"surveyId": "8e0a2c4e-6b1d-4f3a-9c5e-1b3d5f7a9c26",
"conversationId": "b2d4f6a8-1c3e-4a5b-8d7f-9e0c2a4b6d81",
"closedAt": "2026-10-26T19:00:41Z",
"answeredAt": "2026-10-26T19:03:11Z",
"contactName": "João Pereira",
"contactIdentity": "5521998877665",
"channelName": "WhatsApp da recepção",
"channelKind": "whatsapp",
"attendantKind": "user",
"attendantName": "Paula Reis",
"groupName": "Recepção",
"status": "answered",
"score": 4,
"category": "detractor",
"comment": "Demorou para responder."
}
],
"total": 1,
"limit": 100,
"offset": 0
}