LEVITATE|Developer APIv1
Get API Key
REST API · No SDK Required

Build on
LEVITATE API

Access AI-enriched leads, trigger outreach, register webhooks, and automate your sales pipeline — all over HTTP.

99.9%
uptime SLA
<120ms
avg response
50+
endpoints
terminal
01

Quick Start

Make your first API call in under 2 minutes. No SDK, no package install needed.

1
Get your API key

Contact your LEVITATE admin or email dev@levitatelabs.online. Keys look like: lv_live_abcd1234...

2
Initialize the client
js
const BASE = 'https://levitatelabs.online/api/v1'
const KEY = process.env.LEVITATE_API_KEY

async function lv(path, opts = {}) {
  const res = await fetch(BASE + path, {
    ...opts,
    headers: {
      'Authorization': `Bearer ${KEY}`,
      'Content-Type': 'application/json',
      ...opts.headers
    }
  })
  return res.json()
}
3
Fetch your first leads
js
const { data } = await lv('/leads?limit=20&status=New')
data.leads.forEach(lead => {
  console.log(`${lead.business_name} — Score ${lead.ai_score}/10`)
})
02

Authentication

All requests require your API key as a Bearer token.

Header (recommended)
http
Authorization: Bearer lv_live_your_key_here
Query param (less secure)
http
GET /api/v1/leads?api_key=lv_live_your_key_here
⚠️Never expose your API key in client-side code. Use environment variables and server-side requests only.
03

Leads API

Access AI-enriched leads with scores, contact data, and pipeline status. Requires Starter plan+.

GET/api/v1/leads

List leads sorted by AI score. Supports pagination and status filtering.

limitnumber

Max results (1–100, default 20)

offsetnumber

Pagination offset (default 0)

statusstring

New · Contacted · Follow Up · Closed

js
const { data } = await lv('/leads?limit=20&status=New')
data.leads.forEach(lead => {
  console.log(`${lead.business_name} — Score ${lead.ai_score}/10`)
})
04

Outreach API

Queue AI-drafted outreach emails. Requires Starter plan+.

POST/api/v1/outreach
torequired

Recipient email address

subjectrequired

Email subject line

bodyrequired

Plain text message body

lead_idoptional

Lead UUID to link this email

js
const res = await lv('/outreach', {
  method: 'POST',
  body: JSON.stringify({
    to: 'owner@restaurant.com',
    subject: 'Website for your restaurant?',
    body: 'Hi! We can have a full website live in 24h...',
    lead_id: 'uuid-of-lead'
  })
})
console.log(res.queued) // true
05

Webhooks

Receive real-time POST requests for key events. Requires Starter plan+.

Register a webhook
js
const res = await lv('/webhooks', {
  method: 'POST',
  body: JSON.stringify({
    url: 'https://yourdomain.com/hooks/levitate',
    events: ['lead.created', 'email.replied']
  })
})
// POST requests fire to your URL on each event
Available Events
lead.createdNew lead discovered and scored by AI
lead.status_changedLead stage updated in pipeline
research.completedMarket research batch finished
email.openedOutreach email opened by recipient
email.repliedRecipient replied to an outreach email
Payload Shape
json
{
  "event": "lead.created",
  "timestamp": "2026-05-25T10:30:00Z",
  "data": {
    "id": "uuid",
    "business_name": "Sharma Electronics",
    "ai_score": 8.4,
    "city": "Mumbai",
    "status": "New"
  }
}
06

Error Reference

All errors return a consistent JSON shape. Always check the success field first.

200OKRequest successful
201CreatedResource created
400Bad RequestMissing or invalid parameters
401UnauthorizedAPI key missing or invalid
403ForbiddenYour plan does not include this endpoint
429Rate LimitedMonthly request quota exceeded
500Server ErrorContact dev@levitatelabs.online
js
// Error response shape
{
  "success": false,
  "error": "Plan does not include this endpoint",
  "timestamp": "2026-05-25T10:30:00Z"
}

// Always handle errors
const res = await lv('/leads')
if (!res.success) {
  console.error(res.error)
}