Home Lead Types Pricing How It Works Testimonials Help Centre FAQ Contact Affiliates: earn £25 per sign-up Start Free Trial
API & Webhooks

Developer Reference

Push fresh 9amLeads opportunities into your own systems automatically - via CRM webhooks or the authenticated leads API.

Authentication

Getting Started

All endpoints use the same account you sign up with. Authenticate with a bearer token issued at login. Every request should send your token in the Authorization header.

POST/api/auth/login
Log in and receive a token. Use it as your bearer token for all authenticated calls.
// Request
{ "email": "you@yourbusiness.co.uk", "password": "your-password" }

// Response
{ "token": "eyJhbGciOiJIUzI1NiIs...", "customer": { ... } }
// Use the token on every request
Authorization: Bearer <your-token>
Content-Type: application/json
The Leads API

Leads Endpoints

GET/api/leads
Fetch all leads for your account. Returns your full list of opportunities with status, contact details and scores.
GET/api/leads/today
Fetch today's delivery only - the fresh opportunities that arrived at 9am.
GET/api/leads/:id
Fetch a single lead by its ID.
PUT/api/leads/:id/status
Update a lead's status (e.g. new, contacted, quoted, won, lost). Body: { "status": "contacted" }
PUT/api/leads/:id/note
Add a note to a lead. Body: { "note": "Called on Tuesday, quotes this week" }
POST/api/leads/reject
Reject a lead (e.g. incorrect address) so it doesn't count toward your daily allowance. Body: { "leadId": "..." , "reason": "wrong address" }
Webhooks

CRM Webhook

Set a webhook URL and every fresh opportunity is POSTed to your endpoint automatically at 9am delivery. Works with Zapier, HubSpot, Salesforce, Pipedrive, Make and any system that accepts webhooks.

PUT/api/settings/crm
Save your webhook URL. Body: { "crm_webhook_url": "https://your-endpoint.com/hook" }
GET/api/settings/crm
Read your currently configured webhook URL.
DELETE/api/settings/crm
Remove the webhook URL.
POST/api/crm/test
Send a test payload to your webhook URL to confirm the connection works.

Example payload we send to your webhook

// Every opportunity delivered to your webhook looks like this:
{
  "lead_type": "moving",
  "property_address": "12 Example Road, London, SW1A 1AA",
  "postcode": "SW1A 1AA",
  "contact": { "name": "...", "phone": "...", "email": "..." },
  "property_type": "Terraced",
  "bedrooms": 3,
  "score": 92,
  "source_link": "https://...",
  "freshness_hours": 18,
  "delivered_at": "2026-08-27T09:00:00.000Z"
}

Fields vary by lead type - moving leads include property details, probate leads include executor and estate fields, tenders include CPV codes and value. The lead type is always included so you can route accordingly.

Best practices

Notes for Developers

TopicGuidance
Retry behaviourWebhooks are sent once per delivery. If your endpoint is briefly unavailable, fetch /api/leads/today to reconcile anything missed.
IdempotencyEvery lead has a stable ID. Deduplicate by lead ID if you receive a webhook and later fetch the same lead.
TimingWebhooks fire at the same time as your 9am email delivery. Expect the request within a few minutes of 9:00 UK time.
TestingUse POST /api/crm/test to send a test payload before going live.
Rate limitsStandard limits apply to the leads API. The webhook is one POST per delivery per customer.

Need Help Integrating?

Our team can help you set up HubSpot, Zapier or a custom webhook. Just ask.

Contact Support Start Free Trial