Skip to content

Integrations

Leadnote public API: create, read and update leads

Developer guide to the Leadnote public REST API. Authenticate with an API key, create leads, read and update them, list your lists and handle errors.

Last updated 4 min read

The Leadnote public API lets your own software add leads, read them back and change them. You need an API key with the right scopes; create one as described in API keys. Every call is for one organisation: the one that owns the key.

The examples use https://leadsnote.com as the base address. The API reference tab shows the base address for your account.

Authentication and limits

Send the key in the x-api-key header, or as Authorization: Bearer YOUR_API_KEY. The rate limit (60 requests a minute per key) and the Retry-After header are described in API keys.

Method and path Scope What it does
POST /api/public/leads leads:write Create a lead
GET /api/public/leads leads:read List leads, newest first
GET /api/public/leads/{id} leads:read Read one lead
PATCH /api/public/leads/{id} leads:update Change a lead
GET /api/public/lists lists:read List your lists and list keys

Find the list key

Every list has a list key. Call the lists endpoint to see them, or open the API reference tab.

curl 'https://leadsnote.com/api/public/lists' \
  -H 'x-api-key: YOUR_API_KEY'
{ "data": [ { "id": "LIST_ID", "name": "Website enquiries", "listKey": "LIST_KEY" } ] }

Create a lead

curl -X POST 'https://leadsnote.com/api/public/leads' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'content-type: application/json' \
  -d '{"firstName":"Asha","email":"asha@example.com","phone":"+919876543210","listKey":"LIST_KEY"}'

A new lead answers with its id and a status of created:

{ "id": "LEAD_ID", "status": "created" }

If the email or phone already exists in your account, no new lead is made. The answer has the existing lead's id and the status duplicate.

Required: firstName, and at least one of email or phone.

Optional fields:

Field Notes
lastName, company, designation, website Text
address1, address2, city, state, zip, country Text
potential high, medium, low or not_relevant
dealSize A number, zero or more
productGroup, customerGroup Text. The list's defaults apply if you leave them out.
tags Up to 20 short strings
notes Up to 4,000 characters
source Up to 80 characters. If omitted, the source is "Public API".
customFields An object of your custom field values
listKey The list key or list id. If you leave it out, the lead goes to your default list.

A listKey that matches no list is refused, so a typo never sends leads to the wrong place. New leads start in your default open stage, and Leadnote sends the same lead.created event as the app does.

List and read leads

curl 'https://leadsnote.com/api/public/leads?limit=25&page=1&listKey=LIST_KEY&updatedSince=2026-10-01T00:00:00Z' \
  -H 'x-api-key: YOUR_API_KEY'
Query parameter Meaning
limit 1 to 100. The default is 25.
page Page number, starting at 1.
listKey Only leads in that list.
updatedSince An ISO date and time. Only leads changed since then.

The answer holds page, limit and a data array of leads with their id, names, email, phone, company, place, potential, stage id, list id, source, tags, notes and timestamps.

GET /api/public/leads/{id} returns one lead as flat JSON. It also has fullName, stageName and listName, and your custom field values as custom_<fieldKey>.

Update a lead

curl -X PATCH 'https://leadsnote.com/api/public/leads/LEAD_ID' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'content-type: application/json' \
  -d '{"potential":"high","notes":"Asked for a demo"}'

You can change names, email, phone, company, designation, website, address fields, potential, deal size, product group, customer group, tags, notes, custom fields, stageId and assignedToId. Send at least one field. Unknown fields and an empty body are refused rather than ignored. A phone number in a PATCH must include the country code, for example +919876543210.

The change goes through the same rules as an edit in the app, so stage history, the activity log, lead score and webhook events all update.

Errors

Errors always have one shape:

{ "error": { "code": "validation_error", "message": "Invalid request", "details": { "fieldErrors": { "email": ["email is not valid"] } } } }

A validation error lists the fields in details.fieldErrors. A missing or wrong key is refused as not authenticated, and a key without the needed scope is refused as not allowed. A suspended organisation cannot create leads.

Tools

  • OpenAPI document: GET /api/public/docs returns the description of the API.
  • Postman collection: download it from the API reference tab on the API and webhooks page.
  • Webhooks: to be told when leads change instead of polling, see webhooks.
  • Your own web form: a form on your website can post straight to the form's address without a key. See embed a form on your website.

Frequently asked questions

What happens if I post the same person twice?

Leadnote does not create a second lead. It answers with the existing lead's id and the status duplicate. A match is the same email address or the same phone number inside your account.

Where do new API leads go?

Into the list named by listKey. If you leave listKey out, they go to your default list. The list's own assignment rule picks the owner.

Is there a machine-readable description of the API?

Yes. Open the OpenAPI document at /api/public/docs, or download the Postman collection from the API reference tab.