Pular para o conteúdo
NovoVeja como

Playbook de RevOps: automatize o outbound com chaves de API, a CLI e CSV

Gere chaves de API com escopo, importe e sincronize contatos programaticamente, conduza campanhas pela CLI, integre ao CI/CD e monitore o uso de chaves e o runway de créditos — usando a API REST e CSV, a superfície disponível hoje.

  1. Enquadre a superfície automatizável (e o que ainda não é)

    O que já está disponível hoje: a REST API, a CLI e a importação/exportação de contatos em CSV/JSON. O que não está: webhooks, conectores de CRM (Salesforce, HubSpot, Zoho, Pipedrive) e conectores Slack/Teams/Sheets/Airtable/Notion (todos em breve e retornam unsupported_operation se você tentar chamá-los. Construa a automação sobre a superfície ativa) faça polling e exporte via REST/CSV em vez de esperar por um conector.

  2. Crie uma API key de privilégio mínimo

    Vá em Settings → API e crie uma chave nomeada por consumidor: por exemplo, ci-contact-sync: apenas com os escopos necessários (contacts:read/write, campaigns:read, etc.). A chave é exibida uma única vez; copie-a direto para um gerenciador de segredos. Revogue imediatamente se ela vazar: a revogação é instantânea. Veja Create & Manage Developer API Keys.

    Crie uma API key de privilégio mínimo
  3. Instale e verifique a CLI

    Instale a CLI e confirme que a chave é resolvida antes de fazer qualquer outra coisa:

    npm install -g @firstsales.io/cli
    export FIRSTSALES_API_KEY="fs_live_..."   # from your secret manager
    firstsales whoami --json
    firstsales doctor
  4. Importe contatos programaticamente de um CSV

    Envie um lote por meio de um job de importação com uma chave de idempotência: a plataforma deduplica por e-mail no lado do servidor, então reexecutar o mesmo arquivo não duplica ninguém:

    firstsales contact-imports create --org "$ORG_ID" --workspace "$WS_ID" \
      --data-file ./leads.csv \
      --idempotency-key "leads-import-2026-07"
  5. Mantenha os contatos sincronizados: o ciclo de ouro

    A automação segue o mesmo ciclo de um operador humano: inspecionar, depois alterar deliberadamente, depois verificar. Faça uma prévia com --dry-run antes de qualquer escrita, altere com uma chave de idempotência e depois releia para confirmar:

    firstsales contacts list --org "$ORG_ID" --workspace "$WS_ID" --json
    firstsales contacts update --org "$ORG_ID" --workspace "$WS_ID" \
      --contact "$CONTACT_ID" --data '{"job_title":"VP Sales"}' --dry-run
    firstsales contacts update --org "$ORG_ID" --workspace "$WS_ID" \
      --contact "$CONTACT_ID" --data '{"job_title":"VP Sales"}'
    firstsales contacts get --org "$ORG_ID" --workspace "$WS_ID" --contact "$CONTACT_ID"
  6. Conduza campanhas pela CLI ou pela API

    Liste e leia campanhas pela CLI, ou acesse /api/v1 diretamente com um token Bearer quando preferir não usar a CLI:

    firstsales campaigns list --org "$ORG_ID" --workspace "$WS_ID" --json
    
    curl https://api.app.firstsales.io/api/v1/organizations/$ORG_ID/workspaces/$WS_ID/campaigns/$CAMPAIGN_ID/analytics \
      -H "Authorization: Bearer $FIRSTSALES_API_KEY"
  7. Integre ao CI/CD

    Injete a chave a partir do armazenamento de segredos do seu provedor de CI, nunca a fixe no código. Comece cada job com whoami para que uma chave inválida falhe rápido, e proteja as escritas reais com --dry-run nos PRs versus alteração real na main, com chaves de idempotência derivadas de uma variável estável do CI para que a repetição de um pipeline seja um no-op:

    # GitHub Actions
    - name: FirstSales sync
      env:
        FIRSTSALES_API_KEY: ${{ secrets.FIRSTSALES_API_KEY }}
      run: |
        firstsales whoami --json > /dev/null || { echo "auth failed"; exit 1; }
        firstsales contact-imports create --org "$ORG_ID" --workspace "$WS_ID" \
          --data-file ./leads.csv --idempotency-key "import-${GITHUB_SHA}"
  8. Monitore o uso e a margem de créditos

    Acompanhe uso/logs da API key em Settings → API e o saldo de créditos do org em Billing para que um pipeline automatizado nunca deixe o org sem créditos silenciosamente. Veja Credits, Plans & Billing e Read Campaign Analytics.

Dicas de especialista

  • Uma chave com escopo por consumidor

    CI, seu laptop e cada integração recebem sua própria chave nomeada: se uma vazar ou for aposentada, você revoga só ela, não tudo.

  • Chaves de idempotência são um seguro grátis

    Toda criação automatizada carrega --idempotency-key para que uma etapa de pipeline reexecutada seja um no-op, não um registro duplicado.

  • Não construa sobre conectores em breve

    Webhooks, CRM, Slack e conectores do Sheets retornam unsupported_operation hoje: faça polling ou exporte via REST + CSV em vez de esperar por eles.

  • Inspecione, dry-run, altere, verifique: também em scripts

    O mesmo ciclo que protege um operador humano protege um agente. Sempre use --dry-run antes de qualquer escrita na automação, não só interativamente.

