Google Local Services Ads leads
Leads generated by Local Services Ads (phone calls, messages, bookings),
read live from Google's local_services_lead resource, newest first.
No persistence: Google is the source of truth and lead/credit statuses
keep changing server-side. Google never returns healthcare-category
leads, and WIPED_OUT leads arrive with contact erased (contact is
null). Draws on the shared Google Ads operations budget.
API key authentication - use your Zernio API key as a Bearer token
In: header
Query Parameters
Google ads SocialAccount id.
Numeric Google Ads customer id (no dashes). Defaults to the account's connected customer.
Leads created at/after this day.
dateLeads created at/before this day.
date"PHONE_CALL" | "MESSAGE" | "BOOKING"Google LocalServicesLeadStatus enum value (e.g. NEW, BOOKED, WIPED_OUT).
true = only leads Google charged for.
Cursor from paging.nextPageToken of the previous page.
Response Body
application/json
application/json
application/json
import Zernio from '@zernio/node';const zernio = new Zernio({ apiKey: process.env.ZERNIO_API_KEY });const { data } = await zernio.adinsights.listLocalServicesLeads({ query: { accountId: 'account_abc123', },});console.log(data);{
"customerId": "string",
"data": [
{
"id": "string",
"leadType": "string",
"categoryId": "string",
"serviceId": "string",
"contact": {
"consumerName": "string",
"email": "string",
"phoneNumber": "string"
},
"status": "string",
"createdTime": "string",
"locale": "string",
"charged": true,
"creditState": "string",
"creditStateLastUpdate": "string"
}
],
"paging": {
"nextPageToken": "string"
}
}{
"error": "string",
"type": "invalid_request_error",
"code": "string",
"param": "string",
"platform": "string",
"platformError": {},
"details": {}
}{
"error": "Unauthorized"
}Conversations of a Local Services lead GET
Conversation entries of one Local Services lead: phone calls (duration, recording URL) and messages (text, attachment URLs), oldest first. Read live from `local_services_lead_conversation`, always scoped to a single lead. Call-recording URLs require read access on the Google Ads account. Draws on the shared Google Ads operations budget.
Submit an async insights report run POST
Submits an asynchronous Meta insights report. Same query surface as GET /v1/ads/insights, but in the JSON body; Meta processes the report server-side, which is the right choice for long ranges or large accounts where the sync query is slow or rate-limited. Returns a `reportRunId` to poll via GET /v1/ads/insights/reports/{reportRunId}.