API Documentation

REST endpoints

One endpoint for each thing you can do: read your account, businesses, keywords, scans, reviews and listings, or start scans.

Base URL: https://citednearby.com. Requests and answers are JSON.

Every endpoint answers with your own account's data inside a data field. Ids are UUIDs. Each one gives the same data as the MCP tool of the same name, so you can switch between them freely.

The POST endpoints start scans and use credits, charged exactly as in the dashboard. They need an API key with "Can start scans" ticked, take a JSON body and answer 202 straight away: the scans run in the background, usually for 1 to 3 minutes. Follow them with GET /api/v1/scans/{id} until the status is completed.

EndpointWhat it gives
GET /api/v1/me Who the API key belongs to.
GET /api/v1/account Your credits, plan, the AI engines it includes and what each kind of scan costs.
GET /api/v1/businesses Every business in your account.
GET /api/v1/businesses/{business_id} One business with its overview across maps, AI, Web Search, reviews, listings and campaigns.
GET /api/v1/businesses/{business_id}/reviews A business' review profiles per site and its latest reviews.
GET /api/v1/businesses/{business_id}/listings A business' citation audit, Google listing watch and backlink gaps.
GET /api/v1/keywords Your tracked keywords with their latest results.
GET /api/v1/keywords/{keyword_id}/history A keyword's finished scans in date order, to chart it over time.
GET /api/v1/campaigns Your campaigns with their schedule, keywords and what a run costs.
GET /api/v1/scans Your scans, newest first, with filters.
GET /api/v1/scans/{scan_id} One scan in full: settings, figures, the grid of ranks and competitors (maps), brands and sources (AI) or the results above you (Web Search).
POST /api/v1/scans/map Start a Google Maps geo-grid scan of a keyword.
POST /api/v1/scans/ai Ask AI engines a customer's question and see whether they recommend the business.
POST /api/v1/scans/web-search Check where the business' website ranks in Google's regular results.
POST /api/v1/scans/{scan_id}/rescan Run an earlier scan again with the same settings.
POST /api/v1/campaigns/{campaign_id}/run Run a campaign now, outside its schedule.
GET

/api/v1/me

Who the API key belongs to, and what the key can do. A good first call to check that a new key works.

No parameters.

Example request

curl
curl https://citednearby.com/api/v1/me \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Accept: application/json"
JSON
{ "data": { "id": 123, "name": "Jane Smith", "email": "[email protected]", "api_key": { "name": "My script", "abilities": [ "read", "scan" ], "expires_at": null } } }
FieldDescription
data.idYour user id.
data.nameYour name.
data.emailYour email address.
data.api_key.nameThe name you gave the key.
data.api_key.abilitiesWhat the key can do: read, and scan if "Can start scans" was ticked.
data.api_key.expires_atWhen the key stops working (ISO 8601), or null if it does not expire.
JSON
{ "message": "Unauthenticated." }
GET

/api/v1/account

Your credits, plan, the AI engines it includes and what each kind of scan costs.

Returns: The signed-in account: name, credit balance, plan, monthly credits, the AI engines the plan can scan, how many businesses are used and allowed, whether this connection can start scans, and what scans cost in credits (per map scan by grid size, per AI answer, per Web Search page). Call this first, and before a large scan. Same data as the MCP tool get_account.

No parameters.

Example request

curl
curl "https://citednearby.com/api/v1/account" \ -H "Authorization: Bearer YOUR_API_KEY"
JSON
{ "data": { "name": "Alex Rivera", "credits_balance": 4945, "plan": "Free", "monthly_credits": 300, "ai_engines_available": [ { "id": "google_ai_overview", "name": "Google AI Overviews" }, { "id": "chatgpt", "name": "ChatGPT" } ], "businesses": { "used": 1, "allowed": 1 }, "can_start_scans": true, "costs": { "map_scan_credits_by_grid_size": { "3x3": 9, "5x5": 25, "7x7": 49, "9x9": 81, "11x11": 121, "13x13": 169, "15x15": 225, "17x17": 289, "19x19": 361, "21x21": 441 }, "ai_answer_credits": 1, "web_search_page_credits": 1, "web_search_default_check_credits": 5, "web_search_enabled": true } } }

Lists are cut to 3 items here; real answers have them all.

GET

/api/v1/businesses

Every business in your account.

Returns: Every business in the account: id, name, category, address, website, phone, how many keywords are tracked, its latest finished map scan in one line, and a dashboard link. The business id is what the other tools take. Same data as the MCP tool list_businesses.

No parameters.

Example request

curl
curl "https://citednearby.com/api/v1/businesses" \ -H "Authorization: Bearer YOUR_API_KEY"
JSON
{ "data": { "count": 1, "businesses": [ { "id": "4130d4b5-f65a-4b38-8fa2-db5d69fa21eb", "name": "Slice & Crust Midtown", "category": "Pizza restaurant", "address": "250 W 36th St, New York, NY 10018", "website": "https://www.example.com/slice-crust-midtown", "phone": "+1 212-555-0142", "keywords": 3, "latest_map_scan": { "id": "ff6e4435-5d73-4701-8dab-131c52b6b06b", "keyword": "pizza delivery", "date": "2026-10-22T22:49:17+00:00", "atrp": 6.7, "local_visibility_percent": 40 }, "url": "https://citednearby.com/dashboard/businesses/4130d4b5-f65a-4b38-8fa2-db5d69fa21eb" } ] } }
GET

