Skip to main content
Scale plan feature

Bolsivo API & Webhooks

Connect Bolsivo to your CRM, Zapier workflows, or internal tools using the REST API and real-time webhook events. Available on the Scale plan.

Authentication

API keys follow the format lp_ + 32 hex characters. Keys are generated once and shown to you — Bolsivo stores only the SHA-256 hash. Treat your key like a password.

Generate an API key

Settings → API Keys → Create key. You can create multiple named keys and revoke any individually.

Plan requirement

API access and webhooks are available on the Scale plan only. Upgrade in Settings → Billing.

Send your API key in the Authorization header:

curl
curl https://bolsivo.com/api/leads \
  -H "Authorization: Bearer lp_your_api_key_here" \
  -H "Content-Type: application/json"

Never expose API keys in client-side code or commit them to version control. Use environment variables. Keys can be revoked instantly from Settings if compromised.

Webhooks

Bolsivo sends real-time POST requests to your endpoint when key events occur. Each webhook delivery includes an X-Bolsivo-Signature header for verification.

Signature verification

Every delivery includes an HMAC-SHA256 signature of the raw request body, signed with the secret generated when you created the webhook endpoint. Always verify before processing.

typescript
import crypto from 'crypto'

export function verifyBolsivoWebhook(
  rawBody: string,
  signature: string,
  secret: string,
): boolean {
  const expected = crypto
    .createHmac('sha256', secret)
    .update(rawBody)
    .digest('hex')
  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected),
  )
}

Supported events

lead.qualified

Fired when a lead's AI score meets your minimum threshold and it moves to Qualified status.

{
  "event": "lead.qualified",
  "org_id": "org_abc123",
  "lead_id": "lead_xyz789",
  "business_name": "Sunrise Office Park",
  "score": 82,
  "fit_reason": "Active office park in Bellevue with 180+ reviews",
  "timestamp": "2026-06-20T14:32:10Z"
}
lead.status_changed

Fires on every lead status transition (new → qualified → contacted → replied → meeting → closed_won / closed_lost).

{
  "event": "lead.status_changed",
  "org_id": "org_abc123",
  "lead_id": "lead_xyz789",
  "business_name": "Sunrise Office Park",
  "previous_status": "contacted",
  "new_status": "replied",
  "timestamp": "2026-06-20T14:32:10Z"
}
email.sent

Fired after you approve and send an outreach email to a lead.

{
  "event": "email.sent",
  "org_id": "org_abc123",
  "lead_id": "lead_xyz789",
  "email_id": "draft_def456",
  "to": "manager@sunriseofficepark.com",
  "subject": "Quick question for Sunrise Office Park",
  "sequence_step": 1,
  "timestamp": "2026-06-20T14:32:10Z"
}

Register a webhook endpoint

curl
curl -X POST https://bolsivo.com/api/webhooks \
  -H "Authorization: Bearer lp_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "My CRM sync",
    "target_url": "https://your-server.com/bolsivo-events",
    "event_types": ["lead.qualified", "lead.status_changed", "email.sent"]
  }'

The response includes a secret field — store this immediately. It is shown only once and cannot be recovered.

Rate limits & retries

API requests

1,000 / hour

Per API key

Webhook retries

3 attempts

30s, 5min, 30min backoff

Webhook timeout

10 seconds

Per delivery attempt

429 Rate limited?

When rate limited, the response includes a Retry-After header indicating seconds to wait. Implement exponential backoff for robust integrations.

Response format & errors

All responses are JSON. Successful responses return 2xx. Errors return a structured body:

json
{
  "error": "name, target_url and event_types required"
}
StatusMeaning
200Success
201Created (new webhook or API key)
400Bad request — missing or invalid parameters
401Unauthorized — missing or invalid API key
403Forbidden — Scale plan required
404Resource not found
429Rate limited — wait for Retry-After
500Server error — retry with backoff

Common integration patterns

CRM sync

Listen for lead.status_changed events and mirror status updates into your CRM. When status becomes "closed_won", create a customer record automatically.

Zapier / Make

Use the webhook URL as a Zapier "Catch Hook" trigger. Map Bolsivo events to create Trello cards, send Slack notifications, or update Google Sheets.

Instant CRM records

Trigger on lead.qualified to instantly create a CRM contact with the lead's business name, address, phone, score, and fit reason pre-filled.

Analytics pipeline

Forward email.sent and lead.status_changed events to your data warehouse to build custom funnel reports and measure outreach ROI.

Need a custom integration?

The Luna Enterprise plan includes a dedicated account manager and custom onboarding. We can help you build the integration your team needs.