Local SEO audit of a location
https://seolyticize.com /api/v1/tools/get_local_seo_audit Scores one location's local SEO 0–100 (a heuristic, said so in the answer) from six weighted parts, each check full, partial or low with the reason, or null when not measured — then left out and the other weights rescaled: the Google Business Profile (25: primary category against the homepage, about four secondary categories, posts, photos, Q&A, hours), reviews (20: at least 10, the rating, the last three months, six months' monthly flow and gaps over three weeks, owner response rate, and a fake-review flag when two of six patterns match), the site (20: city and service in the title and H1, visible NAP, a tel: link, a map embed, location pages over 60% unique by the city-swap test, gates at 30 and 50 location pages), NAP and citations (15, the check_nap_consistency comparison; directories: true adds the directory citations), LocalBusiness schema (10: a subtype, geo to five decimals, priceRange under 100 characters, a unique @id per location with branchOf) and links (10); plus a rating spread that leans to five stars, review gating, service pages, location pages within three clicks, hours on the site, trust badges, the PostalAddress parts, the subtype that fits the vertical, areaServed, retired VehicleListing and SpecialAnnouncement markup and, with duplicates, other listings at the same address or phone. gbpChecklist scores the 25-field profile checklist (2/1/0 per field, null where DataForSEO returns nothing — verified status, Q&A, videos, products, photo dates — weighted by vertical, banded 90/75/50/25); grid reads back the latest grid scan for the main service (share of local voice, visibility points, the worst quadrant, a heatmap); mapsHealth combines profile 25, grid 20, reviews 20, NAP 15, schema 10 and rival standing 10. Detects storefront, service-area business (which skips the map and address checks) or hybrid, and the vertical; adds listing completeness 0–100 and, with competitorRadiusKm, the competitors per km² in the primary category. Reviews come from sync_local_reviews; posts from a get_business_posts task passed as postsTaskId. Answers 'how good is our local SEO' and 'what should we fix first for the map pack'. useListing reads the live listing and its Q&A, and competitorRadiusKm one business search, all paid: quote with estimate_cost. Free with useListing false and competitorRadiusKm 0.
Parameters
Idempotency-KeystringheaderRequest body
application/json
clientIdstringrequiredlocationIdstringrequireduseListingbooleanpostsTaskIdstringcompetitorRadiusKmnumberdirectoriesbooleanduplicatesbooleancitystringservicestringmodelstringmaxCostMicrosintegerdryRunboolean{
"clientId": "string",
"locationId": "string",
"useListing": true,
"postsTaskId": null,
"competitorRadiusKm": 5,
"directories": false,
"duplicates": false,
"city": null,
"service": null,
"model": "auto",
"maxCostMicros": 0,
"dryRun": true
}Code samples
cURL
curl -X POST "https://seolyticize.com/api/v1/tools/get_local_seo_audit" \
-H "Authorization: Bearer $SEOLYTICIZE_API_KEY" \
-H "Idempotency-Key: <value>" \
-H "Content-Type: application/json" \
-d '{"clientId":"string","locationId":"string","useListing":true,"postsTaskId":null,"competitorRadiusKm":5,"directories":false,"duplicates":false,"city":null,"service":null,"model":"auto","maxCostMicros":0,"dryRun":true}'TypeScript
Python
Go
PHP
Ruby
Java
Responses
data, and its meta.Example
{
"data": {},
"meta": {
"requestId": "string",
"costMicros": 0,
"cached": true,
"cachedFrom": "string",
"dataAsOf": "string",
"sources": [
"string"
],
"partial": true,
"next": [
{
"tool": "string",
"args": {},
"why": "string"
}
],
"nextCursor": "string",
"dryRun": true
}
}Schema
datarequiredmetaobjectrequiredShow child parameters
requestIdstringrequiredcostMicrosintegerrequiredcachedbooleanrequiredcachedFromstringdataAsOfstringsourcesstring[]partialbooleanrequirednextobject[]requiredShow child parameters
toolstringargsobjectwhystringnextCursorstringdryRunbooleanX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-Request-IdstringExample
{
"error": "string",
"code": "string",
"next": "string",
"requestId": "string"
}Schema
errorstringrequiredcodestringnextstringrequestIdstringX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/get_local_seo_audit
WWW-AuthenticatestringSame as 400 · POST /api/v1/tools/get_local_seo_audit
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/get_local_seo_audit
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/get_local_seo_audit
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/get_local_seo_audit
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/get_local_seo_audit
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerRetry-AfterintegerSame as 400 · POST /api/v1/tools/get_local_seo_audit
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-Resetinteger