/api/v1/businesses/{business_id}

One business with its overview across maps, AI, Web Search, reviews, listings and campaigns.

Returns: One business with its overview: details, what needs attention, its keywords with their latest results per platform, campaigns, review rating per site, listing watch status, the latest citation audit summary, and a dashboard link. The best single call for "how is this business doing". Same data as the MCP tool get_business.

Parameter In Type Description
business_id path string The business id (UUID) from GET /api/v1/businesses.

Example request

curl
curl "https://citednearby.com/api/v1/businesses/BUSINESS_ID" \ -H "Authorization: Bearer YOUR_API_KEY"
JSON
{ "data": { "id": "4130d4b5-f65a-4b38-8fa2-db5d69fa21eb", "name": "Slice & Crust Midtown", "category": "Pizza restaurant", "address": "250 W 36th St, New York, NY 10018", "website": "https://www.example.com/slice-crust-midtown", "phone": "+1 212-555-0142", "url": "https://citednearby.com/dashboard/businesses/4130d4b5-f65a-4b38-8fa2-db5d69fa21eb", "needs_attention": [ { "area": "Listings", "text": "1 listing shows a wrong name, address or phone number.", "url": "https://citednearby.com/dashboard/businesses/4130d4b5-f65a-4b38-8fa2-db5d69fa21eb/citations" }, { "area": "Reviews", "text": "2 reviews of 1 to 3 stars from the last 90 days have no reply.", "url": "https://citednearby.com/dashboard/businesses/4130d4b5-f65a-4b38-8fa2-db5d69fa21eb/reviews" } ], "keywords": [ { "id": "6a061c7f-235e-4523-90af-7fe0ccb8336e", "business": { "id": "4130d4b5-f65a-4b38-8fa2-db5d69fa21eb", "name": "Slice & Crust Midtown" }, "keyword": "best pizza near me", "platform": "chatgpt", "platform_label": "ChatGPT", "sample": "5 answers about Midtown, New York, NY", "metric": "mention_rate_percent", "latest": 60, "previous": null, "change": null, "last_scan_at": "2026-10-22T22:49:17+00:00", "scan_count": 1, "url": "https://citednearby.com/dashboard/tracked-keywords/6a061c7f-235e-4523-90af-7fe0ccb8336e/ai" }, { "id": "b186ea57-9558-494b-86f9-e16d7e32f12e", "business": { "id": "4130d4b5-f65a-4b38-8fa2-db5d69fa21eb", "name": "Slice & Crust Midtown" }, "keyword": "pizza", "platform": "google_maps", "platform_label": "Google Maps", "sample": "3 × 3 grid · 1 mi radius", "metric": "atrp", "latest": null, "previous": null, "change": null, "last_scan_at": null, "scan_count": 0, "url": "https://citednearby.com/dashboard/tracked-keywords/b186ea57-9558-494b-86f9-e16d7e32f12e" }, { "id": "78dafef5-d990-4baa-8eef-01e2805af5a3", "business": { "id": "4130d4b5-f65a-4b38-8fa2-db5d69fa21eb", "name": "Slice & Crust Midtown" }, "keyword": "pizza delivery", "platform": "google_maps", "platform_label": "Google Maps", "sample": "5 × 5 grid · 2 mi radius", "metric": "atrp", "latest": 6.7, "previous": 6.7, "change": 0, "last_scan_at": "2026-10-22T22:49:17+00:00", "scan_count": 2, "url": "https://citednearby.com/dashboard/tracked-keywords/78dafef5-d990-4baa-8eef-01e2805af5a3" } ], "maps": { "keywords": 2, "scans": 3, "latest_atrp": 6.7, "atrp_change": 0, "local_visibility_percent": 40, "last_scan_at": "2026-10-22T22:49:17+00:00" }, "web_search": { "enabled": true, "why_not": null, "keywords": 0, "best_position": null, "best_keyword": null }, "ai_visibility": { "has_scans": true, "mention_rate_percent": 60, "answers": 5, "answers_naming_business": 3, "best_platform": "ChatGPT", "top_competing_brand": "Bella Napoli Pizzeria" }, "reviews": { "sites": [ { "key": "google", "site": "Google", "rating": 4.7, "count": 212, "new": 2, "empty": "No rating yet" }, { "key": "yelp", "site": "Yelp", "rating": 4, "count": 38, "new": 0, "empty": "No rating yet" } ], "average_rating": 4.6, "total_reviews": 250, "last_30_days": 2, "low_ratings_without_reply": 2, "url": "https://citednearby.com/dashboard/businesses/4130d4b5-f65a-4b38-8fa2-db5d69fa21eb/reviews" }, "listing_watch": { "watched": true, "checks_per_day": 1, "last_checked_at": null, "changes_this_week": 0, "urgent_changes": 0, "claimed": null, "url": "https://citednearby.com/dashboard/businesses/4130d4b5-f65a-4b38-8fa2-db5d69fa21eb/listings" }, "citations": { "audited": true, "running": false, "sites_found_on": 1, "inconsistent_listings": 1, "backlink_gaps": 1 }, "campaigns": [ { "name": "Weekly pizza keywords", "platforms": "Maps", "keywords": "“pizza delivery”, “pizza”", "schedule": "Mondays at 09:00 (UTC) · 34 credits a run", "credits_per_run": 34, "active": true, "last_run_status": null, "url": "https://citednearby.com/dashboard/campaigns/c9c41225-e5a4-42b9-9e22-a9999c639ffb" } ] } }

