ProfilePilot
Loading…
Developer API

Locations Metrics & Local SEO Geo-Grid API

Pull per-store Google Business Profile impressions, clicks, calls, direction requests, peak footfall days, Facebook/Instagram location metrics, and Local SEO Geo-Grid Share of Voice.

Use these endpoints to feed store-level local search visibility, customer actions, and Geo-Grid competitor rankings into PowerBI, Looker Studio, Snowflake, or BigQuery.

1. Store & Location Performance Metrics (GET /api/v1/reports/locations/metrics)

Endpoint: GET https://profilepilotapp.com/api/v1/reports/locations/metrics Required Scope: reports:read or locations:read Required Product Subscription: Locations & Reputation + Developer API Access

Query Parameters:

  • startDate (YYYY-MM-DD, optional) — Start of reporting window (defaults to 30 days ago UTC).
  • endDate (YYYY-MM-DD, optional) — End of reporting window (defaults to today UTC; clamped to 366 days max).
  • storeCode or store_code (string, optional) — Filter Google, Facebook, and Instagram location records to a single branch store_code.
  • platform ("all" | "google" | "meta", optional, default "all") — Restrict daily metric aggregation to Google Business Profile ("google"), Meta Facebook/Instagram ("meta"), or both ("all").

Performance Metrics & Response Fields:

  • period — { startDate, endDate } UTC date range evaluated.
  • footprint — Connected location counts across channels: google_locations, meta_locations, instagram_locations, bing_locations, and enterprise_store_locations (submitted master stores).
  • google_totals — Organisation-wide Google Business Profile sums across the period:
  • impressions (number) — Total listing views across Search and Maps (desktop + mobile).
  • maps_impressions (number) — Combined BUSINESS_IMPRESSIONS_DESKTOP_MAPS + BUSINESS_IMPRESSIONS_MOBILE_MAPS.
  • search_impressions (number) — Combined BUSINESS_IMPRESSIONS_DESKTOP_SEARCH + BUSINESS_IMPRESSIONS_MOBILE_SEARCH.
  • website_clicks (number), call_clicks (number), direction_requests (number), booking_clicks (number), messages (number).
  • engagement (number) — website_clicks + call_clicks + direction_requests.
  • leads (number) — call_clicks + booking_clicks + messages.
  • total_interactions (number) — engagement + booking_clicks + messages.
  • meta_totals — Organisation-wide Meta location sums:
  • facebook: { reach, post_engagements, page_views, total_fans }.
  • instagram: { impressions, reach, followers }.
  • stores[] — Per-location breakdown sorted by impressions descending:
  • store_code (string | null), name (string humanized display name), google_location_id (string), account_id (string | null), status ("open" | "temporarily_closed" | "closed").
  • impressions, maps_impressions, search_impressions, website_clicks, call_clicks, direction_requests, booking_clicks, messages, engagement, leads, total_interactions (number).
  • peak_days (string) — Top weekday(s) for customer direction requests (e.g. "Sat & Fri" or "—" when no direction requests occurred).
  • meta — { org_id, api_usage: { month, used, limit, remaining } }.
curl -sS -X GET "https://profilepilotapp.com/api/v1/reports/locations/metrics?startDate=2026-10-01&endDate=2026-10-20&platform=all" \
  -H "Authorization: Bearer ppapi_your_secret_key"
{
  "ok": true,
  "period": { "startDate": "2026-10-01", "endDate": "2026-10-20" },
  "platform": "all",
  "store_code": null,
  "footprint": {
    "google_locations": 42,
    "meta_locations": 38,
    "instagram_locations": 12,
    "bing_locations": 40,
    "enterprise_store_locations": 42
  },
  "google_totals": {
    "impressions": 482910,
    "maps_impressions": 310400,
    "search_impressions": 172510,
    "website_clicks": 14200,
    "call_clicks": 8930,
    "direction_requests": 29410,
    "booking_clicks": 410,
    "messages": 190,
    "engagement": 52540,
    "leads": 9530,
    "total_interactions": 53140
  },
  "meta_totals": {
    "facebook": {
      "reach": 128400,
      "post_engagements": 9420,
      "page_views": 18300,
      "total_fans": 64200
    },
    "instagram": {
      "impressions": 84100,
      "reach": 61200,
      "followers": 29400
    }
  },
  "stores": [
    {
      "store_code": "CPT-001",
      "name": "Cape Town Flagship",
      "google_location_id": "locations/123456789",
      "account_id": "accounts/987654321",
      "status": "open",
      "impressions": 19420,
      "maps_impressions": 12400,
      "search_impressions": 7020,
      "website_clicks": 610,
      "call_clicks": 380,
      "direction_requests": 1420,
      "booking_clicks": 25,
      "messages": 12,
      "engagement": 2410,
      "leads": 417,
      "total_interactions": 2447,
      "peak_days": "Sat & Fri"
    }
  ],
  "meta": {
    "org_id": "00000000-0000-0000-0000-000000000000",
    "api_usage": { "month": "2026-10", "used": 14, "limit": 500000, "remaining": 499986 }
  }
}

