Referência técnica

API do Starchats

As quatro superfícies da API, seus mecanismos de autenticação, modelos, webhooks, limites de requisição e exemplos de integração.

release/v2.6.0-star
Começar

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.

API de Aplicação

Conversas, contatos, caixas, equipe, relatórios e administração.

/api/v1/accounts/{account_id}
API de Plataforma

Criação e gestão externa de contas e usuários.

/platform/api/v1
Canal API pública

Crie contatos, conversas e mensagens em um canal próprio.

/public/api/v1/inboxes/{inbox_identifier}
API do Widget

Uso interno do widget com website token e sessão JWT.

/api/v1/widget

Relatórios também possuem rotas em /api/v2/accounts/{account_id}/reports, com a mesma autenticação da API de Aplicação.

Começar

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:

  1. No painel: abra a conta e observe a URL. Em /app/accounts/123/..., o {account_id} é 123.
  2. Pela API: consulte o perfil autenticado. O array accounts retorna o campo id de cada conta acessível ao token.
GET/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.

PlaceholderSignificadoComo obter
{conversation_id}ID da conversaGET /api/v1/accounts/{account_id}/conversations
{contact_id}ID do contatoGET /api/v1/accounts/{account_id}/contacts
{company_id}ID da empresaGET /api/v1/accounts/{account_id}/companies
{inbox_id}ID numérico da caixaGET /api/v1/accounts/{account_id}/inboxes
{agent_id}ID do agenteGET /api/v1/accounts/{account_id}/agents
{team_id}ID do timeGET /api/v1/accounts/{account_id}/teams
{assistant_id}ID do assistente CosmosGET /api/v1/accounts/{account_id}/cosmos/assistants
{copilot_thread_id}ID da thread do copilotoGET /api/v1/accounts/{account_id}/cosmos/copilot_threads
{protocol_id}ID do protocoloGET /api/v1/accounts/{account_id}/protocols
{campaign_id}ID da campanhaGET /api/v1/accounts/{account_id}/campaigns
{portal_id}ID do portalGET /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.

Começar

Autenticação

Há três mecanismos principais. Eles não são intercambiáveis: escolha a credencial da superfície que será consumida.

MecanismoOnde é usadoFormato
api_access_tokenAplicação e bots; Plataforma usa um token próprio de Platform AppHeader com token opaco
inbox_identifierCanal API públicaParte da URL; trate como segredo
website_token + X-Auth-TokenWidgetIdentificador 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.

Autenticaçã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.

GET/api/v1/accounts/{account_id}/conversations
curl -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.

POST/api/v1/profile/reset_access_token

O 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.

Autenticação

Sessão, login e MFA

POST/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.

Autenticação

Tokens de Agent Bot

Bots usam o mesmo header api_access_token, porém só acessam ações autorizadas explicitamente.

RecursoAções liberadas
Conversasshow, create, update, status, digitação, prioridade e atributos personalizados
Mensagenscreate
Atribuiçõescreate
Etiquetas da conversaindex, 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.

Superfícies

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.

/api/v1/accounts/{account_id}/...

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'
Superfícies

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.

/platform/api/v1/...

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.

Superfícies

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.

/public/api/v1/inboxes/{inbox_identifier}/...

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.

Superfícies

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.

/api/v1/widget/...

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.

Operação

Webhooks de saída

POST/api/v1/accounts/{account_id}/webhooks

A 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_triggered

Assinatura HMAC

HeaderConteúdo
X-Starchats-DeliveryIdentificador único para idempotência
X-Starchats-TimestampUnix timestamp da assinatura
X-Starchats-Signaturesha256=<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.

Operação

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çãoLimiteJanela
Login por IP55 minutos
Login por e-mail1015 minutos
Verificação MFA por IP51 minuto
Login MFA por IP ou token101 minuto
Reset de senha por IP530 minutos
Reset de senha por e-mail51 hora
Criação de conta por IP530 minutos

API de Aplicação

RotaLimite padrãoJanela
POST /upload601 hora
GET /contacts/search1001 minuto
Transcrição de conversa1.0001 hora
Excluir conversa601 minuto
Criar agente1001 dia
Excluir agente501 dia
conversations/meta301 minuto
Relatórios por conta1.0001 minuto
Relatórios por usuário1001 minuto

Widget

RotaLimiteJanela
Criar conversa301 minuto
Criar mensagem601 minuto
Atualizar contato601 hora
Carga inicial2001 hora
Enviar transcrição51 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.

Operação

Respostas e paginação

StatusSignificado
206MFA pendente
401Falha de autenticação ou rota não permitida ao bot
403API desabilitada ou permissão negada
404Registro inexistente
409Limite de sessões no navegador
422Erro de validação do modelo
429Rate 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.

Operação

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"}'
Checklist

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_identifier como 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.
Continuar na documentação
Consulte os guias de configuração e operação.
Todos os guias →