Conexão do Instagram

Gerencie a mesma conexão da tela Canais pela API.

Use /v1/channel_accounts/{id}/connection. O identificador é o UUID da Conta de canal ou seu external_id do Instagram, obtido em GET /v1/channel_accounts. Todas as operações devolvem { data: ... }; erros usam { error: { code, message } }. Estas rotas exigem o ambiente real.

Consultar estado e diagnóstico

GET exige numbers:read e lê o estado salvo, sem consultar a Meta. Nunca retorna token, segredo ou identificador do Vault.

Consultar a conexão do Instagram

curl https://botozap.com.br/api/v1/channel_accounts/5b0a9d0e-6e1a-4f3b-8c2d-1a9f6e0b7c11/connection \
  -H "X-API-Key: $BOTOZAP_KEY"

Resposta 200

{
  "data": {
    "status": "active",
    "username": "loja_exemplo",
    "subscribed_at": "2026-07-14T12:00:00.000Z",
    "token_expires_at": "2026-07-14T12:00:00.000Z",
    "revoked_reason": null,
    "health": "conectado",
    "subscribed_fields": [
      "messages",
      "messaging_seen",
      "message_reactions",
      "messaging_postbacks",
      "messaging_referral",
      "comments"
    ],
    "diagnostic": {
      "code": "conectado",
      "message": "Conectado",
      "next_step": "Mande um direct de outro perfil e confira a conversa na Inbox.",
      "help_url": "/ajuda/comece-aqui/conectar-instagram"
    }
  }
}

Lê o estado local, sem consultar a Meta e sem expor tokens. Aceita UUID da Conta de canal ou external_id.

CampoConteúdo
statuspending, active, error ou revoked.
usernameNome de usuário ou null.
subscribed_atÚltima confirmação local de assinatura, ou null.
token_expires_atValidade da autorização, ou null quando não registrada.
revoked_reasondashboard para desconexão solicitada, meta_deauthorize para acesso removido no Instagram; null quando não registrado.
healthA mesma Saúde da tela Canais: conectado, pendente, reconexao_necessaria ou revogado. Revogação pela Meta pede reconexão; ativa sem assinatura fica pendente.
subscribed_fieldsCampos configurados pelo BotoZap quando a conexão está ativa e tem assinatura confirmada; lista vazia nos demais casos. É um retrato local, sem inspeção atual na Meta.
diagnosticcode acompanha health; message traz o rótulo da tela, next_step orienta a ação e help_url leva ao guia. Um estado pendente não comprova a causa da falha.

Refazer a assinatura

POST em /connection/resubscribe, sem corpo, exige numbers:write. Usa a autorização existente para assinar os webhooks na Meta. Devolve o estado confirmado. Conta revogada ou com erro precisa de reconexão pelo navegador; esta operação não renova sua autorização.

Refazer a assinatura do Instagram

curl https://botozap.com.br/api/v1/channel_accounts/5b0a9d0e-6e1a-4f3b-8c2d-1a9f6e0b7c11/connection/resubscribe \
  -X POST \
  -H "X-API-Key: $BOTOZAP_KEY"

Resposta 200

{
  "data": {
    "status": "active",
    "username": "loja_exemplo",
    "subscribed_at": "2026-07-14T12:00:00.000Z",
    "token_expires_at": "2026-07-14T12:00:00.000Z",
    "revoked_reason": null,
    "health": "conectado",
    "subscribed_fields": [
      "messages",
      "messaging_seen",
      "message_reactions",
      "messaging_postbacks",
      "messaging_referral",
      "comments"
    ],
    "diagnostic": {
      "code": "conectado",
      "message": "Conectado",
      "next_step": "Mande um direct de outro perfil e confira a conversa na Inbox.",
      "help_url": "/ajuda/comece-aqui/conectar-instagram"
    }
  }
}

Sem corpo. Refaz a assinatura na Meta e retorna o novo estado. Não substitui a reconexão pelo navegador.

Desconectar