Lists are cut to 3 items here; real answers have them all.

GET

/api/v1/businesses/{business_id}/reviews

A business' review profiles per site and its latest reviews.

Returns: A business' review profiles per review site (rating on a 5-star scale, review count, link, when last checked) and its most recent reviews (rating, text cut to about 600 characters, author, date, whether the owner replied). Filter reviews by site, a maximum rating (for example 3 to see the unhappy ones) and a start date. Returns 20 reviews unless limit is given (max 50). Same data as the MCP tool get_reviews.

Parameter In Type Description
business_id path string The business id (UUID) from GET /api/v1/businesses.
site query string: google, facebook, yelp, tripadvisor, bbb, trustpilot, angi, yellowpages Only reviews from this site. Optional.
max_rating query integer (min 1, max 5) Only reviews rated this or lower. Optional.
since query string Only reviews posted on or after this date (YYYY-MM-DD). Optional.
limit query integer (min 1, max 50) How many reviews to return (default 20). Optional.

Example request

curl
curl "https://citednearby.com/api/v1/businesses/BUSINESS_ID/reviews?max_rating=3&limit=10" \ -H "Authorization: Bearer YOUR_API_KEY"
JSON
{ "data": { "business": { "id": "4130d4b5-f65a-4b38-8fa2-db5d69fa21eb", "name": "Slice & Crust Midtown" }, "profiles": [ { "site": "google", "site_name": "Google", "rating": 4.7, "review_count": 212, "url": "https://maps.google.com/?cid=1234567890", "status": "active", "last_checked_at": "2026-10-22T22:49:17+00:00" }, { "site": "yelp", "site_name": "Yelp", "rating": 4, "review_count": 38, "url": "https://www.yelp.com/biz/slice-and-crust-midtown-new-york", "status": "active", "last_checked_at": "2026-10-19T22:49:17+00:00" } ], "reviews_matching": 2, "reviews": [ { "site": "google", "rating": 2, "recommended": null, "title": null, "text": "Good crust, but the delivery took over an hour.", "author": "Sam P.", "posted_at": "2026-10-20T22:49:17+00:00", "owner_replied": false, "url": null }, { "site": "google", "rating": 3, "recommended": null, "title": null, "text": "Fair price, the slices were a bit cold.", "author": "Dana K.", "posted_at": "2026-10-17T22:49:17+00:00", "owner_replied": false, "url": null } ], "url": "https://citednearby.com/dashboard/businesses/4130d4b5-f65a-4b38-8fa2-db5d69fa21eb/reviews" } }

Lists are cut to 3 items here; real answers have them all.

GET

/api/v1/businesses/{business_id}/listings

A business' citation audit, Google listing watch and backlink gaps.

Returns: A business' listings health: the latest citation audit (directories it is found on, missing, with a wrong name, address or phone, and where competitors are listed but the business is not), the Google listing watch (status, last check, recent changes to the Google profile) and the top backlink gaps. Same data as the MCP tool get_listings.

Parameter In Type Description
business_id path string The business id (UUID) from GET /api/v1/businesses.

Example request

curl
curl "https://citednearby.com/api/v1/businesses/BUSINESS_ID/listings" \ -H "Authorization: Bearer YOUR_API_KEY"
JSON
{ "data": { "business": { "id": "4130d4b5-f65a-4b38-8fa2-db5d69fa21eb", "name": "Slice & Crust Midtown" }, "citation_audit": { "status": "completed", "started_at": null, "completed_at": "2026-10-18T22:49:17+00:00", "summary": { "listings_found": 14, "key_directories_found_on": 11, "key_directories_checked": 32, "inconsistent": 2, "needs_review": 1, "competitor_only_directories": 5 }, "directories": [ { "name": "Yelp", "domain": "yelp.com", "status": "found", "name_correct": true, "address_correct": null, "phone_correct": false, "unclaimed": false, "url": "https://www.yelp.com/biz/slice-and-crust-midtown-new-york" }, { "name": "Facebook", "domain": "facebook.com", "status": "missing", "name_correct": false, "address_correct": false, "phone_correct": false, "unclaimed": false, "url": null }, { "name": "BBB", "domain": "bbb.org", "status": "missing", "name_correct": false, "address_correct": false, "phone_correct": false, "unclaimed": false, "url": null } ], "listings_to_fix": [ { "domain": "yelp.com", "url": "https://www.yelp.com/biz/slice-and-crust-midtown-new-york", "wrong": [ "phone" ] } ], "missing_but_competitors_listed": [] }, "listing_watch": { "watched": true, "checks_per_day": 1, "last_checked_at": null, "next_check_at": "2026-10-22T22:49:18+00:00", "has_google_place_id": true, "recent_changes": [] }, "backlink_gaps": [ { "domain": "midtownbusiness.example", "competitors_linked": 3, "domain_rank": 52 } ], "url": "https://citednearby.com/dashboard/businesses/4130d4b5-f65a-4b38-8fa2-db5d69fa21eb/listings" } }

Lists are cut to 3 items here; real answers have them all.

GET

/api/v1/keywords

Your tracked keywords with their latest results.

