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.

https://api.atende360.ia.br/v1 Baixar openapi.yaml Criar uma chave no console

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.

BASEhttps://api.atende360.ia.br/v1

Comece em três passos

  1. No console, abra Administração › Chaves de API e clique em Nova chave.
  2. Escolha as permissões e copie a chave. Ela aparece uma única vez.
  3. Chame GET /v1/me com 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-DD no 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.
Teste a chave
curl https://api.atende360.ia.br/v1/me \
  -H "Authorization: Bearer $ATENDE360_API_KEY"
Resposta 200
{
  "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”.
StatuscodeQuando
401api_key_invalidChave ausente, inexistente, revogada ou vencida.
403permission_deniedA chave não tem a permissão que a rota pede. A mensagem diz qual.
403ip_not_allowedA chave tem lista de IPs e a chamada veio de outro.
403route_not_allowedA rota existe, mas não faz parte da API pública.
403tenant_billing_blockedA conta está bloqueada pela cobrança: só leituras passam.
Cabeçalho
GET /v1/contacts HTTP/1.1
Host: api.atende360.ia.br
Authorization: Bearer a360_Pk2v…9fQa
Resposta 401
{
  "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.

StatuscodeQuando
400invalid_requestUm parâmetro ou o corpo veio em formato inválido.
401api_key_invalidVeja Autenticação.
403permission_deniedFalta permissão à chave.
404resource_not_foundO registro não existe nesta conta.
409resource_conflictA mudança não vale no estado atual, como iniciar uma campanha encerrada.
412revision_mismatchAlguém alterou o registro antes. Leia de novo e repita.
422validation_failedAlgum campo veio errado. Veja fields.
428revision_requiredFaltou o cabeçalho If-Match.
429rate_limitedPassou do limite por minuto. Veja Limites de uso.
5xxErro do nosso lado. Pode repetir depois de alguns segundos.
Resposta 422
{
  "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.

Resposta 429
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 o limit ao offset até passar do total.
  • Cursor (ligações): repita a chamada com before_started_at e before_id do último item recebido. Quando vier uma página menor que o limit, acabou.

O cursor não perde nem repete ligações quando chegam ligações novas no meio da leitura.

Próxima página de ligações
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.

Resposta 412
{
  "code": "revision_mismatch",
  "message": "resource changed; reload before saving"
}

Conta

Ver a chave em uso

GET/v1/me

Permissã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()
Resposta 200
{
  "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

GET/v1/contacts

Permissã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âmetroTipoDescrição
qtextoBusca por nome
tagtextoSó contatos com esta etiqueta.
limitinteiroQuantos trazer. Padrão 50
offsetinteiroQuantos 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()
Resposta 200
{
  "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

POST/v1/contacts

Permissã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

CampoTipoDescrição
nameobrigatóriotextoNome do contato.
kindtextoPessoa ou empresa. Valores: person, company.
documenttextoCPF ou CNPJ.
companytextoEmpresa do contato.
tagslista de textoEtiquetas.
notestextoObservações internas.
identitieslistaFormas de contato. O telefone vai no formato internacional, como +5511987654321.
identities[].kindobrigatóriotexto Valores: phone, email, telegram, site, instagram, facebook.
identities[].valueobrigatóriotexto
identities[].labeltextoRó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()
Resposta 201
{
  "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

GET/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âmetroTipoDescrição
idobrigatóriouuidIdentificador 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()
Resposta 200
{
  "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

PUT/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âmetroTipoDescrição
idobrigatóriouuidIdentificador do registro.
If-MatchobrigatóriotextoRevisão atual entre aspas, como "4". Vem no ETag e no campo revision.

Corpo da requisição

CampoTipoDescrição
nameobrigatóriotextoNome do contato.
kindtextoPessoa ou empresa. Valores: person, company.
documenttextoCPF ou CNPJ.
companytextoEmpresa do contato.
tagslista de textoEtiquetas.
notestextoObservações internas.
identitieslistaFormas de contato. O telefone vai no formato internacional, como +5511987654321.
identities[].kindobrigatóriotexto Valores: phone, email, telegram, site, instagram, facebook.
identities[].valueobrigatóriotexto
identities[].labeltextoRó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()
Resposta 200
{
  "contact": {
    "id": "c8d1e0a4-2b7f-4e8e-9d1c-6a5b4f3e2d10",
    "name": "Mariana Alves Souza",
    "revision": 5
  },
  "linkedHistory": 0
}

Histórico do contato

GET/v1/contacts/{id}/attendances

Permissã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âmetroTipoDescrição
idobrigatóriouuidIdentificador do registro.
channeltextoSó um canal: voice, whatsapp, telegram, site ou email.
fromdata e horaInício, em RFC 3339 (2026-10-01T00:00:00-03:00).
todata e horaFim

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()
Resposta 200
{
  "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

GET/v1/campaigns

Permissã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()
Resposta 200
{
  "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

GET/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âmetroTipoDescrição
idobrigatóriouuidIdentificador 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()
Resposta 200
{
  "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

GET/v1/campaigns/{id}/contacts

Permissã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âmetroTipoDescrição
idobrigatóriouuidIdentificador do registro.
statustextoSó contatos nesta situação.
searchtextoBusca por nome
limitinteiroPadrão 50
offsetinteiroQuantos 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()
Resposta 200
{
  "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

POST/v1/campaigns/{id}/contacts

Permissã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âmetroTipoDescrição
idobrigatóriouuidIdentificador do registro.

Corpo da requisição

CampoTipoDescrição
contactsobrigatóriolistaContatos a incluir.
contacts[].phoneobrigatóriotextoTelefone com DDD; aceita +55 na frente.
contacts[].nametextoNome
contacts[].documenttextoCPF ou CNPJ.
contacts[].customerCodetextoCódigo do cliente no seu sistema.
contacts[].extraobjetoCampos livres
contacts[].priorityinteiroMaior 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()
Resposta 200
{
  "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

POST/v1/campaigns/{id}/start

Permissã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âmetroTipoDescrição
idobrigatóriouuidIdentificador do registro.
If-MatchobrigatóriotextoRevisã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()
Resposta 200
{
  "id": "7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47",
  "name": "Retorno de exames",
  "status": "running",
  "revision": 8
}

Pausar campanha

POST/v1/campaigns/{id}/pause

Permissã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âmetroTipoDescrição
idobrigatóriouuidIdentificador do registro.
If-MatchobrigatóriotextoRevisã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()
Resposta 200
{
  "id": "7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47",
  "name": "Retorno de exames",
  "status": "running",
  "revision": 8
}

Encerrar campanha

POST/v1/campaigns/{id}/stop

Permissã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âmetroTipoDescrição
idobrigatóriouuidIdentificador do registro.
If-MatchobrigatóriotextoRevisã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()
Resposta 200
{
  "id": "7d3e9b20-4c1a-4f6e-9b8d-2a5c0e1f3b47",
  "name": "Retorno de exames",
  "status": "running",
  "revision": 8
}

Ligações

Listar ligações

GET/v1/conversations

Permissã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âmetroTipoDescrição
date_fromdataPrimeiro dia, AAAA-MM-DD, no fuso de São Paulo. Vai junto com date_to.
date_todataÚltimo dia, AAAA-MM-DD. Vai junto com date_from.
phonetextoNúmero do cliente.
directiontextoinbound (recebida) ou outbound (feita).
campaign_iduuidSó ligações desta campanha.
protocoltextoProtocolo do atendimento.
limitinteiroPadrão 50
before_started_atdata e horaCursor: startedAt do último item, em RFC 3339.
before_iduuidCursor: 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()
Resposta 200
{
  "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

GET/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âmetroTipoDescrição
idobrigatóriouuidIdentificador 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()
Resposta 200
{
  "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

GET/v1/conversations/{id}/recording-url

Permissã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âmetroTipoDescrição
idobrigatóriouuidIdentificador 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()
Resposta 200
{
  "url": "https://storage.example.com/gravacoes/9a1c4e7f.wav?X-Amz-Expires=900&X-Amz-Signature=3b1f…"
}

Atendimentos digitais

Listar atendimentos

GET/v1/digital/conversations

Permissã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âmetroTipoDescrição
statustextoUma ou mais situações separadas por vírgula: bot, queued, assigned, closed.
channelIduuidSó conversas deste canal.
searchtextoBusca por nome
limitinteiroQuantas 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()
Resposta 200
{
  "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

GET/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âmetroTipoDescrição
idobrigatóriouuidIdentificador do registro.
limitinteiroMensagens 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()
Resposta 200
{
  "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

GET/v1/reports/csat/responses

Permissã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âmetroTipoDescrição
fromdataPrimeiro dia, AAAA-MM-DD (São Paulo).
todataÚltimo dia
scoretextoUma nota (1 a 5) ou uma faixa: low (1–2), mid (3), high (4–5).
commentstexto1 para só respostas com comentário.
channel_iduuidSó este canal.
limitinteiroPadrão 100
offsetinteiroQuantas 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()
Resposta 200
{
  "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

GET/v1/reports/nps/responses

Permissã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âmetroTipoDescrição
fromdataPrimeiro dia, AAAA-MM-DD (São Paulo).
todataÚltimo dia
categorytextoSó esta categoria.
unhandledtexto1 para só detratores que ninguém tratou ainda.
commentstexto1 para só respostas com comentário.
limitinteiroPadrão 100
offsetinteiroQuantas 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()
Resposta 200
{
  "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
}