REST API · v1

Pulse API

Crea leads, sube inventario, lee tu workspace desde cualquier sistema. Authentication via Bearer API key generada en Configuración → API keys.

Autenticación

Todas las peticiones requieren el header Authorization: Bearer pk_….

curl -H "Authorization: Bearer pk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  https://pulse-one-beta.vercel.app/api/v1/me

Las keys son por workspace. Cada request escribe en el workspace al que pertenece la key. La key se muestra solo una vez al crearla; guárdala en un password manager o secret store.

GET /api/v1/me

Verifica la key y devuelve info del workspace.

curl -H "Authorization: Bearer pk_..." \
  https://pulse-one-beta.vercel.app/api/v1/me

# Response 200
{
  "workspace": {
    "id": "uuid",
    "name": "GPA",
    "slug": "gpa-...",
    "industry": "auto_dealer",
    "enabled_modules": { "lead_scorer": true, ... }
  },
  "api_version": "v1"
}

POST /api/v1/leads

Crea un lead nuevo. Dispara scoring async, auto-asignación, smart-match y webhooks salientes.

Requiere al menos uno de: full_name, email, phone.

curl -X POST -H "Authorization: Bearer pk_..." \
  -H "Content-Type: application/json" \
  https://pulse-one-beta.vercel.app/api/v1/leads \
  -d '{
    "full_name": "Juan Pérez",
    "email": "juan@example.com",
    "phone": "+52 55 1234 5678",
    "source": "website_form",
    "inventory_external_id": "GPA-001",
    "source_details": { "campaign": "facebook_q2" }
  }'

# Response 201
{
  "id": "uuid",
  "full_name": "Juan Pérez",
  "email": "juan@example.com",
  "phone": "+52 55 1234 5678",
  "source": "website_form",
  "status": "new",
  "created_at": "2026-05-05T..."
}

El campo source debe ser uno de: website_form, meta_lead_ads, mercadolibre_message, whatsapp_inbound, intercom_conversation, phone_call, walk_in, referral, other.

GET /api/v1/leads

Lista leads del workspace. Paginado por ?limit=N (max 200, default 50).

curl -H "Authorization: Bearer pk_..." \
  "https://pulse-one-beta.vercel.app/api/v1/leads?limit=20&temperature=hot&status=new"

# Response 200
{
  "data": [
    { "id": "...", "full_name": "...", "score": 85, ... }
  ],
  "count": 20
}

Filtros opcionales: ?status=new|contacted|..., ?temperature=hot|burning|...

POST /api/v1/inventory

Crea o upsertea unidades. Acepta un solo item o { items: [...] } hasta 200 a la vez. Upsert por (workspace_id, external_id).

curl -X POST -H "Authorization: Bearer pk_..." \
  -H "Content-Type: application/json" \
  https://pulse-one-beta.vercel.app/api/v1/inventory \
  -d '{
    "items": [
      {
        "external_id": "GPA-100",
        "title": "Honda CR-V EX 2022",
        "price_amount": 459000,
        "data": { "make": "Honda", "model": "CR-V", "year": 2022, "km": 45000 },
        "status": "available",
        "images": ["https://..."]
      }
    ]
  }'

# Response 201
{ "upserted": 1, "inserted": 0, "total": 1 }

GET /api/v1/inventory

Lista inventario del workspace. Mismas convenciones que /leads.

curl -H "Authorization: Bearer pk_..." \
  "https://pulse-one-beta.vercel.app/api/v1/inventory?limit=50&status=available"

Webhooks salientes

Para recibir notificaciones cuando algo importante pasa (lead nuevo, hot lead, smart match, etc.), configura webhooks en Configuración → Webhooks salientes. Pulse hace POST a tu URL con el evento.

Errores

Códigos HTTP estándar:

  • 200 / 201 — éxito
  • 400 — payload inválido (mira details en el body)
  • 401 — API key faltante o revocada
  • 500 — error de servidor (raro)

Rate limits

Sin límites duros por ahora. Recomendamos no superar ~20 req/s por workspace. Si necesitas batch grandes, usa el endpoint POST /api/v1/inventory con arrayitems en lugar de N peticiones individuales.

¿Falta un endpoint que necesitas? Avísanos en hello@pulse.app.