Returns: Tracked keywords (the searches a business is tracked for), most recently scanned first, up to 100. Each has its platform, the latest and previous headline figure (ATRP for Google Maps where lower is better, mention rate for AI where higher is better, Google position for Web Search where lower is better), the change (positive means better), how many scans it has and a dashboard link. Filter by business and platform. Same data as the MCP tool list_keywords.

Parameter In Type Description
business_id query string Only this business (UUID from list_businesses). Optional.
platform query string: google_maps, google_search, google_ai_overview, google_ai_mode, chatgpt, gemini, perplexity, grok, claude Only this platform: google_maps, google_search (Web Search) or an AI engine. Optional.

Example request

curl
curl "https://citednearby.com/api/v1/keywords?platform=google_maps" \ -H "Authorization: Bearer YOUR_API_KEY"
JSON
{ "data": { "total": 2, "shown": 2, "keywords": [ { "id": "b186ea57-9558-494b-86f9-e16d7e32f12e", "business": { "id": "4130d4b5-f65a-4b38-8fa2-db5d69fa21eb", "name": "Slice & Crust Midtown" }, "keyword": "pizza", "platform": "google_maps", "platform_label": "Google Maps", "sample": "3 × 3 grid · 1 mi radius", "metric": "atrp", "latest": null, "previous": null, "change": null, "last_scan_at": null, "scan_count": 0, "url": "https://citednearby.com/dashboard/tracked-keywords/b186ea57-9558-494b-86f9-e16d7e32f12e" }, { "id": "78dafef5-d990-4baa-8eef-01e2805af5a3", "business": { "id": "4130d4b5-f65a-4b38-8fa2-db5d69fa21eb", "name": "Slice & Crust Midtown" }, "keyword": "pizza delivery", "platform": "google_maps", "platform_label": "Google Maps", "sample": "5 × 5 grid · 2 mi radius", "metric": "atrp", "latest": 6.7, "previous": 6.7, "change": 0, "last_scan_at": "2026-10-22T22:49:17+00:00", "scan_count": 2, "url": "https://citednearby.com/dashboard/tracked-keywords/78dafef5-d990-4baa-8eef-01e2805af5a3" } ] } }

Lists are cut to 3 items here; real answers have them all.

GET

/api/v1/keywords/{keyword_id}/history

A keyword's finished scans in date order, to chart it over time.

Returns: The finished scans of one tracked keyword in date order (oldest first), each with its headline figures: the trend of that keyword. Takes the keyword id from list_keywords. Returns the latest 20 scans unless limit is given (max 100). Same data as the MCP tool get_keyword_history.

Parameter In Type Description
keyword_id path string The keyword id (UUID) from GET /api/v1/keywords.
limit query integer (min 1, max 100) How many of the latest scans to return (default 20). Optional.

Example request

curl
curl "https://citednearby.com/api/v1/keywords/KEYWORD_ID/history?limit=10" \ -H "Authorization: Bearer YOUR_API_KEY"
JSON
{ "data": { "keyword": { "id": "78dafef5-d990-4baa-8eef-01e2805af5a3", "business": { "id": "4130d4b5-f65a-4b38-8fa2-db5d69fa21eb", "name": "Slice & Crust Midtown" }, "keyword": "pizza delivery", "platform": "google_maps", "platform_label": "Google Maps", "sample": "5 × 5 grid · 2 mi radius", "metric": "atrp", "latest": 6.7, "previous": 6.7, "change": 0, "last_scan_at": "2026-10-22T22:49:17+00:00", "scan_count": null, "url": "https://citednearby.com/dashboard/tracked-keywords/78dafef5-d990-4baa-8eef-01e2805af5a3" }, "scans": [ { "id": "c45f34dd-d735-4b14-bb27-01f5d89f23b3", "date": "2026-10-15T22:49:16+00:00", "result": { "atrp": 6.7, "arp": 4.7, "local_visibility_percent": 40, "points_found": 22, "points_scanned": 25 }, "url": "https://citednearby.com/dashboard/rank-scans/c45f34dd-d735-4b14-bb27-01f5d89f23b3" }, { "id": "ff6e4435-5d73-4701-8dab-131c52b6b06b", "date": "2026-10-22T22:49:17+00:00", "result": { "atrp": 6.7, "arp": 4.7, "local_visibility_percent": 40, "points_found": 22, "points_scanned": 25 }, "url": "https://citednearby.com/dashboard/rank-scans/ff6e4435-5d73-4701-8dab-131c52b6b06b" } ] } }

Lists are cut to 3 items here; real answers have them all.

GET

/api/v1/campaigns

Your campaigns with their schedule, keywords and what a run costs.

Returns: Campaigns (scheduled scans of several keywords, which can mix Google Maps, Web Search and AI engines): id, business, keywords, platforms, schedule, whether active, next and last run, last run status and the credits one run uses. The campaign id is what run_campaign takes. Same data as the MCP tool list_campaigns.

Parameter In Type Description
business_id query string Only this business (UUID from list_businesses). Optional.

Example request