2. Local SEO Geo-Grid & Share of Voice (GET /api/v1/reports/seo-grid)

Endpoint: GET https://profilepilotapp.com/api/v1/reports/seo-grid Required Scope: reports:read Required Product Subscription: Locations & Reputation + Developer API Access

Query Parameters:

  • gridId or grid_id (UUID, optional) — Inspect a specific Geo-Grid configuration (defaults to the organisation’s most recently scanned grid).
  • scanId or scan_id (UUID, optional) — Inspect a specific historical scan snapshot (defaults to the latest successful scan).
  • leaderboardLimit (number, optional, 5–40, default 20) — Maximum competitors returned in leaderboard[].

Performance Metrics & Response Fields:

  • grids[] — List of configured Geo-Grids in the organisation (id, name, location_id, center_lat, center_lng, rows, cols, spacing_m, keyword, schedule_frequency, schedule_next_run_at, created_at).
  • empty (boolean) & empty_reason (string | null) — true if no completed Geo-Grid scan exists yet.
  • scan — Metadata for the evaluated scan: { scanId, gridId, gridName, keyword, scannedAt, pointsBilled, totalPoints, pointsWithResults }.
  • tracked_place_id (string | null) — Google place_id matched to your tracked store.
  • your_avg_rank (number | null) — Your average SERP pack position across all grid pins where your store appeared (1.0 is #1 on every pin).
  • your_best_rank (number | null) — Highest rank achieved across any pin in the scan.
  • your_pin_visibility_pct (number | null) — Percentage of grid coordinate pins where your business appeared in the local pack (appearances / pointsWithResults × 100).
  • sov_pct (number | null) — Your rank-weighted Share of Voice % across the grid (Rank 1 carries weight 20, Rank 20 carries weight 1, matching Mission Control and Executive Reports).
  • leaderboard[] — Top competitors ranked by Share of Voice ({ placeId, name, appearances, pinVisibilityPct, shareOfVoicePct, avgRank, bestRank, avgRating, maxReviews, isYou }).
  • benchmark[] — Normalized 0–100 multi-axis competitor benchmark comparison for the top 5 pack leaders + your tracked listing.
curl -sS -X GET "https://profilepilotapp.com/api/v1/reports/seo-grid?leaderboardLimit=10" \
  -H "Authorization: Bearer ppapi_your_secret_key"
{
  "ok": true,
  "grids": [
    {
      "id": "9b1a2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d",
      "name": "Cape Town Flagship",
      "location_id": "locations/123456789",
      "center_lat": -33.9249,
      "center_lng": 18.4241,
      "rows": 7,
      "cols": 7,
      "spacing_m": 1000,
      "keyword": "wholesale grocer near me",
      "schedule_frequency": "weekly",
      "schedule_next_run_at": "2026-10-27T06:00:00Z",
      "created_at": "2026-08-01T10:00:00Z"
    }
  ],
  "empty": false,
  "empty_reason": null,
  "scan": {
    "scanId": "a1b2c3d4-1111-2222-3333-444455556666",
    "gridId": "9b1a2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d",
    "gridName": "Cape Town Flagship",
    "keyword": "wholesale grocer near me",
    "scannedAt": "2026-10-20T06:02:14Z",
    "pointsBilled": 49,
    "totalPoints": 49,
    "pointsWithResults": 49
  },
  "tracked_place_id": "ChIJ1234567890abcdef",
  "your_avg_rank": 2.4,
  "your_best_rank": 1,
  "your_pin_visibility_pct": 91.8,
  "sov_pct": 34.2,
  "leaderboard": [
    {
      "placeId": "ChIJ1234567890abcdef",
      "name": "Cape Town Flagship",
      "appearances": 45,
      "pinVisibilityPct": 91.8,
      "shareOfVoicePct": 34.2,
      "avgRank": 2.4,
      "bestRank": 1,
      "avgRating": 4.7,
      "maxReviews": 412,
      "isYou": true
    }
  ],
  "benchmark": [
    {
      "place_id": "ChIJ1234567890abcdef",
      "name": "Cape Town Flagship",
      "rating": 4.7,
      "review_count": 412,
      "shareOfVoicePct": 34.2,
      "isYou": true
    }
  ],
  "meta": {
    "org_id": "00000000-0000-0000-0000-000000000000",
    "api_usage": { "month": "2026-10", "used": 15, "limit": 500000, "remaining": 499985 }
  }
}

3. Troubleshooting & Common Scenarios

  • `peak_days` returns `"—"`: Peak days are computed from daily BUSINESS_DIRECTION_REQUESTS buckets across the selected startDate..endDate. If a store had zero direction requests in that window, "—" is returned.
  • Difference between `your_pin_visibility_pct` and `sov_pct`: Pin visibility measures presence anywhere in the top 20 results on a coordinate pin, whereas sov_pct weights each pin by rank (21 - rank) against all competitors in the grid.
  • `empty: true` on `/api/v1/reports/seo-grid`: Either no Geo-Grid has been created under Competitor Analysis → Local SEO Grid or the first scan has not completed yet (empty_reason explains which).
Typical Tasks
  • Grant reports:read scope to your API key in Settings → Developer API
  • Call GET /api/v1/reports/locations/metrics with startDate and endDate
  • Use stores[].peak_days and per-store metric columns for location BI tables
  • Call GET /api/v1/reports/seo-grid for rank-weighted Share of Voice and competitor leaderboards

Developer API Reference

All Developer & Reporting API Modules

Manage API Keys →
Store Sync
locations:readlocations:write

Enterprise Store Locations API

Push and query your canonical store master records (up to 100 stores per batch) by store_code.

POST/api/v1/locations
GET/api/v1/locations
GET/api/v1/locations/{store_code}
DELETE/api/v1/locations/{store_code}
Local Presence & SEO
reports:readlocations:read

Locations Metrics & Local SEO Geo-Grid API

Pull Google Business Profile impressions, website clicks, phone calls, direction requests, peak footfall days, Meta store metrics, and Geo-Grid Share of Voice.

GET/api/v1/reports/locations/metrics
GET/api/v1/reports/seo-grid
Reputation & CX
reputation:readreports:read

Reputation, Reviews, Red Flags & CSAT API

Export star ratings, customer reviews, reply rates, business-hours response times, Red Flag alerts, and Customer Satisfaction cases.

GET/api/v1/reports/reputation/summary
GET/api/v1/reputation/reviews
GET/api/v1/reputation/red-flags
GET/api/v1/reputation/csat
WhatsApp Commerce
whatsapp:readreports:read

WhatsApp Commerce, Orders, Finance & Usage API

Export WhatsApp orders with normalized line items, fulfilment SLAs, paid GMV analytics, metered message volume, Auth OTP challenges, and loyalty balances.

GET/api/v1/whatsapp/orders
GET/api/v1/whatsapp/orders/{id}
GET/api/v1/whatsapp/reports/finance
GET/api/v1/whatsapp/reports/usage
Email & Marketing
email:readmarketing:readreports:read

Email Marketing, Workflows & Omnichannel Campaigns API

Pull active eligible subscriber counts, email campaign & automation engagement rates, WhatsApp marketing campaigns, and multi-platform social posts.

GET/api/v1/email/reports/overview
GET/api/v1/email/campaigns
GET/api/v1/email/workflows
GET/api/v1/marketing/campaigns
Inbox & Social Care
inbox:readsocial:readreports:read

Smart Inbox SLA & Social Inbox Engagement API

Export Smart Inbox ticket volumes and business-hours SLA metrics alongside Facebook & Instagram comment sentiment and actionable response rates.

GET/api/v1/inbox/reports/sla
GET/api/v1/social-inbox/reports
Insights & BI
insights:readreports:read

Insights Paid Media, GA4, Search Console & Attribution API

Pull paid media performance (Google Ads & Meta Ads), GA4 sessions and conversions, Google Search Console metrics, and True Attribution revenue.

GET/api/v1/insights/overview