Perguntas frequentes

O que posso realmente automatizar hoje?

A REST API, a CLI e a importação/exportação de contatos em CSV/JSON, todas autenticadas com Developer API keys com escopo.

Há webhooks, CRM ou integrações com Slack?

Ainda não: webhooks, conectores de CRM (Salesforce, HubSpot, Zoho, Pipedrive) e conectores Slack/Teams/Sheets/Airtable/Notion estão em breve e retornam unsupported_operation. Não construa automação que dependa deles.

Como importo contatos programaticamente?

contact-imports create --data-file com um arquivo CSV ou JSON. Os contatos são deduplicados por e-mail no lado do servidor, então reexecutar a mesma importação é seguro.

Como funciona a autenticação no CI?

Armazene a Developer API key no armazenamento de segredos do seu provedor de CI e exponha-a como FIRSTSALES_API_KEY. Para HTTP puro, envie-a como um token Bearer.

Como evito escritas duplicadas em um pipeline?

Passe --idempotency-key (ou o header Idempotency-Key no HTTP puro) derivado de um valor estável como um SHA de commit: uma etapa reexecutada vira um no-op em vez de um duplicado.

Como evito que um delete apague dados no CI?

Comandos destrutivos da CLI exigem --confirm: mantenha-o fora de qualquer etapa que não deva excluir, para que um job de limpeza só remova dados quando a flag estiver explicitamente presente.

Como acompanho uso e margem de créditos?

Verifique o uso/logs da API key em Settings → API e o saldo de créditos do org em Billing para que um pipeline automatizado não te deixe sem créditos silenciosamente.

CLI ou API pura?

A CLI é um wrapper leve sobre a mesma superfície pública /api/v1. Ambas funcionam: a CLI adiciona tratamento de autenticação, idempotência e saída em JSON convenientes para scripts e agentes.

Primeiros Passos

Prospecção que continua quando você desconecta.Leads, emails, follow-ups e respostas, resolvidos.

Conecte caixas ilimitadas e deixe os agentes de IA encontrarem leads, escreverem cada email e fazerem follow-up. Ou envie seus próprios modelos no modo manual. A partir de $29/mês.

$1 por 3 dias · Cancele quando quiser · Sem contrato

Instalar com IA

Seu agente de código configura a CLI e as skills do FirstSales para você.

Prompt para Claude Code

I'm setting up FirstSales (https://firstsales.io), an AI outbound sales platform: campaigns, contacts, a reply inbox, deliverability and lead signals. Help me get my workspace sending real, good emails end to end, from Claude Code.

Read these first so you know how FirstSales works:
- Developer docs and API: https://developer.firstsales.io
- CLI: https://www.npmjs.com/package/@firstsales.io/cli
- Skills for coding agents: https://github.com/firstsalesio/firstsales-skills (read README.md and GUIDE.md)

Setup
1. Install the CLI: npm install -g @firstsales.io/cli
2. Install the FirstSales skills:
   claude plugin marketplace add firstsalesio/firstsales-skills
   claude plugin install firstsales@firstsales
3. Ask me if I already have a FirstSales account. If not, send me to https://app.firstsales.io to sign up.
4. Ask me to create an API key under Settings → API → API Keys, with only the scopes we need.
   Never ask me to paste the key into this chat. Tell me to run this in my own terminal, so the key stays hidden:
   read -rs FS_KEY && firstsales auth login --api-key "$FS_KEY"; unset FS_KEY
5. Run `firstsales whoami` and tell me which workspace and organisation we are connected to.

Then ask me about my business: what I sell, who I sell to (roles, company size, countries), my best customers, and what I use today for outbound (tools, lists, mailboxes). Walk me through:
1. Teaching FirstSales my business: website, offer, proof points and case studies in the knowledge base, so the AI writes like someone who knows the product.
2. Connecting my sending mailboxes and checking my sending domain: SPF, DKIM, DMARC and warm-up. If anything is unhealthy, tell me the exact DNS record to add.
3. Bringing in contacts: import my CSV or CRM export into a clean list, remove duplicates and bad emails, and block domains I must never email (customers, competitors, my own).
4. Building my first campaign: the right list, senders, steps and timing. Write the sequence with me, show me the drafts, and do not launch until I say yes.
5. Setting up Signals if it fits: find people engaging with LinkedIn posts about topics my buyers care about, and turn them into leads.
6. Inviting my team and giving each person the right access.

Once campaigns run, show me how to work the reply inbox from here: which replies need an answer, draft responses in my voice, and move good conversations into deals. If I use Cal.com, connect it so follow-ups can offer my booking link (not the first email).

Throughout, as you learn about my business, proactively suggest and help create:
- Reply templates for the questions and objections my prospects are likely to raise, based on my product, site and codebase if you can see them.
- Campaign ideas and segments worth testing, with the reason for each.

Safety rules:
- Show every change as a dry run (--dry-run) first and wait for my yes. Never send emails, launch campaigns or delete anything without my yes.
- Tell me before anything that spends credits, and how many.

Be opinionated. If the docs give a sensible default, just use it. Don't make me choose between five options.