curl
curl "https://citednearby.com/api/v1/campaigns" \ -H "Authorization: Bearer YOUR_API_KEY"
JSON
{ "data": { "count": 1, "campaigns": [ { "id": "c9c41225-e5a4-42b9-9e22-a9999c639ffb", "name": "Weekly pizza keywords", "business": { "id": "4130d4b5-f65a-4b38-8fa2-db5d69fa21eb", "name": "Slice & Crust Midtown" }, "keywords": [ "pizza delivery", "pizza" ], "platforms": [ "google_maps" ], "schedule": "Mondays at 09:00 (UTC)", "active": true, "next_run_at": "2026-10-23T22:49:17+00:00", "last_run_at": null, "last_run_status": null, "last_run_message": null, "credits_per_run": 34, "url": "https://citednearby.com/dashboard/campaigns/c9c41225-e5a4-42b9-9e22-a9999c639ffb" } ] } }
GET

/api/v1/scans

Your scans, newest first, with filters.

Returns: Scans, newest first: id, business, keyword, platform, status, progress, dates, credits used, headline figures when finished, and a dashboard link. Filter by business, keyword, campaign, platform, status or a start date. Returns 20 unless limit is given (max 100). Use get_scan for one scan in full. Same data as the MCP tool list_scans.

Parameter In Type Description
business_id query string Only this business (UUID from list_businesses). Optional.
keyword_id query string Only this tracked keyword (UUID from list_keywords). Optional.
campaign_id query string Only scans started by this campaign (UUID from list_campaigns). Optional.
platform query string: google_maps, google_search, google_ai_overview, google_ai_mode, chatgpt, gemini, perplexity, grok, claude Only this platform. Optional.
status query string: pending, running, completed, failed Only scans in this status. Optional.
since query string Only scans started on or after this date (YYYY-MM-DD). Optional.
limit query integer (min 1, max 100) How many scans to return (default 20). Optional.

Example request

curl
curl "https://citednearby.com/api/v1/scans?status=completed&since=2026-10-01" \ -H "Authorization: Bearer YOUR_API_KEY"
JSON
{ "data": { "total": 3, "shown": 3, "scans": [ { "id": "f95bfe2f-63b5-4cd3-a97e-939a6aa706c7", "business": { "id": "4130d4b5-f65a-4b38-8fa2-db5d69fa21eb", "name": "Slice & Crust Midtown" }, "keyword": "best pizza near me", "platform": "chatgpt", "platform_label": "ChatGPT", "status": "completed", "progress": "5/5", "sample": "5 answers in 1 town", "created_at": "2026-10-22T22:49:17+00:00", "completed_at": "2026-10-22T22:49:17+00:00", "credits_used": 5, "result": { "mention_rate_percent": 60, "share_of_voice_percent": 23.1, "average_position": 1, "answers": 5, "answers_naming_business": 3 }, "failure_reason": null, "url": "https://citednearby.com/dashboard/rank-scans/f95bfe2f-63b5-4cd3-a97e-939a6aa706c7/ai" }, { "id": "ff6e4435-5d73-4701-8dab-131c52b6b06b", "business": { "id": "4130d4b5-f65a-4b38-8fa2-db5d69fa21eb", "name": "Slice & Crust Midtown" }, "keyword": "pizza delivery", "platform": "google_maps", "platform_label": "Google Maps", "status": "completed", "progress": "25/25", "sample": "5 × 5 grid", "created_at": "2026-10-22T22:49:17+00:00", "completed_at": "2026-10-22T22:49:17+00:00", "credits_used": 25, "result": { "atrp": 6.7, "arp": 4.7, "local_visibility_percent": 40, "points_found": 22, "points_scanned": 25 }, "failure_reason": null, "url": "https://citednearby.com/dashboard/rank-scans/ff6e4435-5d73-4701-8dab-131c52b6b06b" }, { "id": "c45f34dd-d735-4b14-bb27-01f5d89f23b3", "business": { "id": "4130d4b5-f65a-4b38-8fa2-db5d69fa21eb", "name": "Slice & Crust Midtown" }, "keyword": "pizza delivery", "platform": "google_maps", "platform_label": "Google Maps", "status": "completed", "progress": "25/25", "sample": "5 × 5 grid", "created_at": "2026-10-15T22:49:16+00:00", "completed_at": "2026-10-15T22:49:16+00:00", "credits_used": 25, "result": { "atrp": 6.7, "arp": 4.7, "local_visibility_percent": 40, "points_found": 22, "points_scanned": 25 }, "failure_reason": null, "url": "https://citednearby.com/dashboard/rank-scans/c45f34dd-d735-4b14-bb27-01f5d89f23b3" } ] } }

Lists are cut to 3 items here; real answers have them all.

GET

/api/v1/scans/{scan_id}

One scan in full: settings, figures, the grid of ranks and competitors (maps), brands and sources (AI) or the results above you (Web Search).

Returns: One scan in full: settings, status and progress (call again until status is completed), the headline figures, and by kind. Google Maps scan: ATRP, ARP, Local Visibility, the grid of ranks (rows north to south) and the top competitors. AI scan: mention rate, share of voice, average position, the businesses and websites the answers named, and per-town results or the grid. Web Search check: the position and page of the website and the results above it. Includes the previous scan of the same keyword for comparison and a dashboard link. Same data as the MCP tool get_scan.

Parameter In Type Description
scan_id path string The scan id (UUID) from GET /api/v1/scans.
include_grid query boolean Include the grid of ranks (default true). Turn it off for a shorter answer. Optional.

Example request

