Visão geral
O Starchats expõe quatro APIs com objetivos e credenciais diferentes. A API de Aplicação atende a maior parte das integrações. Plataforma administra contas externamente, Canal API cria canais próprios e Widget sustenta o chat do site.
Consulte esta referência junto ao OpenAPI. O esquema servido em /swagger e /doc ainda não cobre protocolos, fluxos, Evolution, Cosmos e empresas.
Conversas, contatos, caixas, equipe, relatórios e administração.
/api/v1/accounts/{account_id}Criação e gestão externa de contas e usuários.
/platform/api/v1Crie contatos, conversas e mensagens em um canal próprio.
/public/api/v1/inboxes/{inbox_identifier}Uso interno do widget com website token e sessão JWT.
/api/v1/widgetRelatórios também possuem rotas em /api/v2/accounts/{account_id}/reports, com a mesma autenticação da API de Aplicação.
Como obter IDs e substituir placeholders
Todo texto entre chaves é um placeholder. Em /accounts/{account_id}/conversations/{conversation_id}, substitua {account_id} pelo ID da sua conta e {conversation_id} pelo ID da conversa. Não envie os caracteres { e }.
Obter o {account_id}
O {account_id} é o identificador numérico da conta, não o ID do usuário. Você pode encontrá-lo de duas formas:
- No painel: abra a conta e observe a URL. Em
/app/accounts/123/..., o{account_id}é123. - Pela API: consulte o perfil autenticado. O array
accountsretorna o campoidde cada conta acessível ao token.
/api/v1/profile{
"id": 7,
"email": "agente@empresa.com.br",
"accounts": [
{ "id": 123, "name": "Minha empresa", "role": "administrator" }
]
}
Nesse exemplo, use 123 no lugar de {account_id}.
Obter IDs dos recursos
Liste ou crie o recurso e guarde o campo id devolvido no JSON. Todos os exemplos da referência mostram quais placeholders são necessários.
| Placeholder | Significado | Como obter |
|---|---|---|
{conversation_id} | ID da conversa | GET /api/v1/accounts/{account_id}/conversations |
{contact_id} | ID do contato | GET /api/v1/accounts/{account_id}/contacts |
{company_id} | ID da empresa | GET /api/v1/accounts/{account_id}/companies |
{inbox_id} | ID numérico da caixa | GET /api/v1/accounts/{account_id}/inboxes |
{agent_id} | ID do agente | GET /api/v1/accounts/{account_id}/agents |
{team_id} | ID do time | GET /api/v1/accounts/{account_id}/teams |
{assistant_id} | ID do assistente Cosmos | GET /api/v1/accounts/{account_id}/cosmos/assistants |
{copilot_thread_id} | ID da thread do copiloto | GET /api/v1/accounts/{account_id}/cosmos/copilot_threads |
{protocol_id} | ID do protocolo | GET /api/v1/accounts/{account_id}/protocols |
{campaign_id} | ID da campanha | GET /api/v1/accounts/{account_id}/campaigns |
{portal_id} | ID do portal | GET /api/v1/accounts/{account_id}/portals |
Identificadores da Canal API
{inbox_identifier} não é igual a {inbox_id}. Ele identifica e autentica uma caixa do tipo API e aparece na configuração dessa caixa. Trate-o como segredo. Já {source_id} é retornado ao criar um contato pela Canal API e identifica aquele contato dentro da caixa.
Autenticação
Há três mecanismos principais. Eles não são intercambiáveis: escolha a credencial da superfície que será consumida.
| Mecanismo | Onde é usado | Formato |
|---|---|---|
api_access_token | Aplicação e bots; Plataforma usa um token próprio de Platform App | Header com token opaco |
inbox_identifier | Canal API pública | Parte da URL; trate como segredo |
website_token + X-Auth-Token | Widget | Identificador do site e JWT de sessão |
A API está habilitada por padrão em todas as contas. Uma resposta 403 com “API access is not enabled for this account” só deve aparecer se essa regra for alterada na instalação.
Token de API
api_access_token é um token opaco de longa duração associado a um usuário ou Agent Bot. Não é JWT e não usa o esquema Bearer.
/api/v1/accounts/{account_id}/conversationscurl -sS 'https://SEU_DOMINIO/api/v1/accounts/{account_id}/conversations' \
-H 'api_access_token: SEU_TOKEN'
Não use Authorization: Bearer. O header aceito é exatamente api_access_token.
Obter e rotacionar
O usuário encontra a credencial em Perfil › Configurações do perfil › Token de acesso. Também pode rotacioná-la pelo endpoint abaixo; o token anterior é invalidado imediatamente.
/api/v1/profile/reset_access_tokenO token herda todas as permissões do usuário em todas as contas das quais ele participa. Não existe escopo nativo por conta ou recurso. Para integrações, crie um usuário dedicado com função personalizada restrita.
Sessão, login e MFA
/auth/sign_in{ "email": "agente@empresa.com.br", "password": "..." }
Sem MFA, a resposta é 200. O corpo inclui access_token, o token permanente de API; os headers trazem a sessão do dashboard:
access-token: <token de sessão>
client: <id do dispositivo>
uid: <e-mail>
expiry: <timestamp>
Atenção ao nome: access-token com hífen é a sessão, expira em dois meses; access_token com underline no corpo é o token permanente para integração.
Segunda etapa do MFA
Com MFA, a primeira resposta é 206 Partial Content e contém um JWT HS256 válido por cinco minutos:
{ "mfa_required": true, "mfa_token": "eyJhbGciOiJIUzI1NiJ9..." }
Envie no mesmo endpoint o mfa_token com otp_code ou backup_code. O JWT de MFA não autentica endpoints da API.
Cada usuário pode manter até 25 sessões. Clientes não navegador expulsam a sessão mais antiga ao alcançar o limite; o dashboard recebe 409 para escolher uma sessão a encerrar.
Tokens de Agent Bot
Bots usam o mesmo header api_access_token, porém só acessam ações autorizadas explicitamente.
| Recurso | Ações liberadas |
|---|---|
| Conversas | show, create, update, status, digitação, prioridade e atributos personalizados |
| Mensagens | create |
| Atribuições | create |
| Etiquetas da conversa | index, create |
Qualquer outra ação retorna 401 com “Access to this endpoint is not authorized for bots”. O token só aparece ao listar bots para um administrador.
API de Aplicação
É a superfície principal do produto. Todos os recursos vivem sob o prefixo da conta e aceitam api_access_token ou a sessão usada pelo dashboard.
O token precisa pertencer a um usuário membro da conta indicada, com permissão para a ação. Para conferir verbos, caminhos e parâmetros exatos da versão instalada:
bundle exec rails routes | grep 'api/v1/accounts'
API de Plataforma
Permite criar e administrar contas e usuários a partir de um sistema externo. Autentique com o api_access_token de um Platform App, criado somente pelo super administrador em /super_admin/platform_apps.
O app só pode acessar recursos presentes em platform_app_permissibles. Fora dessa lista, a API retorna 401 com “Non permissible resource”. Recursos criados pelo próprio app entram na lista automaticamente.
Canal API pública
A Canal API não usa header de autenticação. O inbox_identifier na URL é a credencial que permite criar contatos, conversas e mensagens naquela caixa.
Quem conhece o identificador pode escrever na caixa. Não o exponha em repositórios ou logs públicos.
HMAC de identidade
Quando hmac_mandatory está ativo, envie identifier_hash como hexadecimal de:
HMAC-SHA256(hmac_token_da_caixa, identifier)
O servidor usa comparação resistente a timing attacks. Ative essa proteção quando contatos representam usuários autenticados no seu sistema.
API do Widget
Essa API é consumida pelo widget de chat e não foi projetada como interface geral de integração. Ela combina website_token com um JWT de sessão no header X-Auth-Token.
O JWT usa HS256, contém source_id, inbox_id, exp e iat, e vale 180 dias por padrão. A duração pode mudar com WIDGET_TOKEN_EXPIRY.
Trocar SECRET_KEY_BASE invalida sessões de widget, tokens MFA e estados OAuth em andamento.
Webhooks de saída
/api/v1/accounts/{account_id}/webhooksA lista de eventos é fechada. Um nome fora dela falha na validação.
conversation_createdconversation_updatedconversation_status_changedconversation_typing_onconversation_typing_offconversation_sla_breachedmessage_createdmessage_updatedcontact_createdcontact_updatedinbox_createdinbox_updatedwebwidget_triggeredAssinatura HMAC
| Header | Conteúdo |
|---|---|
X-Starchats-Delivery | Identificador único para idempotência |
X-Starchats-Timestamp | Unix timestamp da assinatura |
X-Starchats-Signature | sha256=<hex> |
X-Starchats-Signature = "sha256=" +
HMAC_SHA256(segredo, timestamp + "." + corpo_cru)
Calcule sobre o corpo cru, rejeite timestamps antigos e compare em tempo constante. Não reserialize o JSON antes de validar.
Entregas saem por SafeFetch: URLs privadas, localhost e redirecionamentos para rede interna são bloqueados. Falhas têm três retentativas com espera de três segundos.
Limites de requisição
Exceder um limite retorna 429. O limite global padrão é 3.000 requisições por IP a cada minuto, configurável por RACK_ATTACK_LIMIT.
Autenticação
| Operação | Limite | Janela |
|---|---|---|
| Login por IP | 5 | 5 minutos |
| Login por e-mail | 10 | 15 minutos |
| Verificação MFA por IP | 5 | 1 minuto |
| Login MFA por IP ou token | 10 | 1 minuto |
| Reset de senha por IP | 5 | 30 minutos |
| Reset de senha por e-mail | 5 | 1 hora |
| Criação de conta por IP | 5 | 30 minutos |
API de Aplicação
| Rota | Limite padrão | Janela |
|---|---|---|
POST /upload | 60 | 1 hora |
GET /contacts/search | 100 | 1 minuto |
| Transcrição de conversa | 1.000 | 1 hora |
| Excluir conversa | 60 | 1 minuto |
| Criar agente | 100 | 1 dia |
| Excluir agente | 50 | 1 dia |
conversations/meta | 30 | 1 minuto |
| Relatórios por conta | 1.000 | 1 minuto |
| Relatórios por usuário | 100 | 1 minuto |
Widget
| Rota | Limite | Janela |
|---|---|---|
| Criar conversa | 30 | 1 minuto |
| Criar mensagem | 60 | 1 minuto |
| Atualizar contato | 60 | 1 hora |
| Carga inicial | 200 | 1 hora |
| Enviar transcrição | 5 | 1 hora |
Os dois primeiros limites do widget usam IP + website_token. O bloco pode ser desligado com ENABLE_RACK_ATTACK_WIDGET_API=false. Valores ajustáveis podem diferir na sua instalação.
Respostas e paginação
| Status | Significado |
|---|---|
206 | MFA pendente |
401 | Falha de autenticação ou rota não permitida ao bot |
403 | API desabilitada ou permissão negada |
404 | Registro inexistente |
409 | Limite de sessões no navegador |
422 | Erro de validação do modelo |
429 | Rate limit excedido |
O formato é JSON. A maioria dos índices aceita page, mas o tamanho varia: conversas usam 25, contatos 15 e anexos da conversa 100. Leia os metadados retornados; a contagem pode aparecer em meta ou em headers conforme o recurso.
Exemplos completos
Substitua todos os valores entre chaves pelos IDs reais obtidos nas respostas da API. Por exemplo: {account_id} é o ID da conta e {conversation_id} é o ID da conversa.
Listar conversas abertas
curl -sS 'https://SEU_DOMINIO/api/v1/accounts/{account_id}/conversations?status=open' \
-H 'api_access_token: SEU_TOKEN'
Enviar uma mensagem
curl -sS -X POST \
'https://SEU_DOMINIO/api/v1/accounts/{account_id}/conversations/{conversation_id}/messages' \
-H 'api_access_token: SEU_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"content":"Olá! Como posso ajudar?","message_type":"outgoing","private":false}'
Criar contato, conversa e mensagem pelo Canal API
# 1. Criar contato; guarde o source_id retornado
curl -sS -X POST \
'https://SEU_DOMINIO/public/api/v1/inboxes/{inbox_identifier}/contacts' \
-H 'Content-Type: application/json' \
-d '{"identifier":"cliente-123","name":"Maria","email":"maria@exemplo.com.br"}'
# 2. Criar conversa
curl -sS -X POST \
'https://SEU_DOMINIO/public/api/v1/inboxes/{inbox_identifier}/contacts/{source_id}/conversations' \
-H 'Content-Type: application/json'
# 3. Enviar mensagem
curl -sS -X POST \
'https://SEU_DOMINIO/public/api/v1/inboxes/{inbox_identifier}/contacts/{source_id}/conversations/{conversation_id}/messages' \
-H 'Content-Type: application/json' \
-d '{"content":"Preciso de ajuda"}'
Segurança
- Crie um usuário dedicado e restrito para cada integração; o token de API não possui escopo próprio.
- Trate
inbox_identifiercomo credencial e habilite HMAC de identidade para usuários autenticados. - Valide assinatura, timestamp e identificador de entrega de todos os webhooks.
- Planeje a rotação de
SECRET_KEY_BASE, pois ela encerra widgets e fluxos MFA/OAuth em andamento. - Trocar a senha derruba sessões, mas não invalida
api_access_token; use o endpoint de rotação. - Não grave tokens, corpos sensíveis ou segredos de webhook em logs.
Consulte os guias de configuração e operação.