Saltar al contenido
NuevoVer cómo

Playbook de RevOps: automatiza el outbound con claves de API, la CLI y CSV

Genera claves de API con alcance limitado, importa y sincroniza contactos por programación, maneja campañas desde la CLI, intégralo en CI/CD, y monitorea el uso de claves y el runway de créditos — usando la API REST y CSV, la superficie disponible hoy.

  1. Enmarca la superficie automatizable (y lo que aún no lo es)

    Lo que está en vivo hoy: la REST API, la CLI, y la importación/exportación de contactos en CSV/JSON. Lo que no: los webhooks, los conectores CRM (Salesforce, HubSpot, Zoho, Pipedrive) y los conectores de Slack/Teams/Sheets/Airtable/Notion están todos próximamente y devuelven unsupported_operation si intentas llamarlos. Construye tu automatización sobre la superficie en vivo: haz polling y exporta vía REST/CSV en lugar de esperar un conector.

  2. Genera una API key de mínimo privilegio

    Ve a Settings → API y crea una key nombrada por consumidor: p. ej. ci-contact-sync: con solo los scopes que necesita (contacts:read/write, campaigns:read, etc.). La key se muestra una sola vez; cópiala directo a un gestor de secretos. Revócala de inmediato si alguna vez se filtra: la revocación es instantánea. Consulta Create & Manage Developer API Keys.

    Genera una API key de mínimo privilegio
  3. Instala y verifica la CLI

    Instala la CLI y confirma que la key se resuelve antes de hacer cualquier otra cosa:

    npm install -g @firstsales.io/cli
    export FIRSTSALES_API_KEY="fs_live_..."   # from your secret manager
    firstsales whoami --json
    firstsales doctor
  4. Importa contactos programáticamente desde CSV

    Envía un lote a través de un job de importación con una idempotency key: la plataforma deduplica por correo del lado del servidor, así que reejecutar el mismo archivo no duplicará a nadie:

    firstsales contact-imports create --org "$ORG_ID" --workspace "$WS_ID" \
      --data-file ./leads.csv \
      --idempotency-key "leads-import-2026-07"
  5. Mantén los contactos sincronizados: el bucle de oro

    La automatización sigue el mismo bucle que un operador humano: inspeccionar, luego mutar deliberadamente, luego verificar. Previsualiza con --dry-run antes de cualquier escritura, muta con una idempotency key, luego vuelve a leer 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. Impulsa campañas desde la CLI o la API

    Lista y lee campañas a través de la CLI, o pega directamente a /api/v1 con un Bearer token cuando prefieras no usar la 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. Conéctalo a CI/CD

    Inyecta la key desde el almacén de secretos de tu proveedor de CI, nunca la codifiques directamente. Empieza cada job con whoami para que una key mala falle rápido, y controla las escrituras reales con --dry-run en PRs frente a mutación real en main, con idempotency keys derivadas de una variable de CI estable para que un paso de pipeline repetido sea un 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. Monitorea el uso y la autonomía de créditos

    Vigila el uso/logs de la API key bajo Settings → API y el saldo de créditos del org bajo Billing para que un pipeline automatizado nunca deje al org sin recursos en silencio. Consulta Credits, Plans & Billing y Read Campaign Analytics.

Consejos de experto

  • Una key con scope por consumidor

    CI, tu laptop y cada integración obtienen su propia key nombrada: filtra o retira una y revocas solo esa key, no todo.

  • Las idempotency keys son un seguro gratis

    Cada creación automatizada lleva --idempotency-key para que un paso de pipeline reintentado sea un no-op, no un registro duplicado.

  • No construyas sobre conectores próximamente

    Los webhooks, CRM, Slack y Sheets devuelven unsupported_operation hoy: haz polling o exporta vía REST + CSV en lugar de esperarlos.

  • Inspecciona, dry-run, muta, verifica: también en scripts

    El mismo bucle que protege a un operador humano protege a un agente. Siempre --dry-run antes de cualquier escritura en automatización, no solo interactivamente.

Preguntas frecuentes

¿Qué puedo automatizar realmente hoy?

La REST API, la CLI, y la importación/exportación de contactos en CSV/JSON, todo autenticado con Developer API keys con scope.

¿Hay integraciones de webhooks, CRM o Slack?

Todavía no: los webhooks, los conectores CRM (Salesforce, HubSpot, Zoho, Pipedrive) y los conectores de Slack/Teams/Sheets/Airtable/Notion están próximamente y devuelven unsupported_operation. No construyas automatización que dependa de ellos.

¿Cómo importo contactos programáticamente?

contact-imports create --data-file con un archivo CSV o JSON. Los contactos se deduplican por correo del lado del servidor, así que reejecutar la misma importación es seguro.

¿Cómo funciona la autenticación para CI?

Guarda la Developer API key en el almacén de secretos de tu proveedor de CI y expónla como FIRSTSALES_API_KEY. Para HTTP directo, envíala como un Bearer token.

¿Cómo evito escrituras duplicadas en un pipeline?

Pasa --idempotency-key (o el header Idempotency-Key en HTTP directo) derivada de un valor estable como un commit SHA: un paso reintentado se convierte en un no-op en lugar de un duplicado.

¿Cómo evito que un delete borre datos en CI?

Los comandos destructivos de la CLI requieren --confirm: mantenlo fuera de cualquier paso que no deba borrar, así un job de limpieza solo puede eliminar datos cuando el flag está explícitamente presente.

¿Cómo vigilo el uso y la autonomía de créditos?

Revisa el uso/logs de la API key bajo Settings → API y el saldo de créditos del org bajo Billing para que un pipeline automatizado no te deje sin créditos en silencio.

¿CLI o API directa?

La CLI es un wrapper delgado sobre la misma superficie pública /api/v1. Ambas funcionan: la CLI agrega manejo de autenticación conveniente, idempotencia y salida en JSON para scripts y agentes.

Primeros Pasos

Prospección que sigue cuando te desconectas.Leads, emails, seguimientos y respuestas, resueltos.

Conecta buzones ilimitados y deja que los agentes de IA busquen leads, escriban cada email y hagan seguimiento. O envía tus propias plantillas en modo manual. Desde $29/mes.

$1 por 3 días · Cancela cuando quieras · Sin contrato

Instalar con IA

Tu agente de código configura la CLI y las skills de FirstSales por ti.

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.