curl
curl "https://citednearby.com/api/v1/scans/SCAN_ID?include_grid=false" \ -H "Authorization: Bearer YOUR_API_KEY"
JSON
{ "data": { "id": "ff6e4435-5d73-4701-8dab-131c52b6b06b", "business": { "id": "4130d4b5-f65a-4b38-8fa2-db5d69fa21eb", "name": "Slice & Crust Midtown" }, "keyword": "pizza delivery", "platform": "google_maps", "platform_label": "Google Maps", "status": "completed", "progress": "25/25", "sample": "5 × 5 grid", "created_at": "2026-10-22T22:49:17+00:00", "completed_at": "2026-10-22T22:49:17+00:00", "credits_used": 25, "result": { "atrp": 6.7, "arp": 4.7, "local_visibility_percent": 40, "points_found": 22, "points_scanned": 25 }, "failure_reason": null, "url": "https://citednearby.com/dashboard/rank-scans/ff6e4435-5d73-4701-8dab-131c52b6b06b", "settings": { "grid_size": 5, "radius": 2, "distance_unit": "mi", "points_switched_off": 0 }, "previous_scan": { "id": "c45f34dd-d735-4b14-bb27-01f5d89f23b3", "date": "2026-10-15T22:49:16+00:00", "result": { "atrp": 6.7, "arp": 4.7, "local_visibility_percent": 40, "points_found": 22, "points_scanned": 25 } }, "metrics": { "atrp": 6.7, "arp": 4.7, "local_visibility_percent": 40, "points_scanned": 25, "points_found": 22, "points_in_top_3": 10, "meaning": "ATRP: average rank over all points, 21 counts as not found (lower is better). ARP: average rank where found. Local Visibility: share of points where the business is in the top 3." }, "competitors": [ { "name": "Columbus Circle Pizzeria", "is_you": false, "category": "Pizza restaurant", "address": "1600 Example Ave, New York, NY 10019", "rating": 4.2, "reviews": 2036, "atrp": 4.4, "local_visibility_percent": 44, "best_rank": 1, "points_appearing": 24 }, { "name": "Koreatown Pizza Bar", "is_you": false, "category": "Pizza restaurant", "address": "20 Example St, New York, NY 10016", "rating": 4.2, "reviews": 3634, "atrp": 4.8, "local_visibility_percent": 48, "best_rank": 1, "points_appearing": 23 }, { "name": "Garment District Slice", "is_you": false, "category": "Pizza restaurant", "address": "1400 Example Ave, New York, NY 10018", "rating": 4.5, "reviews": 17266, "atrp": 4.9, "local_visibility_percent": 68, "best_rank": 1, "points_appearing": 22 } ], "grid": [ [ 8, 9, 5, 2, 2 ], [ "-", "-", 5, 1, 2 ], [ 8, 10, 3, 2, 3 ], [ 5, 4, 3, 6, 8 ], [ 2, 1, 6, "-", 9 ] ], "grid_legend": "Rows run north to south, columns west to east. A number is the business' rank at that point; \"-\" not in the top 20; \"off\" switched off; \"?\" not scanned yet or failed." } }

Lists are cut to 3 items here; real answers have them all.

POST

/api/v1/scans/map

Uses credits

Start a Google Maps geo-grid scan of a keyword.

Returns: Start a Google Maps geo-grid scan of a keyword for a business. Uses credits: one per grid point (a 7x7 grid is 49), charged as in the dashboard (get_account lists the costs). Without grid settings it uses the keyword's existing grid, else the grid sized to the business' competition, else 7x7. Returns the scan id, the credits used and left and a dashboard link; results are usually ready in 1-3 minutes: call get_scan with the id. Only run it when the user asked for a scan. Same data as the MCP tool run_map_scan.

Parameter In Type Description
business_id body string The business id (UUID) from list_businesses.
keyword body string What customers search, e.g. "emergency plumber".
grid_size body integer: 3, 5, 7, 9, 11, 13, 15, 17, 19, 21 Points per side of the grid (3, 5, 7 ... 21). More points cost more credits. Optional. Optional.
radius body number (min 0.1, max 50) Distance from the center to the edge of the grid, in the distance unit. Optional. Optional.
distance_unit body string: mi, km mi (miles) or km. Optional. Optional.

Example request

curl
curl -X POST "https://citednearby.com/api/v1/scans/map" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"business_id":"BUSINESS_ID","keyword":"pizza delivery","grid_size":7,"radius":3,"distance_unit":"mi"}'
JSON
{ "data": { "message": "Scan started. Results are usually ready in 1-3 minutes: call GET /api/v1/scans/{id} with this id (8bee8160-2b00-456c-b2d2-f14db076d326) to see progress and results.", "credits_used": 49, "credits_left": 4896, "scans": [ { "id": "8bee8160-2b00-456c-b2d2-f14db076d326", "business": { "id": "4130d4b5-f65a-4b38-8fa2-db5d69fa21eb", "name": "Slice & Crust Midtown" }, "keyword": "pizza delivery", "platform": "google_maps", "platform_label": "Google Maps", "status": "running", "progress": "0/49", "sample": "7 × 7 grid", "created_at": "2026-10-22T22:49:18+00:00", "completed_at": null, "credits_used": 49, "result": null, "failure_reason": null, "url": "https://citednearby.com/dashboard/rank-scans/8bee8160-2b00-456c-b2d2-f14db076d326" } ], "dashboard_url": "https://citednearby.com/dashboard/rank-scans/8bee8160-2b00-456c-b2d2-f14db076d326" } }
POST

