Send every lead where your team already works, and bring the outcome back.
The TruLata API hands your leads and blog posts to Zapier, Make, n8n, Pipedream or your own code, and takes leads and their outcomes back in. Make a key on your dashboard, paste it into the tool, and choose what happens next.
What can I automate?
Four things, in both directions. Each new lead goes out to the tools your team already runs. Leads from anywhere else come in and land on your Leads tab. A lead's outcome, contacted, quoted, won, lost or not a lead, is written back from wherever your team records it. And each blog post goes out once it is published.
For example: a new lead posts to your team's Slack channel and adds a row to a Google Sheet. A deal marked won in your CRM marks the same lead won in TruLata, so the Leads tab and your CRM agree. A landing page form TruLata does not read sends its leads in. A new blog post goes to your newsletter tool as a draft. You build each of these as steps in the tool you choose.
A lead added through the API is a real lead. It lands on the Leads tab like a website form message and, unless you say otherwise, emails the owner the same way. Its outcome is the same record the Leads tab shows, so an outcome set from an automation and one set on the screen are one and the same.
How do I get a key?
From your dashboard. Open the Integrations tab and find the card Zapier, Make and the TruLata API. Type what the key is for, like Zapier, and press Make a key. The account owner or an admin can make one.
Copy it when it appears, because it is shown once. We keep only a fingerprint of it, so a lost key cannot be recovered: revoke it and make another. The card lists each key by its label and its first characters.
A key opens your account and nothing else. Revoke it on the same card and its next request is refused. An account holds up to 10 keys, so give each tool its own and you can cut one off without touching the rest.
Send it on every request as Authorization: Bearer tl_live_..., or as an X-API-Key header if your tool prefers that.
Does it work with Zapier, Make, n8n and Pipedream?
Yes, today, through their webhook and HTTP steps. TruLata's own Zapier app is in review. Every one of these tools can catch a POST at an address it gives you and can call an address with a header, and that is all the API needs.
To receive leads, add a webhook trigger in the tool, copy the address it gives you, and subscribe that address to lead.created with one call to /v1/hooks. To send a lead in or set an outcome, add an HTTP request step that calls /v1/leads or /v1/leads/{id}/status with your key in the header.
Prefer polling? GET /v1/leads returns the newest leads first, each with a stable id, so a scheduled step can act only on the ones it has not seen.
Your own code works the same way. A script, a back-office system or anything else that can send an HTTPS request with a header can use the API.
How do webhooks reach my tool?
Subscribe once and TruLata posts to you. Send POST /v1/hooks with an event and a public https address and you get back an id. From then on each new record for that event is sent to the address as JSON, within about two minutes of it landing.
A subscription starts from now. Whatever was already there counts as seen, so switching a workflow on never replays your history. When several records arrive between deliveries they go out oldest first, in the order they happened.
Each change fires once. A lead that moves from contacted to won sends lead.status_changed twice, once for each status.
Stopping is up to you or your tool. DELETE /v1/hooks/{id} removes a subscription. An address that answers 410 Gone is unsubscribed on the spot, and one that fails ten times in a row is switched off, so a dead address stops receiving your leads.
What are the limits, and what does an error look like?
120 requests a minute per key. Go over and the request answers 429 with retry_after set to 60 seconds; wait, then send it again.
Every error says what went wrong in a plain sentence. The body is JSON with ok set to false and an error you can show a person, and the HTTP status is the real one: 400 for a request that needs fixing, 401 for a missing or revoked key, 404 for a lead id this account does not have, 429 for the rate limit and 503 when your lead sources cannot be read right now.
A 503 is never dressed up as an empty list. If your lead sources cannot be read, the API says so, so a polling step never mistakes an outage for a quiet day.
Lists are capped: up to 100 leads a call, from the last 30 days unless you ask for up to 365, and up to 100 posts a call.
What does the API cover?
Nine endpoints under one base address. Three read your account, your leads and your posts. One finds a lead by email or phone. Two write: a new lead, and a lead's outcome. Three manage webhook subscriptions. Each has a curl example below that you can paste into a terminal with your key.
Every endpoint, with a curl you can paste.
Base address: https://trulata-product-api.onrender.com/v1. Every request carries your key as Authorization: Bearer tl_live_... or X-API-Key: tl_live_.... The examples read it from a shell variable:
export TRULATA_KEY="tl_live_your_key_here"
GET /v1/me
The account this key opens: its id, company name, dashboard address, the key's label and the events you can subscribe to. Use it as the connection test.
curl https://trulata-product-api.onrender.com/v1/me \
-H "Authorization: Bearer $TRULATA_KEY"
GET /v1/leads
Your leads, newest first, each with a stable id. limit takes up to 100 (default 50). days looks back up to 365 days (default 30).
curl "https://trulata-product-api.onrender.com/v1/leads?limit=10&days=7" \
-H "Authorization: Bearer $TRULATA_KEY"
GET /v1/leads/search
Find a lead by email or by phone, across the last 365 days. Phone numbers match on their last ten digits, so formatting does not matter.
curl "https://trulata-product-api.onrender.com/v1/leads/search?email=jordan@example.com" \
-H "Authorization: Bearer $TRULATA_KEY"
curl "https://trulata-product-api.onrender.com/v1/leads/search?phone=4055550142" \
-H "Authorization: Bearer $TRULATA_KEY"
POST /v1/leads
Add a lead. It lands on your Leads tab like a website form message. Send name, or first_name and last_name, plus any of email, phone, service, message and source. A lead needs at least a name, an email or a phone. notify defaults to true, which emails the owner the same way a website form lead does; send false to skip it.
curl -X POST https://trulata-product-api.onrender.com/v1/leads \
-H "Authorization: Bearer $TRULATA_KEY" \
-H "Content-Type: application/json" \
-d '{"first_name": "Jordan", "last_name": "Example",
"email": "jordan@example.com", "phone": "405-555-0142",
"service": "Water heater replacement",
"message": "Leaking since this morning. Can someone come out this week?",
"source": "Zapier", "notify": true}'Response
{
"ok": true,
"lead": {
"id": "ld_3f9a1c2b7d4e5f6a8b9c",
"created_at": "2026-10-21T09:14:00-04:00",
"name": "Jordan Example",
"email": "jordan@example.com",
"phone": "405-555-0142",
"service": "Water heater replacement",
"message": "Leaking since this morning. Can someone come out this week?",
"town": "",
"page": "",
"source": "Zapier",
"quality": "",
"status": "",
"status_note": ""
}
}
POST /v1/leads/{id}/status
Set a lead's outcome: contacted, quoted, won, lost or not_lead, with an optional note. It is the same record the Leads tab shows, so an outcome set here appears on the screen. The id comes from a new lead, a list or a search.
curl -X POST https://trulata-product-api.onrender.com/v1/leads/ld_3f9a1c2b7d4e5f6a8b9c/status \
-H "Authorization: Bearer $TRULATA_KEY" \
-H "Content-Type: application/json" \
-d '{"status": "won", "note": "Signed the quote on site"}'
GET /v1/posts
Your published blog posts, newest first: id, title, url, excerpt, image_url, target_search and published_at. limit takes up to 100 (default 25).
curl "https://trulata-product-api.onrender.com/v1/posts?limit=5" \
-H "Authorization: Bearer $TRULATA_KEY"
POST /v1/hooks
Subscribe a public https address to an event. You get back the subscription's id; keep it to unsubscribe. A key can hold up to 50 subscriptions.
curl -X POST https://trulata-product-api.onrender.com/v1/hooks \
-H "Authorization: Bearer $TRULATA_KEY" \
-H "Content-Type: application/json" \
-d '{"event": "lead.created", "target_url": "https://hooks.example.com/trulata/new-lead"}'Response
{
"ok": true,
"id": "42",
"event": "lead.created",
"target_url": "https://hooks.example.com/trulata/new-lead"
}
GET /v1/hooks
The subscriptions this key holds, with when each was made, when it last sent and the status your address last answered with.
curl https://trulata-product-api.onrender.com/v1/hooks \
-H "Authorization: Bearer $TRULATA_KEY"
DELETE /v1/hooks/{id}
Unsubscribe. Removing one that is already gone still answers ok.
curl -X DELETE https://trulata-product-api.onrender.com/v1/hooks/42 \
-H "Authorization: Bearer $TRULATA_KEY"
Three events, one shape.
| Event | Fires when | The record it carries |
|---|---|---|
lead.created | A new lead reaches your Leads tab, including a lead added through the API | The lead, with the fields listed below |
lead.status_changed | A lead's outcome is set or changed, on the Leads tab or through the API. Each status fires once, so contacted then won fires twice | The lead, with its new status and status_note |
post.published | A blog post is published | The post: id, title, url, excerpt, image_url, target_search, published_at |
Lead fields
| Lead field | What it holds | Example |
|---|---|---|
id | A stable id for the lead. Use it to set an outcome | ld_7c2e9b41a0d35f86e214 |
created_at | When the lead arrived, ISO 8601 with its offset | 2026-10-21T14:32:00-04:00 |
name, email, phone | Who it is and how to reach them | casey@example.com |
service, message | What they asked for, in their words | Drain cleaning |
town, page | Where they are and the page they wrote from, where known | https://example.com/drain-cleaning |
source | Where the lead came from, or the source you sent with it | Zapier |
quality | A quality label where one is set: qualified, unqualified or likely_junk | qualified |
status, status_note | The outcome and its note, empty until one is set | won |
What lands at your address.
Each delivery is a POST with a JSON body: the event, your account, the record under data, and the same fields again at the top level, so a tool that only reads top-level fields still sees them. This example is fictional.
POST https://hooks.example.com/trulata/new-lead
Content-Type: application/json
{
"event": "lead.created",
"account": "example-plumbing",
"data": {
"id": "ld_7c2e9b41a0d35f86e214",
"created_at": "2026-10-21T14:32:00-04:00",
"name": "Casey Sample",
"email": "casey@example.com",
"phone": "405-555-0187",
"service": "Drain cleaning",
"message": "Kitchen sink backs up every few days.",
"town": "Springfield",
"page": "https://example.com/drain-cleaning",
"source": "Website form",
"quality": "qualified",
"status": "",
"status_note": ""
},
"id": "ld_7c2e9b41a0d35f86e214",
"created_at": "2026-10-21T14:32:00-04:00",
"name": "Casey Sample",
"email": "casey@example.com",
"phone": "405-555-0187",
"service": "Drain cleaning",
"message": "Kitchen sink backs up every few days.",
"town": "Springfield",
"page": "https://example.com/drain-cleaning",
"source": "Website form",
"quality": "qualified",
"status": "",
"status_note": ""
}The API, in one table.
| What | How it works | Detail |
|---|---|---|
| Base address | https://trulata-product-api.onrender.com/v1 | Every endpoint on this page sits under it |
| Authentication | Authorization: Bearer tl_live_... or X-API-Key | Every request |
| Keys | Made on the Integrations tab by the owner or an admin | Up to 10 per account, shown once, revocable on the same card |
| Scope | One key opens one account | Nothing else |
| Rate limit | 120 requests a minute per key | 429 with retry_after when exceeded |
| Leads per call | Up to 100, newest first | Last 30 days by default, up to 365 |
| Webhook events | lead.created, lead.status_changed, post.published | Delivered within about two minutes, oldest first |
| Subscriptions | Up to 50 per key | 410 unsubscribes; ten failures in a row switches one off |
| Errors | JSON with ok false and a plain sentence | Real HTTP status: 400, 401, 404, 429, 503 |
A key opens the account that made it and nothing else, and the card that made it can revoke it.
Questions, answered.
Is TruLata on Zapier?
TruLata works with Zapier today through Webhooks by Zapier and its HTTP steps, using the endpoints on this page. TruLata's own Zapier app is in review and is not public yet.
Does it work with Make, n8n and Pipedream?
Yes, today, through their webhook and HTTP steps, with the same key and the same endpoints.
Who can make an API key?
The account owner or an admin, on the Integrations tab of the dashboard, from the card Zapier, Make and the TruLata API. An account holds up to 10 keys.
What if a key leaks?
Revoke it on the same card and its next request is refused, then make a new one for the tool that used it. A key only ever opened your own account.
Does a lead added through the API email me?
Yes, by default, the same way a website form lead does. Send notify as false to add the lead without the email.
How fast do webhooks arrive?
Within about two minutes of the record landing. Several records that arrive together are sent oldest first.
Can I get leads from before I subscribed?
A webhook starts from the moment you subscribe and never replays history. For older leads, call GET /v1/leads with days set up to 365.
What happens when I hit the rate limit?
The request answers 429 with retry_after set to 60 seconds. The limit is 120 requests a minute per key, so giving each tool its own key keeps one busy workflow from slowing another.
See how it would run
for your business.
15 minutes with TruLata. We show you what your marketing brings in, what each lead costs, and what we would change first.
Book a demo or start a 7-day free trial
No card. It ends on its own after 7 days unless you add one. See pricing.
New here? See what TruLata is. Prefer to write? Send us the one thing you want to know.
Start here: AI marketing platform · AI marketing software · all-in-one marketing platform · marketing automation software · marketing software for small business.
- Refreshed when you open itLive data on page load, never a monthly PDF
- Counted from your own formsLeads recorded server-side, compared daily with Ads and GA4
- Seen in AI answersHow often ChatGPT, Gemini, Claude, Grok, Manus, Google AI Overviews, Perplexity, Meta AI and DeepSeek name you, measured
- Every send loggedProspect emails leave from a review-first queue, and every send is logged.

