Download OpenAPI specification:
Local Dominator
Heatmap scan endpoints — create one-off grid scans, read their results, and analyze them.
grid_size is the number of pins across the diameter (circle) or side (square), while distance is the distance in meters between each pin.
For example, grid_size: 10 and distance: 100 gives a ~900m diameter.
| text |
string
Filter scans by text(name, keywords, labels) |
| per_page |
integer
Default:
10
Example:
per_page=10
|
| page |
integer
Default:
0
Example:
page=0
|
| start_date |
string
<date>
Example:
start_date=2024-01-01
Retrieve scans that occurred on or after the specified start date (in YYYY-MM-DD format). |
| end_date |
string
<date>
Example:
end_date=2024-08-31
Retrieve scans that occurred on or before the specified end date (in YYYY-MM-DD format). |
| labels |
Array of strings
An array of labels associated with the scan |
{
-
"totalcount":
10,
-
"scans":
[
-
{
-
"keyword":
"plumber
hollywood
fl",
-
"name":
"Ocean
Plumbing
and
Air",
-
"vicinity":
"3220
Stirling
Rd,
Hollywood,
FL
33021",
-
"place_id":
"ChIJ03jJ2Omr2YgRNkx36YLd3q4",
-
"data_id":
"0x88d9abe9d8c978d3:0xaededd82e9774c36",
-
"grid_size":
6,
-
"locations_distance":
1609.344,
-
"shape":
"circle",
-
"creation_timestamp":
"2026-04-10
14:08:50.736785+00",
-
"center_lat":
26.0481,
-
"center_lng":
-80.1819,
-
"average_rank":
5.5,
-
"share_links":
{
-
-
},
-
"run_analysis_map":
{
-
"property1":
{
-
"status":
"Completed",
-
},
-
"property2":
{
-
"status":
"Completed",
-
}
},
-
"content":
[
-
[
-
5,
-
5,
-
5,
-
4,
-
4,
-
8,
-
5
],
-
[
-
5,
-
5,
-
5,
-
3,
-
1,
-
3,
-
2
],
-
[
-
5,
-
5,
-
2,
-
2,
-
2,
-
2,
-
2
],
-
[
-
4,
-
3,
-
2,
-
1,
-
1,
-
2,
-
4
],
-
[
-
3,
-
3,
-
2,
-
2,
-
2,
-
3,
-
2
],
-
[
-
null,
-
3,
-
3,
-
2,
-
2,
-
6,
-
5
],
-
[
-
null,
-
null,
-
null,
-
null,
-
2,
-
2,
-
2
]
],
-
"labels":
[
-
"string"
],
-
"resource_category":
"googleMaps",
-
"scan_uuid":
"xPH5x_SZcmcf8E7FROCNQ",
-
}
]
}
Initiates a scan based on the specified parameters.
|
latitude
required
|
number
<float>
Latitude of the center point from where the scan will be performed. |
|
longitude
required
|
number
<float>
Longitude of the center point from where the scan will be performed. |
|
shape
required
|
string
Enum:
"circle"
"square"
Shape of the scan area, either circle or square. |
|
distance
required
|
integer
<int32>
Distance in meters between adjacent pins in the scan grid. This does not define the total diameter directly. |
|
google_place_id
required
|
string
The PlaceID in
Google. For
example,
|
|
grid_size
required
|
integer
<int32>
<= 21
Defines the number of points on each square side or diameter to perform the search from. Maximum value is 21. |
|
search_terms
required
|
Array of strings
Array of strings representing the search terms to use during the scan. |
| webhook_url |
string
A url where we will POST the results back once the scan is completed. |
| preschedule_analysis |
boolean
Default:
false
When set to true, automatically schedules analysis when the scan is completed. |
| resource_category |
string
Default:
"googleMaps"
Enum:
"googleMaps"
"googleLocalFinder"
The type of scan to perform. Use googleLocalFinder for Google Local Finder results. Defaults to googleMaps. |
{
-
"latitude":
40.712776,
-
"longitude":
-74.005974,
-
"shape":
"circle",
-
"distance":
1000,
-
"google_place_id":
"ChIJgUbEo8cfqokR5lP9_Wh_DaM",
-
"grid_size":
13,
-
"search_terms":
[
-
"coffee
shop",
-
"restaurant"
],
-
-
"preschedule_analysis":
true,
-
"resource_category":
"googleLocalFinder"
}
{
-
"message":
"Scan
creation
started.",
-
"scan_uuid":
"xPH5x_SZcmcf8E7FROCNQ"
}
Returns the details of the scan
specified by scan_id.
|
scan_id
required
|
string
The ID of the scan |
[
-
{
-
"keyword":
"plumber
hollywood
fl",
-
"name":
"Ocean
Plumbing
and
Air",
-
"vicinity":
"3220
Stirling
Rd,
Hollywood,
FL
33021",
-
"place_id":
"ChIJ03jJ2Omr2YgRNkx36YLd3q4",
-
"data_id":
"0x88d9abe9d8c978d3:0xaededd82e9774c36",
-
"grid_size":
6,
-
"locations_distance":
1609.344,
-
"shape":
"circle",
-
"creation_timestamp":
"2026-04-10
14:08:50.736785+00",
-
"center_lat":
26.0481,
-
"center_lng":
-80.1819,
-
"average_rank":
5.5,
-
"share_links":
{
-
-
},
-
"run_analysis_map":
{
-
"property1":
{
-
"status":
"Completed",
-
},
-
"property2":
{
-
"status":
"Completed",
-
}
},
-
"content":
[
-
[
-
5,
-
5,
-
5,
-
4,
-
4,
-
8,
-
5
],
-
[
-
5,
-
5,
-
5,
-
3,
-
1,
-
3,
-
2
],
-
[
-
5,
-
5,
-
2,
-
2,
-
2,
-
2,
-
2
],
-
[
-
4,
-
3,
-
2,
-
1,
-
1,
-
2,
-
4
],
-
[
-
3,
-
3,
-
2,
-
2,
-
2,
-
3,
-
2
],
-
[
-
null,
-
3,
-
3,
-
2,
-
2,
-
6,
-
5
],
-
[
-
null,
-
null,
-
null,
-
null,
-
2,
-
2,
-
2
]
],
-
"labels":
[
-
"string"
],
-
"resource_category":
"googleMaps",
-
"scan_uuid":
"xPH5x_SZcmcf8E7FROCNQ",
-
}
]
The details of each business in every point in the scan.
|
scan_id
required
|
string
The ID of the scan |
[
-
{
-
"scanId":
1,
-
"compressed_grid":
[
-
[
-
[
-
0
]
]
],
-
"detailsArray":
[
-
{
-
"placeId":
"ChIJ03jJ2Omr2YgRNkx36YLd3q4",
-
"dataId":
"0x88d9abe9d8c978d3:0xaededd82e9774c36",
-
"name":
"Ocean
Plumbing
and
Air",
-
"vicinity":
"3220
Stirling
Rd,
Hollywood,
FL
33021",
-
"location":
{
-
"latitude":
26.0481,
-
"longitude":
-80.1819
},
-
"rating":
2.5,
-
"ratingCount":
620,
-
"primaryCategory":
"Plumber",
-
"secondaryCategories":
[
-
"string"
],
-
-
}
],
-
"ids":
[
-
[
-
"string"
]
]
}
]
Initiates or retrieves post-run insights for a scan: ranking context, competitors, and optimization-oriented notes derived from the scan grid.
|
scan_id
required
|
string
The ID of the scan to analyze |
{
-
"scanId":
"xPH5x_SZcmcf8E7FROCNQ",
-
"message":
"Group
was
successfully
analyzed",
-
"analysis":
{
-
"property1":
{
-
"analysis_content":
{
-
"summary":
{
-
"overall_status":
"string",
-
"top_competitors":
[
-
{
-
"name":
"string",
-
"average_rank":
0,
-
"reviews_count":
0,
-
"average_rating":
0,
-
"total_appearances":
0,
-
"performance_summary":
"string",
-
"appearances_position_1":
0,
-
"appearances_position_2":
0,
-
"appearances_position_3":
0
}
],
-
"competitor_analysis":
"string",
-
"competition_overview":
"string",
-
"top_competitor_action_items":
[
-
"string"
]
},
-
"basic_info":
{
-
"grid_size":
0,
-
"scan_date":
"string",
-
"grid_shape":
"string",
-
"business_name":
"string",
-
"primary_keyword":
"string",
-
"locations_amount":
0,
-
"average_position_rank":
0
},
-
"action_plan":
[
-
{
-
"actions":
[
-
"string"
],
-
"category":
"string"
}
],
-
"seo_insights":
{
-
"keyword_uniformity":
"string",
-
"geographic_patterns":
{
-
"weak_zones":
[
-
{
-
"details":
"string",
-
"direction":
"string"
}
],
-
"strong_zones":
[
-
{
-
"details":
"string",
-
"direction":
"string"
}
]
},
-
"directional_patterns":
[
-
{
-
"direction":
"string",
-
"performance":
"string"
}
],
-
"geographic_performance_summary":
"string"
},
-
"opportunity_statement":
"string"
},
-
},
-
"property2":
{
-
"analysis_content":
{
-
"summary":
{
-
"overall_status":
"string",
-
"top_competitors":
[
-
{
-
"name":
"string",
-
"average_rank":
0,
-
"reviews_count":
0,
-
"average_rating":
0,
-
"total_appearances":
0,
-
"performance_summary":
"string",
-
"appearances_position_1":
0,
-
"appearances_position_2":
0,
-
"appearances_position_3":
0
}
],
-
"competitor_analysis":
"string",
-
"competition_overview":
"string",
-
"top_competitor_action_items":
[
-
"string"
]
},
-
"basic_info":
{
-
"grid_size":
0,
-
"scan_date":
"string",
-
"grid_shape":
"string",
-
"business_name":
"string",
-
"primary_keyword":
"string",
-
"locations_amount":
0,
-
"average_position_rank":
0
},
-
"action_plan":
[
-
{
-
"actions":
[
-
"string"
],
-
"category":
"string"
}
],
-
"seo_insights":
{
-
"keyword_uniformity":
"string",
-
"geographic_patterns":
{
-
"weak_zones":
[
-
{
-
"details":
"string",
-
"direction":
"string"
}
],
-
"strong_zones":
[
-
{
-
"details":
"string",
-
"direction":
"string"
}
]
},
-
"directional_patterns":
[
-
{
-
"direction":
"string",
-
"performance":
"string"
}
],
-
"geographic_performance_summary":
"string"
},
-
"opportunity_statement":
"string"
},
-
}
}
}
Scheduled scans — recurring campaigns: list, create, update, or delete a campaign; trigger a run; or bulk-delete runs on a campaign by creation date.
A campaign holds cron scheduling, grid geometry, keywords, and notification settings. Each execution is a run (see Scheduled scan campaign runs).
Returns scheduled scans for the API key owner, with optional filters and pagination. Filter by schedule category, resource category, grid shape, last scan run date range, labels, and free-text search. start_date / end_date are aliases for date_from / date_to (filter on the calendar date of the most recent scan run).
| text |
string
Filter by place name, vicinity, or search term (substring match). |
|
string or Array
of strings
Conjunction
filter: the
campaign
must have
every
label. Send
one
comma-separated
|
|
| resource_category |
string
Enum:
"googleMaps"
"googleLocalFinder"
Filter by Maps vs Local Finder (scheduled scan setting). |
| shape |
string
Enum:
"circle"
"square"
Filter by grid shape. |
| schedule |
string
Enum:
"daily"
"weekly"
"biweekly"
"monthly"
Filter by high-level schedule category (daily, weekly, biweekly, monthly). |
| date_from |
string
<date>
Lower bound on last scan run date (YYYY-MM-DD); scheduled scans that never had a run are included. |
| date_to |
string
<date>
Upper bound on last scan run date (YYYY-MM-DD); scheduled scans that never had a run are included. |
| start_date |
string
<date>
Same as date_from. |
| end_date |
string
<date>
Same as date_to. |
| order_property |
string
Enum:
"date"
"place_name"
"placeName"
"search_term"
"searchTerm"
"average_rank"
"averageRank"
"grid_size"
"size"
"last_run_date"
"lastScan"
"lastRunDate"
"creation_date"
"creationDate"
"next_run"
"nextRunTimestamp"
Sortable
field; maps
to the same
|
| ascending |
string
Enum:
"true"
"false"
Sort direction; default false (descending). |
| per_page |
string^[0-9]+$
Page size as digits only (default 50 if omitted; parsed as a positive integer). |
| page |
string^[0-9]+$
Zero-based page index as digits only (default 0 if omitted; parsed as a non-negative integer). |
{
-
"scheduled_scans":
[
-
{
-
"id":
"550e8400-e29b-41d4-a716-446655440000",
-
"search_term":
"emergency
plumber
hollywood
fl",
-
"place_name":
"Ocean
Plumbing
and
Air",
-
"resource_category":
"googleMaps",
-
"shape":
"circle",
-
"grid_size":
0,
-
"distance":
0,
-
"vicinity":
"string",
-
"center_lat":
0,
-
"center_lng":
0,
-
"preschedule_analysis":
true,
-
-
"in_progress":
true,
-
"scheduling":
"0
9
*
*
1",
-
"scheduling_type":
"weekly",
-
"last_run_date":
"2026-04-10",
-
"next_run_at":
"2019-08-24T14:15:22Z",
-
"labels":
[
-
"string"
],
-
"creation_date":
"2019-08-24",
-
"creation_time":
"string",
-
"share_links":
{
-
-
-
},
-
"last_run_analysis_map":
{
-
"property1":
{
-
"status":
"Completed",
-
},
-
"property2":
{
-
"status":
"Completed",
-
}
}
}
],
-
"total":
12,
-
"page":
0,
-
"per_page":
50
}
Creates a scheduled scan. google_place_id identifies the place. scheduling is a five-field cron (minute, hour, day of month, month, day of week); invalid values return 400. The response includes the new id (UUID). 201 means the resource is available immediately in GET /v1/scheduled-scans/{scheduled_scan_id}; 202 means the request was accepted and the same response body shape applies, but the campaign may not be readable yet. For 202, use either GET /v1/scheduled-scans/{scheduled_scan_id} checks with the returned id, or webhook_url delivery if configured. Each execution of the campaign is a scan run.
|
google_place_id
required
|
string
Google Place ID for the business location. |
|
latitude
required
|
number
Grid center latitude. |
|
longitude
required
|
number
Grid center longitude. |
|
shape
required
|
string
Enum:
"circle"
"square"
|
|
distance
required
|
integer
>= 1
Distance in meters between adjacent pins. |
|
grid_size
required
|
integer
[ 1 ..
21 ]
|
|
required
|
Array of strings or
objects
non-empty
unique
Keywords for this campaign. Most clients send a list of plain strings (each keyword is active). You may instead send objects with term and optional status (active / inactive); when status is omitted on an object, it defaults to active. Duplicate terms (case-insensitive) are not allowed. Strings and objects may be mixed in one array. |
|
scheduling
required
|
string
Five-field cron expression (minute, hour, day of month, month, day of week) for recurring runs. Must be accepted by the API; invalid values return 400. |
| notify |
boolean
Email notifications when runs complete. |
| run_now |
boolean
If true, triggers an immediate manual run after creation. |
| labels |
Array of strings
|
| skippable |
boolean
Used for biweekly-style recurrence when combined with your scheduling expression. |
| preschedule_analysis |
boolean
When true, analysis is scheduled when runs complete. When omitted, the server uses the default for new tasks (typically true); send false to disable. |
| alias |
string
Optional display name for the scheduled scan. |
| resource_category |
string
Enum:
"googleMaps"
"googleLocalFinder"
Optional. Which search surface recurring runs use. |
| webhook_url |
string
<uri>
<=
2048 characters
^https?://
Optional.
http
or
https
absolute URL
only (request
validation:
|
{
-
"google_place_id":
"ChIJ03jJ2Omr2YgRNkx36YLd3q4",
-
"latitude":
26.0481,
-
"longitude":
-80.1819,
-
"shape":
"circle",
-
"distance":
1,
-
"grid_size":
1,
-
"search_terms":
[
-
"plumber
hollywood
fl",
-
{
-
"term":
"emergency
plumber
hollywood
fl",
-
"status":
"inactive"
}
],
-
"scheduling":
"0
9
*
*
1",
-
"notify":
true,
-
"run_now":
true,
-
"labels":
[
-
"string"
],
-
"skippable":
true,
-
"preschedule_analysis":
true,
-
"alias":
"string",
-
"resource_category":
"googleMaps",
-
}
{
-
"message":
"Scheduled
scan
created
successfully.",
-
"id":
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
}
Starts a new scan run immediately (manual execution). Processing is asynchronous; 200 means the run was accepted.
|
scheduled_scan_id
required
|
string
<uuid>
Opaque scheduled scan identifier (same id as in list/detail responses). |
{
-
"message":
"Run
started."
}
Returns
scheduled scan
metadata and the list of
scan runs (run_uuid
per run). Optional
date_range filters
runs (default
3M). Campaign
share_links reflect
the latest completed
(notified) run in
the filtered window that has heatmap
rows with shareable static URLs;
run-level
share_links use the
same per-run resolution (no
campaign_link on
run objects).
|
scheduled_scan_id
required
|
string
<uuid>
Opaque scheduled scan identifier (same id as in GET /v1/scheduled-scans list items). |
| date_range |
string
Default:
"3M"
Enum:
"MAX"
"1Y"
"6M"
"3M"
"1M"
Limits which
scan
runs
appear in
runs
(by run
creation
time
relative to
the
campaign’s
latest run),
using the
same window
tokens as
the
dashboard
task-runs
|
{
-
"id":
"550e8400-e29b-41d4-a716-446655440000",
-
"search_term":
"emergency
plumber
hollywood
fl",
-
"place_name":
"Ocean
Plumbing
and
Air",
-
"resource_category":
"googleMaps",
-
"shape":
"circle",
-
"grid_size":
0,
-
"distance":
0,
-
"vicinity":
"string",
-
"center_lat":
0,
-
"center_lng":
0,
-
"preschedule_analysis":
true,
-
-
"in_progress":
true,
-
"scheduling":
"0
9
*
*
1",
-
"scheduling_type":
"weekly",
-
"last_run_date":
"2026-04-10",
-
"next_run_at":
"2019-08-24T14:15:22Z",
-
"labels":
[
-
"string"
],
-
"creation_date":
"2019-08-24",
-
"creation_time":
"string",
-
"share_links":
{
-
-
-
},
-
"last_run_analysis_map":
{
-
"property1":
{
-
"status":
"Completed",
-
},
-
"property2":
{
-
"status":
"Completed",
-
}
},
-
"runs":
[
-
{
-
"run_uuid":
"550e8400-e29b-41d4-a716-446655440000",
-
"created_at":
"2026-04-10T08:00:00.000Z",
-
"average_rank":
4.2,
-
"record_count":
9,
-
"manual":
false,
-
"share_links":
{
-
-
},
-
"run_analysis_map":
{
-
"property1":
{
-
"status":
"Completed",
-
},
-
"property2":
{
-
"status":
"Completed",
-
}
}
}
]
}
Updates this scheduled scan (recurrence, grid, keywords, notifications, analysis option). Omitted fields stay unchanged. Same validation rules as create where applicable. resource_category and is_placed_manually cannot be changed — including either field returns 400. Deleted scheduled scans are not found (404).
|
scheduled_scan_id
required
|
string
<uuid>
Opaque scheduled scan identifier (same id as in GET /v1/scheduled-scans list items). |
|
Array of strings or
objects
(ScheduledScanPatchSearchTerm)
non-empty
Same rules as
search_terms
on create: array
of strings
and/or
|
|
| scheduling |
string
Five-field cron expression; must be accepted by the API (400 if invalid). |
| skippable |
boolean
When
|
| grid_size |
integer
[ 1 ..
21 ]
|
| distance |
integer
>= 1
|
| shape |
string
Enum:
"circle"
"square"
|
| latitude |
number
|
| longitude |
number
|
| notify |
boolean
|
| preschedule_analysis |
boolean
|
| webhook_url |
string or
null
<uri>
null
or
""
clears the
webhook. A
non-empty string
must be
http
or
https
and max 2048
characters (same
as
|
| selected_day_of_week |
integer
[ 0 .. 6
]
Day of week (0 =
Sunday … 6 =
Saturday) for
biweekly
next_run_at
anchoring when
skippable
is
|
| selected_hour |
integer
[ 0 ..
23 ]
Local hour
(scheduled scan
timezone) for
biweekly
next_run_at
when
skippable
is
|
| selected_minute |
integer
[ 0 ..
59 ]
Local minute for
biweekly
next_run_at
when
skippable
is
|
{
-
"search_terms":
[
-
"plumber
hollywood
fl",
-
"emergency
plumber
hollywood
fl"
],
-
"scheduling":
"0
9
*
*
1",
-
"notify":
true
}
{
-
"message":
"Scheduled
scan
updated
successfully.",
-
"id":
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
}
Deletes this scheduled scan and its associated data. It no longer appears in GET /v1/scheduled-scans or GET …/scheduled-scans/{scheduled_scan_id}. Repeating DELETE returns 404.
|
scheduled_scan_id
required
|
string
<uuid>
Opaque scheduled scan identifier (same id as in GET /v1/scheduled-scans list items). |
{
-
"message":
"Scheduled
scan
deleted
successfully."
}
Deletes scan runs for this scheduled scan, selected by when each run started (UTC). creation_date is a filter: only runs whose created_at falls on that calendar day (UTC YYYY-MM-DD) are removed. The calendar day is not a resource—only runs are deleted.
|
scheduled_scan_id
required
|
string
<uuid>
Opaque scheduled scan identifier. |
|
creation_date
required
|
string
<date>
Filter: UTC calendar day (YYYY-MM-DD). Matches the date part of each scan run’s created_at. |
{
-
"message":
"Scheduled
scan
runs
deleted
for
the
selected
run-creation
date.",
-
"creation_date":
"2025-04-14",
-
"runs_deleted":
2
}
Scheduled scans — runs: each run is one execution of a campaign. Fetch scan rows or compressed grid results for a run, or delete a single run.
Run identifiers (run_uuid) come
from the campaign detail response and run
listings.
Returns compressed grid
results for this
scan run (all
keywords; camelCase keys and
compressed_grid).
|
run_id
required
|
string
<uuid>
Scan run
identifier
( |
[
-
{
-
"scanId":
1,
-
"compressed_grid":
[
-
[
-
[
-
0
]
]
],
-
"detailsArray":
[
-
{
-
"placeId":
"ChIJ03jJ2Omr2YgRNkx36YLd3q4",
-
"dataId":
"0x88d9abe9d8c978d3:0xaededd82e9774c36",
-
"name":
"Ocean
Plumbing
and
Air",
-
"vicinity":
"3220
Stirling
Rd,
Hollywood,
FL
33021",
-
"location":
{
-
"latitude":
26.0481,
-
"longitude":
-80.1819
},
-
"rating":
2.5,
-
"ratingCount":
620,
-
"primaryCategory":
"Plumber",
-
"secondaryCategories":
[
-
"string"
],
-
-
}
],
-
"ids":
[
-
[
-
"string"
]
]
}
]
Returns one scan row per search term for this scan run (ranks, links, map fields). Each object is a single-keyword scan inside the run. Each row includes scheduled_scan_id, run_uuid, and run_analysis_map (per-keyword SEO report status, same key shape as run objects under GET /v1/scheduled-scans/{id}).
|
run_id
required
|
string
<uuid>
Scan run
identifier
( |
[
-
{
-
"keyword":
"plumber
hollywood
fl",
-
"name":
"Ocean
Plumbing
and
Air",
-
"vicinity":
"3220
Stirling
Rd,
Hollywood,
FL
33021",
-
"place_id":
"ChIJ03jJ2Omr2YgRNkx36YLd3q4",
-
"data_id":
"0x88d9abe9d8c978d3:0xaededd82e9774c36",
-
"grid_size":
6,
-
"locations_distance":
1609.344,
-
"shape":
"circle",
-
"creation_timestamp":
"2026-04-10
14:08:50.736785+00",
-
"center_lat":
26.0481,
-
"center_lng":
-80.1819,
-
"average_rank":
5.5,
-
"share_links":
{
-
-
},
-
"run_analysis_map":
{
-
"property1":
{
-
"status":
"Completed",
-
},
-
"property2":
{
-
"status":
"Completed",
-
}
},
-
"content":
[
-
[
-
5,
-
5,
-
5,
-
4,
-
4,
-
8,
-
5
],
-
[
-
5,
-
5,
-
5,
-
3,
-
1,
-
3,
-
2
],
-
[
-
5,
-
5,
-
2,
-
2,
-
2,
-
2,
-
2
],
-
[
-
4,
-
3,
-
2,
-
1,
-
1,
-
2,
-
4
],
-
[
-
3,
-
3,
-
2,
-
2,
-
2,
-
3,
-
2
],
-
[
-
null,
-
3,
-
3,
-
2,
-
2,
-
6,
-
5
],
-
[
-
null,
-
null,
-
null,
-
null,
-
2,
-
2,
-
2
]
],
-
"labels":
[
-
"string"
],
-
"resource_category":
"googleMaps",
-
"scan_uuid":
"xPH5x_SZcmcf8E7FROCNQ",
-
"scheduled_scan_id":
"550e8400-e29b-41d4-a716-446655440000",
-
"run_uuid":
"82e97fd8-71b6-4da3-b7dd-fa235ab9ec89"
}
]
Deletes this scan run (soft-delete). Does not delete the scheduled scan.
|
run_id
required
|
string
<uuid>
Scan run
identifier
( |
{
-
"message":
"Scheduled
scan
run
deleted
successfully."
}
Create a business-listings prospect scan across directories and, if the results warrant it, order a fix that resubmits correct data across 50 or 100 directories.
Creates a business record and kicks off an asynchronous listings scan across directories. Free — no credits are charged.
The scan typically takes 10–30
seconds. Poll
GET
/v1/listings/prospect/{search_id}
until status is
completed.
Rate-limited to 10 requests per hour per API key.
|
business_name
required
|
string
|
|
address
required
|
string
|
| city |
string
|
| state |
string
|
| zip |
string
|
| phone |
string
|
| website |
string
<uri>
|
| country |
string
Default:
"US"
|
{
-
"business_name":
"Acme
Inc",
-
"address":
"123
Main
St",
-
"city":
"New
York",
-
"state":
"NY",
-
"zip":
"10001",
-
"phone":
"+1234567890",
-
-
"country":
"US"
}
{
-
"id":
"f47ac10b-58cc-4372-a567-0e02b2c3d479",
-
"order_number":
"ABC123",
-
"status":
"pending"
}
| page |
integer
Default:
1
|
| limit |
integer
<=
100
Default:
20
|
{
-
"data":
[
-
{
-
"id":
"f47ac10b-58cc-4372-a567-0e02b2c3d479",
-
"business_name":
"string",
-
"address":
"string",
-
"status":
"pending",
-
"total_listings":
42,
-
"correct_listings":
12,
-
"order_number":
"ABC123",
-
"created_at":
"2019-08-24T14:15:22Z",
-
"fix_requested":
true,
-
"fix_plan":
"50",
-
"payment_status":
"unpaid",
-
"campaign_progress":
"ordered"
}
],
-
"page":
1,
-
"limit":
20,
-
"total":
47
}
|
search_id
required
|
string
Prospect id
returned
from
|
{
-
"id":
"f47ac10b-58cc-4372-a567-0e02b2c3d479",
-
"business_name":
"string",
-
"address":
"string",
-
"status":
"pending",
-
"total_listings":
42,
-
"correct_listings":
12,
-
"order_number":
"ABC123",
-
"created_at":
"2019-08-24T14:15:22Z",
-
"fix_requested":
true,
-
"fix_plan":
"50",
-
"payment_status":
"unpaid",
-
"campaign_progress":
"ordered",
-
"city":
"string",
-
"state":
"string",
-
"zip":
"string",
-
"phone":
"string",
-
"website":
"string",
-
"country":
"string",
-
"results":
[
-
{
-
"directory_name":
"GOOGLE",
-
"listing_url":
"string",
-
"name_status":
"correct",
-
"address_status":
"correct",
-
"phone_status":
"correct",
-
"website_status":
"correct",
-
"sync_status":
"found"
}
]
}
Charges credits from the caller's wallet and submits a fix order for the given prospect.
"50"
costs
55,650 credits
and fixes up to 50 directories.
"100"
costs
96,500 credits
and fixes up to 100 directories.
If the upstream submission fails,
the charge is automatically refunded
via a compensating
manualAdd transaction
and the upstream error is returned.
Idempotent: a second call for the
same search_id returns
409 and does not
charge.
|
search_id
required
|
string
|
|
plan
required
|
string
Enum:
"50"
"100"
|
{
-
"search_id":
"f47ac10b-58cc-4372-a567-0e02b2c3d479",
-
"plan":
"50"
}
{
-
"order_id":
"string",
-
"order_number":
"string",
-
"status":
"ordered",
-
"plan":
"50",
-
"credits_charged":
55650
}
|
search_id
required
|
string
|
{
-
"search_id":
"string",
-
"order_number":
"string",
-
"campaign_progress":
"ordered",
-
"plan":
"50",
-
"progress":
{
-
"total":
0,
-
"live":
0,
-
"existing":
0,
-
"pending":
0,
-
"to_do":
0
}
}
Partner-facing AI Tracker endpoints
available through the Public API gateway.
Endpoints are authenticated by
ld_... API keys and include
server-side credit charging where
applicable.
{
-
"external_user_id":
"string",
-
"display_name":
"string",
-
"role":
"string",
-
"is_team":
true,
-
"created_at":
"string",
-
"total_campaigns":
0,
-
"active_campaigns":
0,
-
"total_scans":
0,
-
"total_credits_consumed":
0
}
Generates prompt previews for the given keywords. Does not create a campaign or charge credits. Same rate limits as campaign commit.
|
name
required
|
string
|
|
domain
required
|
string
|
| location |
string
|
| engines |
Array of strings
Items
Enum:
"chatgpt"
"gemini"
"google_ai_mode"
"perplexity"
"claude"
"grok"
|
|
keywords
required
|
Array of strings
non-empty
|
{
-
"name":
"string",
-
"domain":
"string",
-
"location":
"string",
-
"engines":
[
-
"chatgpt"
],
-
"keywords":
[
-
"string"
]
}
{
}
Two-step flow: commit after preview.
On the Public API side, credits are
reserved up to the per-run maximum,
then adjusted to match actual
prompts_count returned
by the AI Tracker backend.
|
name
required
|
string
|
|
domain
required
|
string
|
| location |
string
|
| engines |
Array of strings
Items
Enum:
"chatgpt"
"gemini"
"google_ai_mode"
"perplexity"
"claude"
"grok"
|
|
required
|
Array of objects
[ 1 ..
50 ] items
|
{
-
"name":
"string",
-
"domain":
"string",
-
"location":
"string",
-
"engines":
[
-
"chatgpt"
],
-
"prompts":
[
-
{
-
"keyword":
"string",
-
"prompt":
"string"
}
]
}
{
-
"id":
"string",
-
"name":
"string",
-
"domain":
"string",
-
"status":
"string",
-
"prompts_count":
0,
-
"billable_prompts":
0,
-
"credits_per_prompt":
100,
-
"credits_charged":
0
}
|
id
required
|
string
|
|
keywords
required
|
Array of strings
non-empty
|
{
-
"keywords":
[
-
"string"
]
}
{
}
|
id
required
|
string
|
|
required
|
Array of objects
[ 1 ..
50 ] items
|
{
-
"prompts":
[
-
{
-
"keyword":
"string",
-
"prompt":
"string"
}
]
}
{
-
"billable_prompts":
0,
-
"credits_per_prompt":
0,
-
"credits_charged":
0
}
|
id
required
|
string
|
{
-
"triggered":
true,
-
"campaign_id":
"string",
-
"scan_jobs_count":
0,
-
"status":
"string",
-
"billable_prompts":
0,
-
"credits_per_prompt":
100,
-
"credits_charged":
0
}