Api

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.

Get a key See the endpoints

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.

Your automations
New leadout to Slack, a sheet or your CRM
Lead from elsewherein, on the Leads tab
Won or lostwritten back to the lead
New blog postout once it is published

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.

Zapier, Make and the TruLata API
Make a keyowner or admin, on the Integrations tab
Shown oncecopy it when it appears
Opensthis account only
Revokeon the same card
Keysup to 10 per account

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.

Connect today
ZapierWebhooks by Zapier; our own app is in review
Makewebhook and HTTP modules
n8nWebhook and HTTP Request nodes
PipedreamHTTP trigger and request step
Your codeany HTTPS request with a header

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.

Delivery
Eventslead.created, lead.status_changed, post.published
Whenwithin about two minutes
Orderoldest first
410 Goneunsubscribed
Ten failures in a rowswitched off

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.

API reference

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"

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"
Webhook events

Three events, one shape.

EventFires whenThe record it carries
lead.createdA new lead reaches your Leads tab, including a lead added through the APIThe lead, with the fields listed below
lead.status_changedA lead's outcome is set or changed, on the Leads tab or through the API. Each status fires once, so contacted then won fires twiceThe lead, with its new status and status_note
post.publishedA blog post is publishedThe post: id, title, url, excerpt, image_url, target_search, published_at

Lead fields

Lead fieldWhat it holdsExample
idA stable id for the lead. Use it to set an outcomeld_7c2e9b41a0d35f86e214
created_atWhen the lead arrived, ISO 8601 with its offset2026-10-21T14:32:00-04:00
name, email, phoneWho it is and how to reach themcasey@example.com
service, messageWhat they asked for, in their wordsDrain cleaning
town, pageWhere they are and the page they wrote from, where knownhttps://example.com/drain-cleaning
sourceWhere the lead came from, or the source you sent with itZapier
qualityA quality label where one is set: qualified, unqualified or likely_junkqualified
status, status_noteThe outcome and its note, empty until one is setwon
Webhook payload

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 spec

The API, in one table.

WhatHow it worksDetail
Base addresshttps://trulata-product-api.onrender.com/v1Every endpoint on this page sits under it
AuthenticationAuthorization: Bearer tl_live_... or X-API-KeyEvery request
KeysMade on the Integrations tab by the owner or an adminUp to 10 per account, shown once, revocable on the same card
ScopeOne key opens one accountNothing else
Rate limit120 requests a minute per key429 with retry_after when exceeded
Leads per callUp to 100, newest firstLast 30 days by default, up to 365
Webhook eventslead.created, lead.status_changed, post.publishedDelivered within about two minutes, oldest first
SubscriptionsUp to 50 per key410 unsubscribes; ten failures in a row switches one off
ErrorsJSON with ok false and a plain sentenceReal HTTP status: 400, 401, 404, 429, 503
One key, one account

A key opens the account that made it and nothing else, and the card that made it can revoke it.

FAQ

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.