DELETE, sem corpo, exige chave de API com numbers:write. No painel, a mesma ação exige Administrador; qualquer membro pode consultar e refazer a assinatura. Tokens OAuth delegados podem consultar e reassinar, mas não desconectar. A revogação remove o token local e registra a auditoria atomicamente. O histórico de mensagens e conversas permanece. Repetir DELETE devolve o estado atual, sem duplicar a revogação.

Desconectar o Instagram

curl https://botozap.com.br/api/v1/channel_accounts/5b0a9d0e-6e1a-4f3b-8c2d-1a9f6e0b7c11/connection \
  -X DELETE \
  -H "X-API-Key: $BOTOZAP_KEY"

Resposta 200

{
  "data": {
    "status": "revoked",
    "username": "loja_exemplo",
    "subscribed_at": "2026-07-14T12:00:00.000Z",
    "token_expires_at": "2026-07-14T12:00:00.000Z",
    "revoked_reason": "dashboard",
    "health": "revogado",
    "subscribed_fields": [],
    "diagnostic": {
      "code": "revogado",
      "message": "Revogado",
      "next_step": "Para voltar a receber directs, conecte novamente pelo login do Instagram no navegador.",
      "help_url": "/ajuda/comece-aqui/conectar-instagram"
    }
  }
}

Idempotente: preserva histórico e remove a autorização local. Exige chave de API; tokens OAuth delegados não podem desconectar.

Erros

403 indica escopo ausente, ambiente sandbox ou delegação OAuth sem permissão. 404 not_found cobre recurso inexistente ou de outra conta. 422 invalid_channel indica canal diferente de Instagram. Falhas de leitura ou gravação respondem 500 internal_error.

Ao reassinar, 409 token_missing ou connection_not_pending pede reconexão. 409 instagram_limit, free_cap ou capacity_required indica capacidade do negócio ou plano. 502 subscription_failed significa que a Meta não confirmou a assinatura: confira o acesso a mensagens e tente novamente. A resposta não expõe o erro bruto da Meta.

Conectar e reconectar

O login precisa do navegador. Use a tela Canais ou gere um Setup Link para o cliente com POST /v1/customers/{id}/setup_links e channel: "instagram": cada link conecta um canal, e a url desse link abre a página do Instagram, onde o cliente confirma os pré-requisitos e entra com a conta profissional. Não envie senhas ou tokens do Instagram nesta API.

Gerar um link de setup do Instagram

Cria o link que o cliente abre para conectar o Instagram da empresa pelo login do Instagram, sem compartilhar senha com você.

curl https://botozap.com.br/api/v1/customers/5b0a9d0e-6e1a-4f3b-8c2d-1a9f6e0b7c11/setup_links \
  -X POST \
  -H "X-API-Key: $BOTOZAP_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "channel": "instagram",
  "success_redirect_url": "https://exemplo-integracao.com.br/onboarding/ok"
}'

Resposta 201

{
  "data": {
    "id": "5b0a9d0e-6e1a-4f3b-8c2d-1a9f6e0b7c11",
    "channel": "instagram",
    "status": "active",
    "whatsapp_setup_status": "pending",
    "url": "https://botozap.com.br/instagram/setup/...",
    "allowed_connection_types": [],
    "language": null,
    "success_redirect_url": "https://exemplo-integracao.com.br/onboarding/ok",
    "failure_redirect_url": null,
    "theme_config": null,
    "expires_at": "2026-07-14T12:00:00.000Z",
    "created_at": "2026-07-14T12:00:00.000Z",
    "updated_at": "2026-07-14T12:00:00.000Z"
  }
}

Cada link conecta um canal. Na página do link do Instagram, o cliente confirma que a conta é profissional e que as mensagens estão liberadas e entra com a conta do Instagram da empresa.

Este link não aceita `allowed_connection_types`: enviar a lista responde `422 invalid_connection_types`, e a resposta volta com a lista vazia.

`whatsapp_setup_status` é o andamento do link em qualquer canal: passa a `completed` quando a conta conecta. Com `success_redirect_url`, o cliente vai para ela com `setup_link_id` e `status=completed`; nas falhas, a página oferece voltar para a `failure_redirect_url` com `status=cancelled`.

Um Cliente aceita uma conta do Instagram. Recusas de capacidade aparecem na página do link, que pede ao cliente para avisar quem enviou.