CRM API
Last updated November 10, 2026
Each company's CRM can give outside tools (an AI assistant, Zapier, Make, your own code) an API key. With it, the tool can find leads, read their history, change their stage, update contact details, add notes and add new leads, only in that company's CRM.
Get a key
The CRM owner opens Settings → API access, names the key after the tool (for example "Viktor") and clicks Create API key. The key starts with wln_ and is shown once. Paste it into the tool's secure key field, never in a chat or email. Revoke it there at any time; the tool stops working immediately.
Using it
Send the key in every request as Authorization: Bearer wln_… (or the header x-api-key). Requests and answers are JSON. Base address: https://crm.webleadsnow.com/api/v1
| Check the key | GET /api/v1/: the company name, its Board stages and these endpoints. |
|---|---|
| Find leads | GET /api/v1/leads?search=smith&stage=contacted&limit=25: newest first. search matches name, email, address, city or phone (digits). Optional created_since=2026-11-01. Spam is left out unless you ask for stage=spam. |
| One lead | GET /api/v1/leads/{id}: the lead with its last 50 notes and history entries. |
| Change stage or details | PATCH /api/v1/leads/{id} with any of stage, name, phone, email, address, city, service_type, message. Example: {"stage": "consult_booked"}. The stage can be the key or its label ("Consult booked"). |
| Add a note | POST /api/v1/leads/{id}/notes with {"text": "Called, booked consult for Tue 10am"}. |
| Project budget | GET /api/v1/leads/{id}/budget: the budget, contract price, spent, paid, unpaid, remaining and every invoice/expense.PATCH /api/v1/leads/{id}/budget with {"budget_amount": 18500, "contract_amount": 24900} (null clears one). |
| Invoices and expenses | POST /api/v1/leads/{id}/budget/entries with {"amount": 1250.00, "vendor": "ABC Supply", "description": "Shingles", "category": "materials", "invoice_number": "INV-1042", "entry_date": "2026-11-09", "status": "unpaid"}, or several at once as {"entries": [ … ]} (up to 100). Categories: materials, labor, subcontractor, permit, equipment, other. A negative amount is a credit.PATCH /api/v1/leads/{id}/budget/entries/{entryId} with {"status": "paid"} (or fix amount, vendor, description, date, category, invoice number). Budgets must be turned on for the CRM. |
| Add a lead | POST /api/v1/leads with name and a phone or email, plus optional address, city, service_type, message, stage. |
Permissions
Each key has a set of permissions: leads.read, leads.write, notes.write, budgets.read, budgets.write. GET /api/v1/ shows what yours has under allowed. A request outside them gets status 403 with the missing scope.
Atlas (WebLeadsNow's AI employee)
Atlas has one key (atl_…, from WebLeadsNow's console) for every company and names the company in each request with the header X-Company: <slug>. GET /api/v1/companies lists the companies where Atlas may work right now and what it may do in each. A company appears there when it has the Atlas add-on and its owner turned Atlas on in Settings; owners can switch any of Atlas's permissions off for their CRM.
Stages
new, contacted, consult_booked (only if the company uses it), quote_sent, won, in_progress, completed, lost, spam. GET /api/v1/ lists exactly the ones that company uses.
Good to know
- Every change made with a key shows on the lead as "API: key name", so the team can see what the tool did.
- A key can't delete leads or budget entries, see other companies, send emails or texts, or change settings.
- Errors come back as
{"error": "…"}with status 400 (bad input), 401 (missing, wrong or revoked key), 403 (CRM paused) or 404 (lead not found).
Example
curl -H "Authorization: Bearer wln_…" "https://crm.webleadsnow.com/api/v1/leads?search=smith"
curl -X PATCH -H "Authorization: Bearer wln_…" -H "Content-Type: application/json" \
-d '{"stage":"consult_booked"}' "https://crm.webleadsnow.com/api/v1/leads/LEAD_ID"