/api/v1/scans/ai

Uses credits

Ask AI engines a customer's question and see whether they recommend the business.

Returns: Ask AI engines a question customers ask (for example "who is the best plumber in Austin?") and see whether they recommend the business. One scan per engine. Uses credits: one per AI answer, charged as in the dashboard; get_account lists the engines the plan includes and the cost. Google AI Overviews and AI Mode are asked over a small grid around the business; ChatGPT, Gemini, Perplexity, Grok and Claude are asked several times about each town. Returns the scan ids, the credits used and left and a dashboard link; results are usually ready in 1-3 minutes: call get_scan with each id. Only run it when the user asked for a scan. Same data as the MCP tool run_ai_scan.

Parameter In Type Description
business_id body string The business id (UUID) from list_businesses.
prompt body string The question to ask, as a customer would, e.g. "best pizza near me". "near me" becomes the town; or write {location} where the town goes.
platforms body array of string Which AI engines to ask: google_ai_overview, google_ai_mode, chatgpt, gemini, perplexity, grok, claude. Only engines in the plan work (get_account lists them).
towns body array of string Towns the chat assistants are asked about, e.g. "Chelsea, New York". Default: the business' own town. Optional.
answers_per_town body integer (min 1, max 10) How many times each town is asked (more is steadier, and costs more). Default 5. Optional.

Example request

curl
curl -X POST "https://citednearby.com/api/v1/scans/ai" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"business_id":"BUSINESS_ID","prompt":"best pizza near me","platforms":["chatgpt","google_ai_overview"]}'
JSON
{ "data": { "message": "2 scans started. Results are usually ready in 1-3 minutes: call GET /api/v1/scans/{id} with this id (9bc5e9cf-3bb5-4b37-ac03-42009775d159, 222b82fe-db58-4099-bf5b-34309cb892f1) to see progress and results.", "credits_used": 14, "credits_left": 4882, "scans": [ { "id": "9bc5e9cf-3bb5-4b37-ac03-42009775d159", "business": { "id": "4130d4b5-f65a-4b38-8fa2-db5d69fa21eb", "name": "Slice & Crust Midtown" }, "keyword": "best pizza near me", "platform": "google_ai_overview", "platform_label": "Google AI Overviews", "status": "running", "progress": "0/9", "sample": "3 × 3 grid", "created_at": "2026-10-22T22:49:18+00:00", "completed_at": null, "credits_used": 9, "result": null, "failure_reason": null, "url": "https://citednearby.com/dashboard/rank-scans/9bc5e9cf-3bb5-4b37-ac03-42009775d159/ai" }, { "id": "222b82fe-db58-4099-bf5b-34309cb892f1", "business": { "id": "4130d4b5-f65a-4b38-8fa2-db5d69fa21eb", "name": "Slice & Crust Midtown" }, "keyword": "best pizza near me", "platform": "chatgpt", "platform_label": "ChatGPT", "status": "running", "progress": "0/5", "sample": "5 answers in 1 town", "created_at": "2026-10-22T22:49:18+00:00", "completed_at": null, "credits_used": 5, "result": null, "failure_reason": null, "url": "https://citednearby.com/dashboard/rank-scans/222b82fe-db58-4099-bf5b-34309cb892f1/ai" } ], "dashboard_url": "https://citednearby.com/dashboard/rank-scans/9bc5e9cf-3bb5-4b37-ac03-42009775d159/ai" } }

Lists are cut to 3 items here; real answers have them all.

POST

/api/v1/scans/web-search

Uses credits

Check where the business' website ranks in Google's regular results.

Returns: Check where the business' website ranks in Google's regular (organic) results for a keyword. Needs the business to have a website. Uses credits: one per page of 10 results read (5 for the default top 50, held up front; pages not needed are refunded when the check finishes). Without a location it uses the business' own town. Returns the scan id, the credits used and left and a dashboard link; results are usually ready in 1-3 minutes: call get_scan with the id. Only run it when the user asked for a check. Same data as the MCP tool run_web_search_check.

Parameter In Type Description
business_id body string The business id (UUID) from list_businesses.
keyword body string What customers search, e.g. "emergency plumber".
location body string Where the search is made from, as Google names it: City,State,Country (e.g. "Austin,Texas,United States"). Default: the business' own town. Optional.
national body boolean Set true to search without a location (national results) instead of the business' town. Optional.
max_results body integer (min 10, max 100) How many Google results to look through, 10 to 100 (default 50). Optional.

Example request

curl
curl -X POST "https://citednearby.com/api/v1/scans/web-search" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"business_id":"BUSINESS_ID","keyword":"pizza delivery","max_results":50}'
JSON
{ "data": { "message": "Scan started. Results are usually ready in 1-3 minutes: call GET /api/v1/scans/{id} with this id (4babe3d3-37b1-4e32-95b9-3ff9dd4c0dd9) to see progress and results. The credits shown are held for the most this check can read; the ones for pages it does not need are refunded when it finishes.", "credits_used": 5, "credits_left": 4877, "scans": [ { "id": "4babe3d3-37b1-4e32-95b9-3ff9dd4c0dd9", "business": { "id": "4130d4b5-f65a-4b38-8fa2-db5d69fa21eb", "name": "Slice & Crust Midtown" }, "keyword": "pizza delivery", "platform": "google_search", "platform_label": "Google Search", "status": "running", "progress": "0/5", "sample": "Top 50 · New York, New York, United States", "created_at": "2026-10-22T22:49:18+00:00", "completed_at": null, "credits_used": 5, "result": null, "failure_reason": null, "url": "https://citednearby.com/dashboard/rank-scans/4babe3d3-37b1-4e32-95b9-3ff9dd4c0dd9/web" } ], "dashboard_url": "https://citednearby.com/dashboard/rank-scans/4babe3d3-37b1-4e32-95b9-3ff9dd4c0dd9/web" } }
POST

