Skip to main content
POST
Push a lead into your Oktivo CRM from any external system — a website form, a chatbot, an ad platform, a payment flow, or your own backend. The same person arriving more than once is intelligently de-duplicated into a single lead with a full source history, so you can fire this endpoint freely without creating duplicates.

Authentication

This endpoint accepts an API Token (okt_...), or a logged-in JWT. Send it as a Bearer token:
Generate a token in the dashboard under Settings → API Tokens → Create Token (app.oktivo.com/account). The okt_... value is shown only once — copy it immediately. Accounts allow up to 5 active tokens. See Capturing Leads via API for a step-by-step walkthrough and Authentication for rotation and expiry.
The lead is always scoped to the token owner’s account — you cannot create leads in another account. The crm_api feature must be enabled on your plan.

Identity Rule

A lead must be reachable, so at least one of phone or email is required. name is optional. If you send neither a phone nor an email, the request is rejected with a 400. Phone numbers are accepted in any common format and normalized to E.164. A 10-digit Indian mobile such as 9876543210 becomes +919876543210; an already-E.164 value like +14155551234 is kept as-is.

Request Body

string
Contact’s display name. Optional. Maximum 200 characters. Aliases accepted (first present wins, in this order): name, contactName, contact_name, fullName, full_name.
string
Phone number. Any format is accepted and normalized to E.164. Required unless email is provided.
string
Email address. Validated when present. Required unless phone is provided.
string
Pipeline stage for the lead, e.g. new, contacted, qualified, negotiation, won, lost. Custom statuses configured for your org are also accepted. Defaults to your pipeline’s first stage when omitted.
string
Intent signal. One of hot, warm, cold.
number
The lead’s primary deal amount. Accepts a plain number or a numeric string (e.g. "₹2,50,000" → 250000). Feeds the dashboard opportunity funnel.
object
Acquisition attribution.
object
A bag of custom fields to store on the lead (industryData and fields are accepted aliases). Keys max 50 characters, string values max 2000 characters. Maximum 50 custom fields per lead.You can also send custom fields as plain top-level keys — any body key that is not a reserved field name is treated as a custom field. The explicit customFields object wins on key collisions.Example: {"course": "Data Science", "campaign": "spring-2026"}
string
Optional web-tracking visitor id. When present, the lead is stitched to that visitor’s prior anonymous web activity. visitor_id is also accepted.

Deduplication

Oktivo keeps one lead per phone (or email) per account. How a repeat arrival is handled depends on the source:
  • A repeat from a new source always merges into the existing lead and appends an entry to its source history.
  • A repeat from a source the lead already has returns a 409 for curated sources (manual, csv_import, api, webhook) to protect your data from accidental overwrites.
  • For self-service / event-stream sources (website, chatbot, landing, whatsapp, google_form, ai_powered_lead, payment_page_drop) a repeat always merges and the latest non-empty values win — so returning visitors and re-fired events never 409.
When a request merges into an existing lead, the response has "merged": true and returns a 200. A brand-new lead returns 201 with "merged": false.

Lead Sources

Set metadata.source to attribute the lead. Only these canonical values are honoured; any other value is stored as api.

Response

boolean
true when the lead was created or merged.
boolean
true when the request merged into an existing lead (200); false for a newly created lead (201).
object

Error Codes