/api/v1/scans/{scan_id}/rescan

Uses credits

Run an earlier scan again with the same settings.

Returns: Run an earlier scan again with the same settings (Google Maps, AI or Web Search), so the new scan joins the same keyword's history. Uses credits, the same as the first run (the scan's credits_used shows it). Returns the new scan id, the credits used and left and a dashboard link; results are usually ready in 1-3 minutes: call get_scan with the id. Only run it when the user asked for it. Same data as the MCP tool rescan.

Parameter In Type Description
scan_id path string The scan id (UUID) from GET /api/v1/scans.

Example request

curl
curl -X POST "https://citednearby.com/api/v1/scans/SCAN_ID/rescan" \ -H "Authorization: Bearer YOUR_API_KEY"
JSON
{ "data": { "message": "Scan started. Results are usually ready in 1-3 minutes: call GET /api/v1/scans/{id} with this id (db4f95ee-9737-4df5-8705-21393cb1f6da) to see progress and results.", "credits_used": 25, "credits_left": 4852, "scans": [ { "id": "db4f95ee-9737-4df5-8705-21393cb1f6da", "business": { "id": "4130d4b5-f65a-4b38-8fa2-db5d69fa21eb", "name": "Slice & Crust Midtown" }, "keyword": "pizza delivery", "platform": "google_maps", "platform_label": "Google Maps", "status": "running", "progress": "0/25", "sample": "5 × 5 grid", "created_at": "2026-10-22T22:49:18+00:00", "completed_at": null, "credits_used": 25, "result": null, "failure_reason": null, "url": "https://citednearby.com/dashboard/rank-scans/db4f95ee-9737-4df5-8705-21393cb1f6da" } ], "dashboard_url": "https://citednearby.com/dashboard/rank-scans/db4f95ee-9737-4df5-8705-21393cb1f6da" } }
POST

/api/v1/campaigns/{campaign_id}/run

Uses credits

Run a campaign now, outside its schedule.

Returns: Run a campaign right now, outside its schedule: every keyword is scanned on Google Maps, and on the campaign's Web Search and AI engines too. Uses credits: the whole run is charged up front, as in the dashboard (list_campaigns shows credits_per_run); if the balance does not cover it, nothing starts. The schedule does not change. Returns the scan ids, the credits used and left and a dashboard link; results are usually ready in 1-3 minutes: call get_scan with each id. Only run it when the user asked for it. Same data as the MCP tool run_campaign.

Parameter In Type Description
campaign_id path string The campaign id (UUID) from GET /api/v1/campaigns.

Example request

curl
curl -X POST "https://citednearby.com/api/v1/campaigns/CAMPAIGN_ID/run" \ -H "Authorization: Bearer YOUR_API_KEY"
JSON
{ "data": { "message": "2 scans started. Results are usually ready in 1-3 minutes: call GET /api/v1/scans/{id} with this id (d1cb7c52-9680-4a5e-a9c3-8415222d1dcb, f6fb9606-85d5-4728-a26d-a4a37dcc39c6) to see progress and results.", "credits_used": 34, "credits_left": 4818, "scans": [ { "id": "d1cb7c52-9680-4a5e-a9c3-8415222d1dcb", "business": { "id": "4130d4b5-f65a-4b38-8fa2-db5d69fa21eb", "name": "Slice & Crust Midtown" }, "keyword": "pizza delivery", "platform": "google_maps", "platform_label": "Google Maps", "status": "running", "progress": "0/25", "sample": "5 × 5 grid", "created_at": "2026-10-22T22:49:18+00:00", "completed_at": null, "credits_used": 25, "result": null, "failure_reason": null, "url": "https://citednearby.com/dashboard/rank-scans/d1cb7c52-9680-4a5e-a9c3-8415222d1dcb" }, { "id": "f6fb9606-85d5-4728-a26d-a4a37dcc39c6", "business": { "id": "4130d4b5-f65a-4b38-8fa2-db5d69fa21eb", "name": "Slice & Crust Midtown" }, "keyword": "pizza", "platform": "google_maps", "platform_label": "Google Maps", "status": "running", "progress": "0/9", "sample": "3 × 3 grid", "created_at": "2026-10-22T22:49:18+00:00", "completed_at": null, "credits_used": 9, "result": null, "failure_reason": null, "url": "https://citednearby.com/dashboard/rank-scans/f6fb9606-85d5-4728-a26d-a4a37dcc39c6" } ], "dashboard_url": "https://citednearby.com/dashboard/rank-scans/d1cb7c52-9680-4a5e-a9c3-8415222d1dcb" } }

Lists are cut to 3 items here; real answers have them all.

JSON
{ "message": "No business with that id in this account. Ids are UUIDs: see GET /api/v1/businesses." }

Every other status code is on the Errors page.