Developer documentation

GMBRadar API Reference Beta

Endpoint-by-endpoint reference with authentication scopes, parameters, request and response examples, and code samples in five languages.

Base URL: https://www.gmbradar.com
Beta API warning: The GMBRadar API is still under development. You may encounter errors, unexpected behavior, incomplete features, or temporary interruptions. Endpoints, parameters, response formats, and behavior may change as we improve the API. Please handle errors in your integration and avoid relying on the Beta API for critical production workflows.

Authentication

Send an API key in the Authorization header. Use the scopes shown for each endpoint.

Get an API key: Sign in at gmbradar.com, then use the left-side menu and open Account → API Access, or go directly to gmbradar.com/account/api-access to create and manage API keys.

Authorization: Bearer $GMBRADAR_API_KEY
Accept: application/json
Content-Type: application/json
Beta41 endpoint actionsJSON APISearchable navigationCopyable examples
GET/api/v1/Test

1. Test

Required scope: `(none declared)`

Verify that the API key authenticated and inspect the authenticated API identity.

Input parameters

No parameters.

Inputs as documented: No parameters.
Example JSON request body

No JSON request body documented for this endpoint.

Example success response
{
  "success": true,
  "message": "API v1 authentication successful.",
  "data": {
    "userId": 123,
    "authenticationType": "ApiKey",
    "apiKeyId": 42,
    "scopes": [
      "businesses:read",
      "scans:read"
    ]
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

This endpoint checks API-key authentication and returns the authenticated API identity. No additional scope is required.

Code examples
curl -X GET "https://www.gmbradar.com/api/v1/Test" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json"
GET/api/v1/TestRead

2. TestRead

Required scope: `businesses:read`

Verify that the key has business read access.

Input parameters

No parameters.

Inputs as documented: No parameters.
Example JSON request body

No JSON request body documented for this endpoint.

Example success response
{
  "success": true,
  "message": "API v1 read access granted."
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Code examples
curl -X GET "https://www.gmbradar.com/api/v1/TestRead" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json"
POST/api/v1/TestWrite

3. TestWrite

Required scope: `businesses:write`

Verify that the key has business write access.

Input parameters

No parameters.

Inputs as documented: No parameters.
Example JSON request body

No JSON request body documented for this endpoint.

Example success response
{
  "success": true,
  "message": "API v1 write access granted."
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Code examples
curl -X POST "https://www.gmbradar.com/api/v1/TestWrite" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json"
GET/api/v1/Account

4. Account

Required scope: `account:read`

Retrieve account information for the authenticated user.

Input parameters

No parameters.

Inputs as documented: No parameters.
Example JSON request body

No JSON request body documented for this endpoint.

Example success response
{
  "success": true,
  "data": {
    "Email": "user@example.com",
    "Credits": [
      {
        "ID": 101,
        "Title": "Premium Credits",
        "Total": 50000,
        "Remaining": 42000,
        "ExpiryDate": "/Date(1798761600000)/",
        "Status": "active"
      }
    ],
    "Preferences": {
      "Language": "en",
      "TimeZone": "Asia/Karachi",
      "UtcOffset": 300,
      "DateFormatShort": "dd/MM/yyyy",
      "DateFormatLong": "dd MMMM yyyy",
      "TimeFormat": "HH:mm",
      "MeasurementUnit": "km",
      "MapBrightness": 100,
      "ManualCompleteEmail": true,
      "AutoCompleteEmail": true,
      "Promotions": false,
      "Theme": "light",
      "DefaultScanPriority": 1,
      "MarkerThemeGuid": null
    }
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

The `data` object contains account information for the authenticated user.

Code examples
curl -X GET "https://www.gmbradar.com/api/v1/Account" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json"
GET/api/v1/Businesses

5. Businesses

Required scope: `businesses:read`

List businesses owned by the authenticated account, or retrieve one business by public GUID.

Input parameters
ParameterTypeRequirementDescription / validation
businessIdstringOptional / conditionaloptional, string: business GUID. If supplied, returns one business
pageintegerOptional / conditionaloptional integer, default 1: must be >= 1 when listing
pageSizeintegerOptional / conditionaloptional integer, default 50: 1–100 when listing
Inputs as documented: businessId (optional, string): business GUID. If supplied, returns one business. page (optional integer, default 1): must be >= 1 when listing. pageSize (optional integer, default 50): 1–100 when listing.
Example JSON request body

No JSON request body documented for this endpoint.

Example success response
{
  "success": true,
  "data": [
    {
      "Id": "879084d3-b14c-4c84-8c46-7e18a6e847ff",
      "Title": "Coffee Hall",
      "Alias": "",
      "PlaceId": "ChIJsY_Ugg4mPw0RR_ri3TVDs4w",
      "Website": "http://www.thenewsalondelcafe.com/",
      "Address": "Calle Aire, 1, 37001 Salamanca",
      "Lat": 40.966564,
      "Lng": -5.660424,
      "DateAdded": "/Date(1791471826547)/",
      "Domain": "www.thenewsalondelcafe.com",
      "MapUrl": "https://maps.google.com/?cid=10138521084776086087",
      "IsActive": true,
      "Rating": 4.5,
      "Reviews": 804,
      "Phone": "+34923711711",
      "PhoneInt": "+34 923 71 17 11",
      "Title2": "The New Salón del Café",
      "Categories": "Pub",
      "AdditionalCategories": "null",
      "Groups": []
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 50,
    "total": 152,
    "totalPages": 4
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Single-business response (when businessId is supplied)
{
  "success": true,
  "data": {
    "Id": "bfd94ce0-955d-4878-bc38-54509fd3b4e8",
    "Title": "Salon de jeux de Québec",
    "Alias": "",
    "PlaceId": "ChIJyzUT_zmWuEwRU2YwT-5kC8Y",
    "Website": "https://salonsdejeux.lotoquebec.com/fr/quebec/accueil",
    "Address": "847 Rue Clemenceau",
    "Lat": 46.86844,
    "Lng": -71.20911,
    "DateAdded": "/Date(1782139106823)/",
    "Domain": "",
    "MapUrl": "https://maps.google.com/?cid=14270610818947114579",
    "IsActive": true,
    "Rating": 3.9,
    "Reviews": 1652,
    "Phone": "(877) 700-5836,(877) 700-5836",
    "PhoneInt": "+1 877-700-5836",
    "Title2": "Y-PAK ADRONG (Canadians)",
    "Categories": null,
    "AdditionalCategories": null,
    "Groups": []
  }
}
Behavior and validation

When `businessId` is supplied, `data` contains one business object and pagination fields are omitted.

Code examples
curl -X GET "https://www.gmbradar.com/api/v1/Businesses" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json"
POST/api/v1/CreateBusiness

6. CreateBusiness

Required scope: `businesses:write`

Add a Google Maps business to the authenticated account using its Google Place ID.

Input parameters
ParameterTypeRequirementDescription / validation
placeIdstringRequiredrequired string, max 100 chars
lat—Optional / conditionaloptional decimal, -90 to 90
lng—Optional / conditionaloptional decimal, -180 to 180
aliasstringOptional / conditionaloptional string
Inputs as documented: placeId (required string, max 100 chars); lat (optional decimal, -90 to 90); lng (optional decimal, -180 to 180); alias (optional string).
Example JSON request body
{
  "placeId": "ChIJexamplePlaceId",
  "lat": 33.7215,
  "lng": 73.0433,
  "alias": "Main location"
}
Example success response
{
  "success": true,
  "data": {
    "id": "bfd94ce0-955d-4878-bc38-54509fd3b4e8",
    "placeId": "ChIJyzUT_zmWuEwRU2YwT-5kC8Y",
    "title": "Salon de jeux de Québec"
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

Latitude/longitude override the coordinates returned by Google when supplied. Duplicate businesses return 409; free-plan limit may return 409; unavailable Place data returns 404.

Code examples
curl -X POST "https://www.gmbradar.com/api/v1/CreateBusiness" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"placeId":"ChIJexamplePlaceId","lat":33.7215,"lng":73.0433,"alias":"Main location"}'
POST/api/v1/DeleteBusiness

7. DeleteBusiness

Required scope: `businesses:write`

Delete a business belonging to the authenticated account and disable its classic automatic scans.

Input parameters
ParameterTypeRequirementDescription / validation
businessIdstringRequiredrequired string: business GUID
Inputs as documented: businessId (required string): business GUID.
Example JSON request body
{
  "businessId": "11111111-2222-3333-4444-555555555555"
}
Example success response
{
  "success": true,
  "data": {
    "id": "bfd94ce0-955d-4878-bc38-54509fd3b4e8"
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

Use POST to delete the scan. Associated AutoScan schedules are disabled first.

Code examples
curl -X POST "https://www.gmbradar.com/api/v1/DeleteBusiness" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"businessId":"11111111-2222-3333-4444-555555555555"}'
GET/api/v1/Groups

8. Groups

Required scope: `groups:read`

List groups, or retrieve one group by public group GUID.

Input parameters
ParameterTypeRequirementDescription / validation
groupIdstringOptional / conditionaloptional string
pageintegerOptional / conditionaloptional integer, default 1; values below 1 reset to 1
pageSizeintegerOptional / conditionaloptional integer, default 50; values below 1 reset to 50 and above 100 reset to 100
Inputs as documented: groupId (optional string); page (optional integer, default 1; values below 1 reset to 1); pageSize (optional integer, default 50; values below 1 reset to 50 and above 100 reset to 100).
Example JSON request body

No JSON request body documented for this endpoint.

Example success response
{
  "success": true,
  "data": {
    "items": [
      {
        "Id": "676ED6DD-BB63-471D-828D-8ADFBA74B59F",
        "Name": "Client A group",
        "Description": "Client group",
        "ParentGroupId": null,
        "ParentGroupName": null,
        "DateCreated": "/Date(1791432011097)/",
        "DateUpdated": null,
        "BusinessCount": 2,
        "Businesses": []
      }
    ],
    "page": 1,
    "pageSize": 50,
    "total": 1,
    "totalPages": 1
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

When groupId is supplied, data is a single group object without pagination.

Code examples
curl -X GET "https://www.gmbradar.com/api/v1/Groups" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json"
POST/api/v1/CreateGroup

9. CreateGroup

Required scope: `groups:write`

Create a group, optionally nested under a parent group.

Input parameters
ParameterTypeRequirementDescription / validation
namestringRequiredrequired string, max 300 chars
descriptionstringOptional / conditionaloptional string
parentGroupIdGUIDOptional / conditionaloptional public group GUID; must belong to the account
Inputs as documented: name (required string, max 300 chars); description (optional string); parentGroupId (optional public group GUID; must belong to the account).
Example JSON request body
{
  "name": "Islamabad Clients",
  "description": "Businesses managed by the Islamabad team",
  "parentGroupId": null
}
Example success response
{
  "success": true,
  "data": {
    "Id": "676ED6DD-BB63-471D-828D-8ADFBA74B59F",
    "Name": "Client A group",
    "Description": "Client group",
    "ParentGroupId": null,
    "ParentGroupName": null,
    "DateCreated": "/Date(1791432011097)/",
    "DateUpdated": null,
    "BusinessCount": 0,
    "Businesses": []
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

Code examples
curl -X POST "https://www.gmbradar.com/api/v1/CreateGroup" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"name":"Islamabad Clients","description":"Businesses managed by the Islamabad team","parentGroupId":null}'
POST/api/v1/UpdateGroup

10. UpdateGroup

Required scope: `groups:write`

Update a group's name, description and optional parent.

Input parameters
ParameterTypeRequirementDescription / validation
groupIdstringRequiredrequired string, provided as a query or form parameter: body
namestringRequiredrequired string, max 300 chars
description—Optional / conditionaloptional
parentGroupIdGUIDOptional / conditionaloptional public GUID
Inputs as documented: groupId (required string, provided as a query or form parameter); body name (required string, max 300 chars); description (optional); parentGroupId (optional public GUID).
Example JSON request body
{
  "name": "Islamabad SEO Clients",
  "description": "Updated description",
  "parentGroupId": null
}
Example success response
{
  "success": true,
  "data": {
    "Id": "676ED6DD-BB63-471D-828D-8ADFBA74B59F",
    "Name": "Client A group - Updated",
    "Description": "Updated description",
    "ParentGroupId": null,
    "ParentGroupName": null,
    "DateCreated": "/Date(1791432011097)/",
    "DateUpdated": "/Date(1791903050760)/",
    "BusinessCount": 0,
    "Businesses": []
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

A group cannot be its own parent or be assigned one of its descendants as parent. For this endpoint, provide `groupId` as a query or form parameter.

Code examples
curl -X POST "https://www.gmbradar.com/api/v1/UpdateGroup" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"name":"Islamabad SEO Clients","description":"Updated description","parentGroupId":null}'
POST/api/v1/DeleteGroup

11. DeleteGroup

Required scope: `groups:write`

Delete a group owned by the authenticated user.

Input parameters
ParameterTypeRequirementDescription / validation
groupIdstringRequiredrequired string: public group GUID
Inputs as documented: groupId (required string): public group GUID.
Example JSON request body
{
  "groupId": "22222222-3333-4444-5555-666666666666"
}
Example success response
{
  "success": true,
  "message": "Group deleted successfully."
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

Unknown groups return 404.

Code examples
curl -X POST "https://www.gmbradar.com/api/v1/DeleteGroup" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"groupId":"22222222-3333-4444-5555-666666666666"}'
GET/api/v1/GroupBusinesses

12. GroupBusinesses

Required scope: `groups:read`

List businesses assigned to a group, with optional text search.

Input parameters
ParameterTypeRequirementDescription / validation
groupIdstringRequiredrequired string
page—Optional / conditionaldefault 1, values below 1 become 1
pageSize—Optional / conditionaldefault 50, values below 1 become 50, max 100
searchstringOptional / conditionaloptional string
Inputs as documented: groupId (required string); page (default 1, values below 1 become 1); pageSize (default 50, values below 1 become 50, max 100); search (optional string).
Example JSON request body

No JSON request body documented for this endpoint.

Example success response
{
  "success": true,
  "data": [
    {
      "Id": "bfd94ce0-955d-4878-bc38-54509fd3b4e8",
      "Title": "Salon de jeux de Québec",
      "Alias": "",
      "PlaceId": "ChIJyzUT_zmWuEwRU2YwT-5kC8Y",
      "Address": "847 Rue Clemenceau",
      "Website": "https://salonsdejeux.lotoquebec.com/fr/quebec/accueil",
      "Phone": "+1 877-700-5836",
      "Rating": 3.9,
      "Reviews": 1652
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 50,
    "total": 1,
    "totalPages": 1
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

A missing/unknown group returns 404.

Code examples
curl -X GET "https://www.gmbradar.com/api/v1/GroupBusinesses" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json"
GET/api/v1/AvailableGroupBusinesses

13. AvailableGroupBusinesses

Required scope: `groups:read`

List businesses owned by the user that are available to add to the specified group.

Input parameters
ParameterTypeRequirementDescription / validation
groupIdstringRequiredrequired string
page—Optional / conditionaldefault 1, normalized to >=1
pageSize—Optional / conditionaldefault 50, max 100
searchstringOptional / conditionaloptional string
Inputs as documented: groupId (required string); page (default 1, normalized to >=1); pageSize (default 50, max 100); search (optional string).
Example JSON request body

No JSON request body documented for this endpoint.

Example success response
{
  "success": true,
  "data": [
    {
      "Id": "879084d3-b14c-4c84-8c46-7e18a6e847ff",
      "Title": "Coffee Hall",
      "Alias": "",
      "PlaceId": "ChIJsY_Ugg4mPw0RR_ri3TVDs4w",
      "Address": "Calle Aire, 1, 37001 Salamanca",
      "Website": "http://www.thenewsalondelcafe.com/",
      "Phone": "+34 923 71 17 11",
      "Rating": 4.5,
      "Reviews": 804
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 50,
    "total": 1,
    "totalPages": 1
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

The result excludes businesses already in the group.

Code examples
curl -X GET "https://www.gmbradar.com/api/v1/AvailableGroupBusinesses" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json"
POST/api/v1/AddGroupBusinesses

14. AddGroupBusinesses

Required scope: `groups:write`

Add one or more businesses to a group.

Input parameters
ParameterTypeRequirementDescription / validation
groupId—Requiredrequired parameter
businessIdsarrayRequiredrequired JSON array with at least one business GUID
Inputs as documented: groupId (required parameter); businessIds (required JSON array with at least one business GUID).
Example JSON request body
{
  "businessIds": [
    "11111111-2222-3333-4444-555555555555",
    "33333333-4444-5555-6666-777777777777"
  ]
}
Example success response
{
  "success": true,
  "data": {
    "added": 2
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

Invalid IDs return 400 and include invalidBusinessIds and added count in data.

Code examples
curl -X POST "https://www.gmbradar.com/api/v1/AddGroupBusinesses" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"businessIds":["11111111-2222-3333-4444-555555555555","33333333-4444-5555-6666-777777777777"]}'
POST/api/v1/RemoveGroupBusinesses

15. RemoveGroupBusinesses

Required scope: `groups:write`

Remove one or more businesses from a group.

Input parameters
ParameterTypeRequirementDescription / validation
groupId—Requiredrequired parameter
businessIdsarrayRequiredrequired JSON array with at least one business GUID
Inputs as documented: groupId (required parameter); businessIds (required JSON array with at least one business GUID).
Example JSON request body
{
  "businessIds": [
    "11111111-2222-3333-4444-555555555555"
  ]
}
Example success response
{
  "success": true,
  "data": {
    "removed": 1
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

Invalid IDs return 400 and include invalidBusinessIds and removed count in data.

Code examples
curl -X POST "https://www.gmbradar.com/api/v1/RemoveGroupBusinesses" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"businessIds":["11111111-2222-3333-4444-555555555555"]}'
GET/api/v1/organic-scans

16. ListOrganicScans

Required scope: `scans:read`

List organic scan tasks owned by the authenticated account.

Input parameters
ParameterTypeRequirementDescription / validation
page—Optional / conditionaldefault 1, >=1
pageSize—Optional / conditionaldefault 50, 1–100
businessIdGUIDOptional / conditionaloptional business GUID
search—Optional / conditionaloptional text filter
Inputs as documented: page (default 1, >=1); pageSize (default 50, 1–100); businessId (optional business GUID); search (optional text filter).
Example JSON request body

No JSON request body documented for this endpoint.

Example success response
{
  "success": true,
  "data": [
    {
      "TaskId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
      "SearchId": "bbbbbbbb-cccc-dddd-eeee-ffffffffffff",
      "BusinessId": "bfd94ce0-955d-4878-bc38-54509fd3b4e8",
      "BusinessName": "Salon de jeux de Québec",
      "Domain": "salonsdejeux.lotoquebec.com",
      "Keyword": "salon",
      "Url": "https://salonsdejeux.lotoquebec.com/fr/quebec/accueil",
      "Status": "complete",
      "DateCreated": "/Date(1791432011097)/",
      "LocationName": "Québec, Canada",
      "LanguageCode": "en",
      "Device": "desktop",
      "SearchStatus": "complete",
      "LastSearchDate": "/Date(1791432427380)/",
      "WebRank": 3,
      "LocalRank": 2
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 50,
    "total": 1,
    "totalPages": 1
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

Use the business GUID as the `businessId` value.

Code examples
curl -X GET "https://www.gmbradar.com/api/v1/organic-scans?page=1&pageSize=50" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json"
GET/api/v1/organic-scans/{taskId}

17. OrganicScanDetails

Required scope: `scans:read`

Retrieve one organic scan task owned by the authenticated user.

Input parameters
ParameterTypeRequirementDescription / validation
taskIdstringRequiredrequired path string: public task GUID
Inputs as documented: taskId (required path string): public task GUID.
Example JSON request body

No JSON request body documented for this endpoint.

Example success response
{
  "success": true,
  "data": {
    "taskId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
    "keyword": "plumber",
    "url": "",
    "status": "pending",
    "dateCreated": "2026-10-10T12:00:00Z",
    "locationName": "Islamabad, Pakistan",
    "locationCode": 2276,
    "languageCode": "en",
    "device": "desktop",
    "os": "",
    "domain": "example.com",
    "businessId": "11111111-2222-3333-4444-555555555555"
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Code examples
curl -X GET "https://www.gmbradar.com/api/v1/organic-scans/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json"
GET/api/v1/organic-scans/searches

18. OrganicScanSearches

Required scope: `scans:read`

List organic search executions or group them by task. Grouped mode is the default.

Input parameters
ParameterTypeRequirementDescription / validation
page—Optional / conditionaldefault 1
pageSize—Optional / conditionaldefault 50, 1–100
grouped—Optional / conditionaldefault true
businessIdGUIDOptional / conditionaloptional business GUID
taskIdGUIDOptional / conditionaloptional task GUID
search—Optional / conditionaloptional text filter
Inputs as documented: page (default 1); pageSize (default 50, 1–100); grouped (default true); businessId (optional business GUID); taskId (optional task GUID); search (optional text filter).
Example JSON request body

No JSON request body documented for this endpoint.

Example success response
{
  "success": true,
  "data": [
    {
      "title": "plumber",
      "searchGuid": "bbbbbbbb-cccc-dddd-eeee-ffffffffffff",
      "businessId": "11111111-2222-3333-4444-555555555555",
      "domain": "example.com",
      "keyword": "plumber",
      "endTime": "2026-10-10T12:30:00Z",
      "localRank": 2,
      "webRank": 5,
      "status": "completed",
      "location": "Islamabad, Pakistan",
      "taskId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
      "projectId": 12,
      "searchCount": 3
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 50,
    "total": 1,
    "totalPages": 1
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

When results are grouped, `searchCount` represents the number of executions. Use `searchGuid` to identify an organic search.

Code examples
curl -X GET "https://www.gmbradar.com/api/v1/organic-scans/searches?page=1&pageSize=50" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json"
GET/api/v1/organic-scans/searches/{searchId}/status

19. OrganicSearchStatus

Required scope: `scans:read`

Retrieve the current status of a single organic search execution.

Input parameters
ParameterTypeRequirementDescription / validation
searchIdstringRequiredrequired path string: public search GUID
Inputs as documented: searchId (required path string): public search GUID.
Example JSON request body

No JSON request body documented for this endpoint.

Example success response
{
  "success": true,
  "data": {
    "searchGuid": "bbbbbbbb-cccc-dddd-eeee-ffffffffffff",
    "status": "completed"
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Code examples
curl -X GET "https://www.gmbradar.com/api/v1/organic-scans/searches/bbbbbbbb-cccc-dddd-eeee-ffffffffffff/status?page=1&pageSize=50" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json"
GET/api/v1/organic-scans/searches/{searchId}/results

20. OrganicSearchResults

Required scope: `reports:read`

Retrieve paginated SERP result rows for an organic search execution.

Input parameters
ParameterTypeRequirementDescription / validation
searchIdstringRequiredrequired path string
page—Optional / conditionaldefault 1, >=1
pageSize—Optional / conditionaldefault 50, 1–100
Inputs as documented: searchId (required path string); page (default 1, >=1); pageSize (default 50, 1–100).
Example JSON request body

No JSON request body documented for this endpoint.

Example success response
{
  "success": true,
  "data": [
    {
      "id": 901,
      "taskId": 12345,
      "type": "organic",
      "rankGroup": 1,
      "rankAbsolute": 1,
      "position": "left",
      "xpath": "//div[1]",
      "title": "Example Plumbing",
      "description": "Plumbing services",
      "domain": "example.com",
      "url": "https://example.com/",
      "isPaid": false,
      "cid": null,
      "websiteName": "Example Plumbing",
      "isImage": false,
      "isVideo": false,
      "isFeaturedSnippet": false,
      "isMalicious": false,
      "isWebStory": false,
      "preSnippet": null,
      "hasWeb": true,
      "hasLocal": false
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 50,
    "total": 1,
    "totalPages": 1
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Code examples
curl -X GET "https://www.gmbradar.com/api/v1/organic-scans/searches/bbbbbbbb-cccc-dddd-eeee-ffffffffffff/results?page=1&pageSize=50" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json"
GET/api/v1/organic-scans/locations

21. OrganicScanLocations

Required scope: `scans:read`

Search DataForSEO's Google SERP location catalogue by name, optionally limited to a country.

Input parameters
ParameterTypeRequirementDescription / validation
searchstringRequiredrequired string, at least 2 chars
countryCode—Optional / conditionaloptional 2-letter ISO country code
limit—Optional / conditionaldefault 50, 1–100
Inputs as documented: search (required string, at least 2 chars); countryCode (optional 2-letter ISO country code); limit (default 50, 1–100).
Example JSON request body

No JSON request body documented for this endpoint.

Example success response
{
  "success": true,
  "data": [
    {
      "locationName": "Islamabad, Islamabad Capital Territory, Pakistan",
      "locationCode": 2276,
      "countryCode": "PK",
      "locationType": "City",
      "parentLocationCode": null
    }
  ],
  "count": 1
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

Results are cached per country for 24 hours. Requires DataForSEOLogin and DataForSEOPassword appSettings; provider failures may return 502.

Code examples
curl -X GET "https://www.gmbradar.com/api/v1/organic-scans/locations" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json"
POST/api/v1/organic-scans/create

22. CreateOrganicScan

Required scope: `scans:write`

Create one or more organic scan tasks for a domain and keyword list, either starting immediately or scheduling each task.

Input parameters
ParameterTypeRequirementDescription / validation
domainstringRequiredrequired string
keywordstringRequiredrequired comma-separated string, 1–50 distinct non-empty keywords
locationCodeintegerRequiredrequired integer >=1
languageCodestringRequiredrequired string
depthintegerRequiredrequired integer 1–200
businessIdGUIDOptional / conditionaloptional business GUID: url, locationName, locationCoordinate, languageName
searchEngineDomain—Optional / conditionaldefault google.com
device—Optional / conditionaldefault desktop: os, target, groupOrganicResults, calculateRectangles, browserScreenWidth, browserScreenHeight, browserScreenResolutionRatio, peopleAlsoAskClickDepth, loadAsyncAiOverview, searchParam, removeFromUrl, tag
priority—Optional / conditionalvalues below 1 are normalized to 1
runNow—Optional / conditionaldefault true: if runNow=false, frequency and future startDateTimeUtc are required
Inputs as documented: Body fields: domain (required string); keyword (required comma-separated string, 1–50 distinct non-empty keywords); locationCode (required integer >=1); languageCode (required string); depth (required integer 1–200); businessId (optional business GUID); url, locationName, locationCoordinate, languageName, searchEngineDomain (default google.com), device (default desktop), os, target, groupOrganicResults, calculateRectangles, browserScreenWidth, browserScreenHeight, browserScreenResolutionRatio, peopleAlsoAskClickDepth, loadAsyncAiOverview, searchParam, removeFromUrl, tag, priority (values below 1 are normalized to 1); runNow (default true); if runNow=false, frequency and future startDateTimeUtc are required.
Example JSON request body
{
  "businessId": "11111111-2222-3333-4444-555555555555",
  "domain": "example.com",
  "keyword": "plumber, emergency plumber",
  "url": "",
  "priority": 1,
  "depth": 100,
  "locationName": "Islamabad, Pakistan",
  "locationCode": 2276,
  "locationCoordinate": "",
  "languageName": "English",
  "languageCode": "en",
  "searchEngineDomain": "google.com",
  "device": "desktop",
  "os": "windows",
  "target": "",
  "groupOrganicResults": false,
  "calculateRectangles": false,
  "browserScreenWidth": 1920,
  "browserScreenHeight": 1080,
  "browserScreenResolutionRatio": 1,
  "peopleAlsoAskClickDepth": 0,
  "loadAsyncAiOverview": false,
  "searchParam": "",
  "removeFromUrl": "",
  "tag": "api",
  "runNow": true
}
Example success response
{
  "success": true,
  "data": {
    "projectId": 12,
    "scans": [
      {
        "taskId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
        "keyword": "plumber",
        "status": "started"
      },
      {
        "taskId": "cccccccc-dddd-eeee-ffff-aaaaaaaaaaaa",
        "keyword": "emergency plumber",
        "status": "started"
      }
    ]
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

If `runNow=false`, each item includes `scheduleId` and `status=scheduled`. `businessId` must be a valid business GUID belonging to the authenticated user. Use a supported frequency for the selected scheduling endpoint.

Code examples
curl -X POST "https://www.gmbradar.com/api/v1/organic-scans/create" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"businessId":"11111111-2222-3333-4444-555555555555","domain":"example.com","keyword":"plumber, emergency plumber","url":"","priority":1,"depth":100,"locationName":"Islamabad, Pakistan","locationCode":2276,"locationCoordinate":"","languageName":"English","languageCode":"en","searchEngineDomain":"google.com","device":"desktop","os":"windows","target":"","groupOrganicResults":false,"calculateRectangles":false,"browserScreenWidth":1920,"browserScreenHeight":1080,"browserScreenResolutionRatio":1,"peopleAlsoAskClickDepth":0,"loadAsyncAiOverview":false,"searchParam":"","removeFromUrl":"","tag":"api","runNow":true}'
POST/api/v1/organic-scans/{taskId}/repeat

23. RepeatOrganicScan

Required scope: `scans:write`

Run an existing organic task again immediately, or schedule a repeat.

Input parameters
ParameterTypeRequirementDescription / validation
taskIdGUIDRequiredrequired path GUID: JSON body
runNow—Optional / conditionaldefault true: if false, frequency and future startDateTimeUtc are required
Inputs as documented: taskId (required path GUID); JSON body runNow (default true); if false, frequency and future startDateTimeUtc are required.
Example JSON request body
{
  "runNow": false,
  "frequency": "weekly",
  "startDateTimeUtc": "2026-10-18T09:00:00Z"
}
Example success response
{
  "success": true,
  "data": {
    "taskId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
    "scheduleId": "dddddddd-eeee-ffff-aaaa-bbbbbbbbbbbb",
    "status": "scheduled"
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

When `runNow=true`, the response contains `taskId` and `status=started`.

Code examples
curl -X POST "https://www.gmbradar.com/api/v1/organic-scans/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/repeat" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"runNow":false,"frequency":"weekly","startDateTimeUtc":"2026-10-18T09:00:00Z"}'
POST/api/v1/organic-scans/{taskId}/schedule

24. ScheduleExistingOrganicScan

Required scope: `scans:write`

Create a recurring schedule for an existing organic task.

Input parameters
ParameterTypeRequirementDescription / validation
taskIdGUIDRequiredrequired path GUID
frequency—Requiredrequired: daily, weekly, monthly
startDateTimeUtcdateRequiredrequired future UTC date/time
Inputs as documented: taskId (required path GUID); frequency (required: daily, weekly, monthly); startDateTimeUtc (required future UTC date/time).
Example JSON request body
{
  "frequency": "weekly",
  "startDateTimeUtc": "2026-10-18T09:00:00Z"
}
Example success response
{
  "success": true,
  "data": {
    "taskId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
    "scheduleId": "dddddddd-eeee-ffff-aaaa-bbbbbbbbbbbb",
    "status": "scheduled",
    "frequency": "weekly",
    "startDateTimeUtc": "2026-10-18T09:00:00Z",
    "nextStartDateTimeUtc": "2026-10-18T09:00:00Z"
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

Frequency is case-normalized and must be daily, weekly or monthly.

Code examples
curl -X POST "https://www.gmbradar.com/api/v1/organic-scans/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/schedule" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"frequency":"weekly","startDateTimeUtc":"2026-10-18T09:00:00Z"}'
DELETE/api/v1/organic-scans/searches/{searchId}

25. DeleteOrganicSearch

Required scope: `scans:write`

Delete an organic search execution owned by the authenticated user.

Input parameters
ParameterTypeRequirementDescription / validation
searchIdstringRequiredrequired path string: public search GUID
Inputs as documented: searchId (required path string): public search GUID.
Example JSON request body

No JSON request body documented for this endpoint.

Example success response
{
  "success": true,
  "data": {
    "searchGuid": "bbbbbbbb-cccc-dddd-eeee-ffffffffffff",
    "deleted": true
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Code examples
curl -X DELETE "https://www.gmbradar.com/api/v1/organic-scans/searches/bbbbbbbb-cccc-dddd-eeee-ffffffffffff" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json"
GET/api/v1/organic-scans/schedules

26. OrganicScanSchedules

Required scope: `scans:read`

List organic scan schedules, optionally filtered by status.

Input parameters
ParameterTypeRequirementDescription / validation
page—Optional / conditionaldefault 1, >=1
pageSize—Optional / conditionaldefault 50, 1–100
statusstringOptional / conditionaloptional string
Inputs as documented: page (default 1, >=1); pageSize (default 50, 1–100); status (optional string).
Example JSON request body

No JSON request body documented for this endpoint.

Example success response
{
  "success": true,
  "data": [
    {
      "scheduleId": "dddddddd-eeee-ffff-aaaa-bbbbbbbbbbbb",
      "taskId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
      "frequency": "weekly",
      "status": "active",
      "startDateTimeUtc": "2026-10-18T09:00:00Z",
      "nextStartDateTimeUtc": "2026-10-18T09:00:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 50,
    "total": 1,
    "totalPages": 1
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

Code examples
curl -X GET "https://www.gmbradar.com/api/v1/organic-scans/schedules" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json"
DELETE/api/v1/organic-scans/schedules/{scheduleId}

27. DeleteOrganicScanSchedule

Required scope: `scans:write`

Delete an organic scan schedule owned by the authenticated user.

Input parameters
ParameterTypeRequirementDescription / validation
scheduleIdstringRequiredrequired path string
Inputs as documented: scheduleId (required path string).
Example JSON request body

No JSON request body documented for this endpoint.

Example success response
{
  "success": true,
  "data": {
    "scheduleId": "dddddddd-eeee-ffff-aaaa-bbbbbbbbbbbb",
    "deleted": true
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Code examples
curl -X DELETE "https://www.gmbradar.com/api/v1/organic-scans/schedules/dddddddd-eeee-ffff-aaaa-bbbbbbbbbbbb" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json"
POST/api/v1/organic-scans/schedules/{scheduleId}/deactivate

28. DeactivateOrganicScanSchedule

Required scope: `scans:write`

Disable an organic scan schedule and clear its next run time.

Input parameters
ParameterTypeRequirementDescription / validation
scheduleIdstringRequiredrequired path string
Inputs as documented: scheduleId (required path string).
Example JSON request body

No JSON request body documented for this endpoint.

Example success response
{
  "success": true,
  "data": {
    "scheduleId": "dddddddd-eeee-ffff-aaaa-bbbbbbbbbbbb",
    "status": "disabled",
    "nextStartDateTime": null
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Code examples
curl -X POST "https://www.gmbradar.com/api/v1/organic-scans/schedules/dddddddd-eeee-ffff-aaaa-bbbbbbbbbbbb/deactivate" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json"
POST/api/v1/organic-scans/schedules/{scheduleId}/activate

29. ActivateOrganicScanSchedule

Required scope: `scans:write`

Activate a disabled organic scan schedule and calculate its next run if its original start time has passed.

Input parameters
ParameterTypeRequirementDescription / validation
scheduleIdstringRequiredrequired path string
Inputs as documented: scheduleId (required path string).
Example JSON request body

No JSON request body documented for this endpoint.

Example success response
{
  "success": true,
  "data": {
    "scheduleId": "dddddddd-eeee-ffff-aaaa-bbbbbbbbbbbb",
    "status": "active",
    "nextStartDateTime": "2026-10-18T09:00:00Z"
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

If a past start time needs recalculation, only daily, weekly and monthly frequencies are supported.

Code examples
curl -X POST "https://www.gmbradar.com/api/v1/organic-scans/schedules/dddddddd-eeee-ffff-aaaa-bbbbbbbbbbbb/activate" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json"
POST/api/v1/Scans

30. Scans

Required scope: `scans:read`

Search and list classic local-rank scan runs, including the history of repeated scans.

Important — scan history: Use the same keywordId to retrieve repeated scan runs for that keyword. Combine it with businessId to limit the history to one business and keyword. Results are newest first. Each result has its own Id; use that ID with GET /api/v1/ScanDetails?scanId={scanId} to retrieve the full result for that run.
Input parameters

All parameters are supplied in the JSON request body. Filters can be combined.

ParameterTypeRequirementDescription / how it is used
businessIdGUID stringOptionalLimits results to scans for this business. Combine with keywordId for one business/keyword history.
groupIdGUID stringOptionalLimits results to businesses belonging to this group.
keywordIdGUID stringOptionalLimits results to scans for this keyword record. Reuse the same keyword ID to retrieve weekly or other repeated runs for that keyword.
statusstringOptionalFilters by the stored scan status. Use the status value returned by the API, such as Complete or Running.
dateFromdate/timeOptionalIncludes scans created on or after this date/time.
dateTodate/timeOptionalIncludes scans through the specified calendar date; the current implementation treats it as an inclusive date filter.
searchstringOptionalSearches business title, keyword text, business address, and business alias.
pageintegerOptionalPage number; defaults to 1. Values below 1 are normalized to 1.
pageSizeintegerOptionalRecords per page; defaults to 50. Values below 1 become 50; values above 100 are capped at 100.

Omitting keywordId returns scans across keywords that match the other filters. Add dateFrom and dateTo to limit the history to a period.

Example JSON request body — scan history
{
  "businessId": "bfd94ce0-955d-4878-bc38-54509fd3b4e8",
  "keywordId": "650c2586-7e91-496d-ae72-7b9edcaacc01",
  "page": 1,
  "pageSize": 50
}
Example success response

The values below illustrate three weekly runs for the same business and keyword; rankings and scan IDs are examples.

{
  "success": true,
  "data": [
    {
      "Id": "scan-week-3",
      "Status": "Complete",
      "Business": { "Id": "bfd94ce0-955d-4878-bc38-54509fd3b4e8", "Title": "Salon de jeux de Québec", "Alias": "", "PlaceId": "ChIJyzUT_zmWuEwRU2YwT-5kC8Y", "Address": "847 Rue Clemenceau", "Rating": 3.9, "Reviews": 1652 },
      "Keyword": { "Id": "650c2586-7e91-496d-ae72-7b9edcaacc01", "Keyword": "salon", "Language": "en" },
      "LocationCount": 9,
      "RankedLocations": 9,
      "AverageRank": 8.2,
      "AverageRankTotal": 8.2,
      "BestRank": 1,
      "DateCreated": "/Date(1791903050760)/",
      "ScanCount": 3
    },
    {
      "Id": "scan-week-2",
      "Status": "Complete",
      "Business": { "Id": "bfd94ce0-955d-4878-bc38-54509fd3b4e8", "Title": "Salon de jeux de Québec", "Alias": "", "PlaceId": "ChIJyzUT_zmWuEwRU2YwT-5kC8Y", "Address": "847 Rue Clemenceau", "Rating": 3.9, "Reviews": 1652 },
      "Keyword": { "Id": "650c2586-7e91-496d-ae72-7b9edcaacc01", "Keyword": "salon", "Language": "en" },
      "LocationCount": 9, "RankedLocations": 8, "AverageRank": 10.5, "AverageRankTotal": 11.2, "BestRank": 2,
      "DateCreated": "/Date(1791298250760)/", "ScanCount": 3
    },
    {
      "Id": "scan-week-1",
      "Status": "Complete",
      "Business": { "Id": "bfd94ce0-955d-4878-bc38-54509fd3b4e8", "Title": "Salon de jeux de Québec", "Alias": "", "PlaceId": "ChIJyzUT_zmWuEwRU2YwT-5kC8Y", "Address": "847 Rue Clemenceau", "Rating": 3.9, "Reviews": 1652 },
      "Keyword": { "Id": "650c2586-7e91-496d-ae72-7b9edcaacc01", "Keyword": "salon", "Language": "en" },
      "LocationCount": 9, "RankedLocations": 7, "AverageRank": 12.4, "AverageRankTotal": 13.1, "BestRank": 3,
      "DateCreated": "/Date(1790693450760)/", "ScanCount": 3
    }
  ],
  "pagination": { "page": 1, "pageSize": 50, "total": 3, "totalPages": 1 }
}
Retrieve full details for one run

Use each record's Id to retrieve the complete result for that individual scan, including the ranking grid and available summary, competitors, ads, and AI analysis.

GET /api/v1/ScanDetails?scanId=scan-week-3
Behavior and validation
  • Results are ordered by scan creation date, newest first.
  • data is an array; pagination is a separate top-level pagination object.
  • The list item is an ApiScan summary, not the full ApiScanDetails returned by GET /api/v1/ScanDetails.
  • ScanCount is calculated for scans sharing a keyword in the current filtered query.
Code examples
curl -X POST "https://www.gmbradar.com/api/v1/Scans" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"businessId":"bfd94ce0-955d-4878-bc38-54509fd3b4e8","keywordId":"650c2586-7e91-496d-ae72-7b9edcaacc01","page":1,"pageSize":50}'
GET/api/v1/ScanDetails

31. ScanDetails

Required scope: `scans:read`

Retrieve detailed information about one classic local rank scan.

Input parameters
ParameterTypeRequirementDescription / validation
scanIdstringRequiredrequired string
Inputs as documented: scanId (required string).
Example JSON request body

No JSON request body documented for this endpoint.

Example success response
{
  "success": true,
  "data": {
    "Id": "db9abf92-7ef1-430a-b3e2-8c10beb2639c",
    "Status": "Complete",
    "DateCreated": "/Date(1791432011097)/",
    "DateCompleted": "/Date(1791432427380)/",
    "LocationCount": 9,
    "RadiusMi": 0.71,
    "RadiusKm": 1.14,
    "Business": {
      "Id": "bfd94ce0-955d-4878-bc38-54509fd3b4e8",
      "Title": "Salon de jeux de Québec",
      "Alias": "",
      "PlaceId": "ChIJyzUT_zmWuEwRU2YwT-5kC8Y",
      "Address": "847 Rue Clemenceau",
      "Lat": 46.86844,
      "Lng": -71.20911,
      "Website": "https://salonsdejeux.lotoquebec.com/fr/quebec/accueil",
      "Rating": 3.9,
      "Reviews": 1649,
      "Categories": null,
      "AdditionalCategories": []
    },
    "Keyword": {
      "Id": "650c2586-7e91-496d-ae72-7b9edcaacc01",
      "Keyword": "salon",
      "Language": "en"
    },
    "Summary": {
      "BestRank": 1,
      "AverageRank": 13.63,
      "AverageRankTotal": 14.44,
      "WorstRank": 20,
      "RankedLocations": 8,
      "UnrankedLocations": 1,
      "TotalSearchesPerformed": 9,
      "MaxDistance": null,
      "BusinessRating": 3.9,
      "BusinessReviews": 1649
    },
    "Rankings": [
      {
        "Lat": 46.875668,
        "Lng": -71.198537,
        "Rank": null,
        "SearchId": "10080900-3698-0066-0000-dd6c4614cc3f"
      },
      {
        "Lat": 46.86844,
        "Lng": -71.20911,
        "Rank": 1,
        "SearchId": "10080900-3698-0066-0000-df44e1d394ba"
      },
      {
        "Lat": 46.875668,
        "Lng": -71.20911,
        "Rank": 20,
        "SearchId": "10080900-3698-0066-0000-68d3c00ab8b2"
      },
      {
        "Lat": 46.875668,
        "Lng": -71.219683,
        "Rank": 16,
        "SearchId": "10080900-3698-0066-0000-b3a4aab94979"
      },
      {
        "Lat": 46.861212,
        "Lng": -71.198537,
        "Rank": 18,
        "SearchId": "10080900-3698-0066-0000-0745a1f434fe"
      },
      {
        "Lat": 46.861212,
        "Lng": -71.20911,
        "Rank": 10,
        "SearchId": "10080900-3698-0066-0000-de7dc5180df6"
      },
      {
        "Lat": 46.86844,
        "Lng": -71.198537,
        "Rank": 18,
        "SearchId": "10080900-3698-0066-0000-1a7d4129d2ec"
      },
      {
        "Lat": 46.861212,
        "Lng": -71.219683,
        "Rank": 16,
        "SearchId": "10080900-3698-0066-0000-27d420cba418"
      },
      {
        "Lat": 46.86844,
        "Lng": -71.219683,
        "Rank": 10,
        "SearchId": "10080900-3698-0066-0000-f28fb8aa07d2"
      }
    ],
    "Competitors": [
      {
        "Title": "Institut de Beauté Manon Simard",
        "PlaceId": "ChIJe2irXb69uEwRqzk880LX1oE",
        "Address": "3333 Rue du Carrefour Entrée no 3, Québec City, Quebec G1C 5R9",
        "Rating": 4.8,
        "Reviews": 383,
        "AverageRank": 2.75,
        "AverageRankTotal": 4,
        "PositionSum": 11,
        "PhotosCount": 35,
        "Categories": "Beauty salon",
        "AdditionalCategories": [
          "Beautician",
          "Clothing store",
          "Electrolysis hair removal service",
          "Facial spa",
          "Foot care",
          "Hair removal service",
          "Laser hair removal service",
          "Nail salon",
          "Underwear store"
        ],
        "Website": "manonsimard.com",
        "Lat": 46.86063,
        "Lng": -71.21764,
        "IsMyBusiness": false,
        "IsAd": false,
        "IsClaimed": true
      },
      {
        "Title": "Espace Beaute",
        "PlaceId": "ChIJHYEPyk28uEwRSyNr4Lu-sl4",
        "Address": "472 Rue de la Girouille, Québec, QC G1C 8J6",
        "Rating": 4.8,
        "Reviews": 30,
        "AverageRank": 3.33,
        "AverageRankTotal": 6,
        "PositionSum": 20,
        "PhotosCount": 1,
        "Categories": "Hair salon",
        "AdditionalCategories": [],
        "Website": "accesgo.com",
        "Lat": 46.87983,
        "Lng": -71.21142,
        "IsMyBusiness": false,
        "IsAd": false,
        "IsClaimed": true
      },
      {
        "Title": "Centre de Beauté KPro",
        "PlaceId": "ChIJaSxRctiXuEwRu1TWBB4lUcQ",
        "Address": "340 Rue Seigneuriale, Québec, QC G1C 3P9",
        "Rating": 4.6,
        "Reviews": 185,
        "AverageRank": 5.17,
        "AverageRankTotal": 6,
        "PositionSum": 31,
        "PhotosCount": 1880,
        "Categories": "Beauty salon",
        "AdditionalCategories": [
          "Hair salon",
          "Massage therapist"
        ],
        "Website": "beautekpro.com",
        "Lat": 46.8815,
        "Lng": -71.20232,
        "IsMyBusiness": false,
        "IsAd": false,
        "IsClaimed": true
      },
      {
        "Title": "Salon Uni-Coiffe Enr",
        "PlaceId": "ChIJ357fAL-9uEwR2np85NVH-j8",
        "Address": "3333 Rue du Carrefour, Québec, QC G1C 5R9",
        "Rating": 3.9,
        "Reviews": 135,
        "AverageRank": 6.88,
        "AverageRankTotal": 8,
        "PositionSum": 55,
        "PhotosCount": 12,
        "Categories": "Beauty salon",
        "AdditionalCategories": [
          "Hair salon"
        ],
        "Website": "accesgo.com",
        "Lat": 46.86089,
        "Lng": -71.21685,
        "IsMyBusiness": false,
        "IsAd": false,
        "IsClaimed": false
      },
      {
        "Title": "Institut & Coifferie du monde",
        "PlaceId": "ChIJfWN9ae-9uEwRbYLh81pA9XQ",
        "Address": "3435 Bd Sainte-Anne, Québec, QC G1E 3L4",
        "Rating": 4.6,
        "Reviews": 76,
        "AverageRank": 8.5,
        "AverageRankTotal": 6,
        "PositionSum": 51,
        "PhotosCount": 13,
        "Categories": "Hair salon",
        "AdditionalCategories": [
          "Massage therapist"
        ],
        "Website": "www.hotelambassadeur.ca",
        "Lat": 46.85328,
        "Lng": -71.19653,
        "IsMyBusiness": false,
        "IsAd": false,
        "IsClaimed": true
      },
      {
        "Title": "Salon Pur",
        "PlaceId": "ChIJZ7wPWxy9uEwR_wWPyvqXUiU",
        "Address": "1480 Boul. Louis-XIV, Québec, QC G2L 1M3",
        "Rating": 4.8,
        "Reviews": 81,
        "AverageRank": 9.4,
        "AverageRankTotal": 5,
        "PositionSum": 47,
        "PhotosCount": 11,
        "Categories": "Beauty salon",
        "AdditionalCategories": [
          "Hair salon"
        ],
        "Website": "www.salonpur.com",
        "Lat": 46.87913,
        "Lng": -71.24632,
        "IsMyBusiness": false,
        "IsAd": false,
        "IsClaimed": true
      },
      {
        "Title": "Coiffure Cynthia et HeadSpa",
        "PlaceId": "ChIJ4-iBdYG9uEwR0i8j17uOFC8",
        "Address": "905 Rue de Nemours, Québec, QC G1H 6Z5",
        "Rating": 4.7,
        "Reviews": 297,
        "AverageRank": 9.5,
        "AverageRankTotal": 4,
        "PositionSum": 38,
        "PhotosCount": 13,
        "Categories": "Hair salon",
        "AdditionalCategories": [],
        "Website": "www.coiffurecynthia.com",
        "Lat": 46.85174,
        "Lng": -71.23968,
        "IsMyBusiness": false,
        "IsAd": false,
        "IsClaimed": true
      },
      {
        "Title": "Coiffure et Beauté Manon Doyon",
        "PlaceId": "ChIJLduPd7K9uEwRAJsBvZ1dsP4",
        "Address": "232 Rue la Ferté, Québec, QC G1C 4H4",
        "Rating": 5,
        "Reviews": 17,
        "AverageRank": 9.86,
        "AverageRankTotal": 7,
        "PositionSum": 69,
        "PhotosCount": 158,
        "Categories": "Hair salon",
        "AdditionalCategories": [],
        "Website": "www.coiffure-manon-doyon.com",
        "Lat": 46.87466,
        "Lng": -71.21628,
        "IsMyBusiness": false,
        "IsAd": false,
        "IsClaimed": true
      },
      {
        "Title": "Beauté Actuelle Coiffure",
        "PlaceId": "ChIJHTszY0m8uEwRUZPOp6HECqA",
        "Address": "322 Rue de la Parmentière, Québec, QC G1C 8H3",
        "Rating": 4.8,
        "Reviews": 12,
        "AverageRank": 10,
        "AverageRankTotal": 6,
        "PositionSum": 60,
        "PhotosCount": 427,
        "Categories": "Beauty salon",
        "AdditionalCategories": [
          "Barber shop",
          "Hair salon",
          "Stylist",
          "Hairdresser"
        ],
        "Website": "beaute-actuelle-coiffure2.webnode.fr",
        "Lat": 46.87734,
        "Lng": -71.2132,
        "IsMyBusiness": false,
        "IsAd": false,
        "IsClaimed": true
      },
      {
        "Title": "Morini coiffure | Achats en ligne via Toncoiffeur.ca | Recommandations produits",
        "PlaceId": "ChIJUe3rdGy8uEwRVgg3-XeiVDk",
        "Address": "375 Rue Seigneuriale, Québec, QC G1C 3P7",
        "Rating": 4.4,
        "Reviews": 172,
        "AverageRank": 10.5,
        "AverageRankTotal": 6,
        "PositionSum": 63,
        "PhotosCount": 117,
        "Categories": "Hair salon",
        "AdditionalCategories": [
          "Barber shop"
        ],
        "Website": "www.morinicoiffure.ca",
        "Lat": 46.88359,
        "Lng": -71.20547,
        "IsMyBusiness": false,
        "IsAd": false,
        "IsClaimed": true
      },
      {
        "Title": "SmartStyle Hair Salon",
        "PlaceId": "ChIJdaIm0Mm9uEwRUge6HJxEf7k",
        "Address": "Located Inside Walmart, 224 Av. Joseph Casavant #3646, Québec City, Quebec G1C 7T9",
        "Rating": 4,
        "Reviews": 31,
        "AverageRank": 11,
        "AverageRankTotal": 6,
        "PositionSum": 66,
        "PhotosCount": 3,
        "Categories": "Beauty salon",
        "AdditionalCategories": [
          "Barber shop"
        ],
        "Website": "www.smartstyle.com",
        "Lat": 46.87221,
        "Lng": -71.20408,
        "IsMyBusiness": false,
        "IsAd": false,
        "IsClaimed": true
      },
      {
        "Title": "Sacrabellia (Boutique ésotérique, salon de coiffure, soins énergétique)",
        "PlaceId": "ChIJ2wushO69uEwRqsQsixUrmh4",
        "Address": "677 Ave Royale, Québec City, Quebec G1E 1Z1",
        "Rating": 4.6,
        "Reviews": 72,
        "AverageRank": 11.33,
        "AverageRankTotal": 6,
        "PositionSum": 68,
        "PhotosCount": 37,
        "Categories": "Beauty salon",
        "AdditionalCategories": [
          "Boutique",
          "Hair salon"
        ],
        "Website": "www.productionsnouvellelune.com",
        "Lat": 46.86065,
        "Lng": -71.19026,
        "IsMyBusiness": false,
        "IsAd": false,
        "IsClaimed": true
      },
      {
        "Title": "MagicsKuts Salon de Barbier",
        "PlaceId": "ChIJpwcGoIW9uEwRn57Q_t-aw00",
        "Address": "496 Rue Cambronne, Québec, QC G1E 6X1",
        "Rating": 5,
        "Reviews": 133,
        "AverageRank": 11.6,
        "AverageRankTotal": 5,
        "PositionSum": 58,
        "PhotosCount": 42,
        "Categories": "Barber shop",
        "AdditionalCategories": [],
        "Website": "www.magicskuts.ca",
        "Lat": 46.87254,
        "Lng": -71.19611,
        "IsMyBusiness": false,
        "IsAd": false,
        "IsClaimed": true
      },
      {
        "Title": "Coiffure Lisa Bernier",
        "PlaceId": "ChIJRa1GIc69uEwRoSJTe_-z77Q",
        "Address": "142 Rue Seigneuriale, Québec, QC G1E 4Y6",
        "Rating": 4.9,
        "Reviews": 26,
        "AverageRank": 12.2,
        "AverageRankTotal": 5,
        "PositionSum": 61,
        "PhotosCount": 1,
        "Categories": "Beauty salon",
        "AdditionalCategories": [],
        "Website": null,
        "Lat": 46.86746,
        "Lng": -71.1927,
        "IsMyBusiness": false,
        "IsAd": false,
        "IsClaimed": false
      },
      {
        "Title": "Salon Andre Pageau",
        "PlaceId": "ChIJ90KQh9u9uEwRLJZNWRKP5ys",
        "Address": "567 Ave Royale, Québec City, Quebec G1E 1Y4",
        "Rating": 4.9,
        "Reviews": 27,
        "AverageRank": 12.83,
        "AverageRankTotal": 6,
        "PositionSum": 77,
        "PhotosCount": 3,
        "Categories": "Beauty salon",
        "AdditionalCategories": [
          "Barber shop"
        ],
        "Website": "www.facebook.com",
        "Lat": 46.85898,
        "Lng": -71.19376,
        "IsMyBusiness": false,
        "IsAd": false,
        "IsClaimed": true
      },
      {
        "Title": "Tequila Salon Barbier",
        "PlaceId": "ChIJz9jvmUy9uEwRiNCxnNBiBpI",
        "Address": "340b Rue Seigneuriale, Québec, QC G1C 3P9",
        "Rating": 4.4,
        "Reviews": 320,
        "AverageRank": 13,
        "AverageRankTotal": 5,
        "PositionSum": 65,
        "PhotosCount": 11,
        "Categories": "Barber shop",
        "AdditionalCategories": [],
        "Website": "tequilabarbershop.ca",
        "Lat": 46.8815,
        "Lng": -71.20248,
        "IsMyBusiness": false,
        "IsAd": false,
        "IsClaimed": true
      },
      {
        "Title": "Salon de jeux de Québec",
        "PlaceId": "ChIJyzUT_zmWuEwRU2YwT-5kC8Y",
        "Address": "847 Rue Clemenceau, Québec, QC G1C 2K6",
        "Rating": 3.9,
        "Reviews": 1649,
        "AverageRank": 13.63,
        "AverageRankTotal": 8,
        "PositionSum": 109,
        "PhotosCount": 444,
        "Categories": "Casino",
        "AdditionalCategories": [
          "Bar",
          "Tourist attraction"
        ],
        "Website": "salonsdejeux.lotoquebec.com",
        "Lat": 46.86844,
        "Lng": -71.20911,
        "IsMyBusiness": true,
        "IsAd": false,
        "IsClaimed": true
      },
      {
        "Title": "Salon De Coiffure Eureka",
        "PlaceId": "ChIJXeqBVdi9uEwRUyLNezCTyi0",
        "Address": "55 Av. du Collège, Québec, QC G1E 2X7",
        "Rating": 4.8,
        "Reviews": 38,
        "AverageRank": 13.83,
        "AverageRankTotal": 6,
        "PositionSum": 83,
        "PhotosCount": 4,
        "Categories": "Beauty salon",
        "AdditionalCategories": [
          "Hair salon"
        ],
        "Website": null,
        "Lat": 46.8603,
        "Lng": -71.18623,
        "IsMyBusiness": false,
        "IsAd": false,
        "IsClaimed": true
      },
      {
        "Title": "Cass'Tête Coiffure",
        "PlaceId": "ChIJFVzs9H--uEwRp-SAfQjtI3I",
        "Address": "1094 Bd des Chutes, Québec, QC G1E 2G1",
        "Rating": 4.8,
        "Reviews": 81,
        "AverageRank": 17.2,
        "AverageRankTotal": 5,
        "PositionSum": 86,
        "PhotosCount": 6,
        "Categories": "Beauty salon",
        "AdditionalCategories": [
          "Hair salon"
        ],
        "Website": null,
        "Lat": 46.86911,
        "Lng": -71.17599,
        "IsMyBusiness": false,
        "IsAd": false,
        "IsClaimed": false
      },
      {
        "Title": "Salon Coup D'Oeil",
        "PlaceId": "ChIJNcPjSyu8uEwR9eepY-wwH48",
        "Address": "1095 Bd des Chutes, Québec, QC G1E 2G1",
        "Rating": 4.7,
        "Reviews": 23,
        "AverageRank": 17.8,
        "AverageRankTotal": 5,
        "PositionSum": 89,
        "PhotosCount": 1,
        "Categories": "Hair salon",
        "AdditionalCategories": [],
        "Website": null,
        "Lat": 46.87029,
        "Lng": -71.17558,
        "IsMyBusiness": false,
        "IsAd": false,
        "IsClaimed": true
      }
    ],
    "Ads": [
      {
        "Title": "Salon de beauté chez Sarah",
        "Rating": 4.5,
        "Reviews": 24
      }
    ],
    "AIAnalysis": null
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Running scan response

While a scan is running, DateCompleted and Summary may be null and result arrays may be empty.

{
  "success": true,
  "data": {
    "Id": "be6868d9-3088-46b6-88fa-0ce12e7110c0",
    "Status": "Running",
    "DateCreated": "/Date(1791903050760)/",
    "DateCompleted": null,
    "LocationCount": 9,
    "RadiusMi": 0.71,
    "RadiusKm": 1.14,
    "Business": {
      "Id": "bfd94ce0-955d-4878-bc38-54509fd3b4e8",
      "Title": "Salon de jeux de Québec",
      "Alias": "",
      "PlaceId": "ChIJyzUT_zmWuEwRU2YwT-5kC8Y",
      "Address": "847 Rue Clemenceau",
      "Lat": 46.86844,
      "Lng": -71.20911,
      "Website": "https://salonsdejeux.lotoquebec.com/fr/quebec/accueil",
      "Rating": 3.9,
      "Reviews": 1649,
      "Categories": null,
      "AdditionalCategories": []
    },
    "Keyword": {
      "Id": "650c2586-7e91-496d-ae72-7b9edcaacc01",
      "Keyword": "salon",
      "Language": "en"
    },
    "Summary": null,
    "Rankings": [],
    "Competitors": [],
    "Ads": [],
    "AIAnalysis": null
  }
}
Behavior and validation

Code examples
curl -X GET "https://www.gmbradar.com/api/v1/ScanDetails" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json"
GET/api/v1/ScanRankings

32. ScanRankings

Required scope: `scans:read`

Retrieve ranking data for a scan and a Google Place ID.

Input parameters
ParameterTypeRequirementDescription / validation
scanIdstringRequiredrequired string
placeIdstringRequiredrequired string
Inputs as documented: scanId (required string); placeId (required string).
Example JSON request body

No JSON request body documented for this endpoint.

Example success response
{
  "success": true,
  "data": {
    "ScanId": "db9abf92-7ef1-430a-b3e2-8c10beb2639c",
    "PlaceId": "ChIJyzUT_zmWuEwRU2YwT-5kC8Y",
    "Rankings": [
      {
        "Lat": 46.875668,
        "Lng": -71.198537,
        "Rank": 3,
        "SearchId": "search-guid-example"
      },
      {
        "Lat": 46.86844,
        "Lng": -71.20911,
        "Rank": 0,
        "SearchId": "search-guid-example-2"
      }
    ]
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

Code examples
curl -X GET "https://www.gmbradar.com/api/v1/ScanRankings" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json"
GET/api/v1/SearchResults

33. SearchResults

Required scope: `reports:read`

Retrieve the result rows for a search.

Input parameters
ParameterTypeRequirementDescription / validation
searchIdstringRequiredrequired string
Inputs as documented: searchId (required string).
Example JSON request body

No JSON request body documented for this endpoint.

Example success response
{
  "success": true,
  "data": {
    "SearchId": "search-guid-example",
    "Results": [
      {
        "Position": 1,
        "Title": "Salon de jeux de Québec",
        "PlaceId": "ChIJyzUT_zmWuEwRU2YwT-5kC8Y",
        "Address": "847 Rue Clemenceau",
        "Rating": 3.9,
        "Reviews": 1652,
        "Website": "https://salonsdejeux.lotoquebec.com/fr/quebec/accueil",
        "Phone": "+1 877-700-5836",
        "Lat": 46.86844,
        "Lng": -71.20911,
        "Categories": "Salon",
        "AdditionalCategories": [
          "Beauty salon"
        ],
        "IsAd": false,
        "IsMyBusiness": true,
        "IsClaimed": true,
        "TotalPhotos": 24
      }
    ]
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

Code examples
curl -X GET "https://www.gmbradar.com/api/v1/SearchResults" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json"
GET/api/v1/ScheduledScans

34. ScheduledScans

Required scope: `scans:read`

List classic local rank scheduled scans, optionally filtered by status.

Input parameters
ParameterTypeRequirementDescription / validation
statusstringOptional / conditionaloptional string
Inputs as documented: status (optional string).
Example JSON request body

No JSON request body documented for this endpoint.

Example success response
{
  "success": true,
  "data": [
    {
      "Id": "ffffffff-aaaa-bbbb-cccc-dddddddddddd",
      "Title": "Weekly salon scan",
      "Business": {
        "Id": "bfd94ce0-955d-4878-bc38-54509fd3b4e8",
        "Title": "Salon de jeux de Québec",
        "Alias": "",
        "PlaceId": "ChIJyzUT_zmWuEwRU2YwT-5kC8Y"
      },
      "Keyword": {
        "Id": "650c2586-7e91-496d-ae72-7b9edcaacc01",
        "Keyword": "salon",
        "Language": "en"
      },
      "Frequency": "weekly",
      "LocationCount": 9,
      "StartDateTime": "/Date(1792314000000)/",
      "NextStartDateTime": "/Date(1792314000000)/",
      "Status": "active",
      "Priority": 1
    }
  ]
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

Code examples
curl -X GET "https://www.gmbradar.com/api/v1/ScheduledScans" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json"
POST/api/v1/DeactivateScheduledScan

35. DeactivateScheduledScan

Required scope: `scans:cancel`

Disable a classic scheduled scan.

Input parameters
ParameterTypeRequirementDescription / validation
scheduleIdstringRequiredrequired string
Inputs as documented: scheduleId (required string).
Example JSON request body
{
  "scheduleId": "ffffffff-aaaa-bbbb-cccc-dddddddddddd"
}
Example success response
{
  "success": true,
  "data": {
    "scheduleId": "ffffffff-aaaa-bbbb-cccc-dddddddddddd",
    "status": "disabled"
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

An already disabled schedule returns success without updating it.

Code examples
curl -X POST "https://www.gmbradar.com/api/v1/DeactivateScheduledScan" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"scheduleId":"ffffffff-aaaa-bbbb-cccc-dddddddddddd"}'
POST/api/v1/ActivateScheduledScan

36. ActivateScheduledScan

Required scope: `scans:write`

Activate a classic scheduled scan and recalculate its next run if necessary.

Input parameters
ParameterTypeRequirementDescription / validation
scheduleIdstringRequiredrequired string
Inputs as documented: scheduleId (required string).
Example JSON request body
{
  "scheduleId": "ffffffff-aaaa-bbbb-cccc-dddddddddddd"
}
Example success response
{
  "success": true,
  "data": {
    "scheduleId": "ffffffff-aaaa-bbbb-cccc-dddddddddddd",
    "status": "active",
    "nextStartDateTime": "/Date(1792314000000)/"
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

If next run is in the past, daily/weekly/monthly frequencies are supported.

Code examples
curl -X POST "https://www.gmbradar.com/api/v1/ActivateScheduledScan" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"scheduleId":"ffffffff-aaaa-bbbb-cccc-dddddddddddd"}'
POST/api/v1/CreateScheduleScan

37. CreateScheduleScan

Required scope: `scans:write`

Schedule an existing classic scan by its scan GUID, frequency, UTC date/time, and priority.

Input parameters
ParameterTypeRequirementDescription / validation
scanIdstringRequiredrequired string
frequencystringRequiredrequired string
startDatedateRequiredrequired date in yyyy-MM-dd
startTimestringRequiredrequired string HH:mm in UTC
priorityintegerOptional / conditionalinteger, must be 1 or 2
Inputs as documented: scanId (required string); frequency (required string); startDate (required date in yyyy-MM-dd); startTime (required string HH:mm in UTC); priority (integer, must be 1 or 2).
Example JSON request body
{
  "scanId": "eeeeeeee-ffff-aaaa-bbbb-cccccccccccc",
  "frequency": "weekly",
  "startDate": "2026-10-18",
  "startTime": "09:00",
  "priority": 1
}
Example success response
{
  "success": true,
  "data": {
    "scheduleId": "ffffffff-aaaa-bbbb-cccc-dddddddddddd",
    "scanId": "db9abf92-7ef1-430a-b3e2-8c10beb2639c",
    "frequency": "weekly",
    "startDateTime": "2026-10-18T09:00:00Z",
    "nextStartDateTime": "2026-10-18T09:00:00Z",
    "priority": 1
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

Scan must belong to user, its keyword must be active, its business must belong to the user, and it must have at least one location.

Code examples
curl -X POST "https://www.gmbradar.com/api/v1/CreateScheduleScan" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"scanId":"eeeeeeee-ffff-aaaa-bbbb-cccccccccccc","frequency":"weekly","startDate":"2026-10-18","startTime":"09:00","priority":1}'
POST/api/v1/CreateScan

38. CreateScan

Required scope: `scans:write`

Create classic local rank scans for one or more keywords over a generated geo-grid.

Input parameters
ParameterTypeRequirementDescription / validation
businessIdGUIDRequiredrequired business GUID
keywordsarrayRequiredrequired array of strings
gridCenterobjectOptional / conditionaloptional object with lat/lng; defaults to business coordinates
gridShape—Optional / conditionaloptional square/circle, default square
gridSize—Requiredrequired by validation: square 3,5,7,9,11,13,15; circle 1–7
gridRadius—Requiredrequired 0.20–100 miles
zoom—Requiredrequired 3–21
priority—Requiredrequired 1 or 2
device / osstring pairRequiredRequired combination: desktop + windows/macos or mobile + android/ios. The request body sends these as separate device and os fields.
languagestringOptional / conditionaloptional string
Device and OS must be a supported pair: desktop with Windows or macOS, or mobile with Android or iOS.
Example JSON request body
{
  "businessId": "11111111-2222-3333-4444-555555555555",
  "keywords": [
    "plumber",
    "emergency plumber"
  ],
  "gridCenter": {
    "lat": 33.7215,
    "lng": 73.0433
  },
  "gridShape": "square",
  "gridSize": 5,
  "gridRadius": 2.0,
  "zoom": 14,
  "priority": 1,
  "device": "desktop",
  "os": "windows",
  "language": "en"
}
Example success response
{
  "success": true,
  "data": {
    "scanIds": [
      "db9abf92-7ef1-430a-b3e2-8c10beb2639c"
    ]
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

Keywords longer than 200 chars are rejected. Credits required = generated grid points × valid keywords × priority. Insufficient balance returns 409 with requiredCredits and remainingCredits.

Code examples
curl -X POST "https://www.gmbradar.com/api/v1/CreateScan" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"businessId":"11111111-2222-3333-4444-555555555555","keywords":["plumber","emergency plumber"],"gridCenter":{"lat":33.7215,"lng":73.0433},"gridShape":"square","gridSize":5,"gridRadius":2.0,"zoom":14,"priority":1,"device":"desktop","os":"windows","language":"en"}'
POST/api/v1/RepeatScan

39. RepeatScan

Required scope: `scans:write`

Run an existing classic local rank scan again using its existing keyword, priority and grid configuration.

Input parameters
ParameterTypeRequirementDescription / validation
scanIdstringRequiredrequired string
Inputs as documented: scanId (required string).
Example JSON request body
{
  "scanId": "eeeeeeee-ffff-aaaa-bbbb-cccccccccccc"
}
Example success response
{
  "success": true,
  "data": {
    "scanId": "db9abf92-7ef1-430a-b3e2-8c10beb2639c"
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

Scan must be owned by the authenticated user.

Code examples
curl -X POST "https://www.gmbradar.com/api/v1/RepeatScan" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"scanId":"eeeeeeee-ffff-aaaa-bbbb-cccccccccccc"}'
POST/api/v1/DeleteScan

40. DeleteScan

Required scope: `scans:write`

Delete an existing classic scan.

Input parameters
ParameterTypeRequirementDescription / validation
scanIdstringRequiredrequired string
Inputs as documented: scanId (required string).
Example JSON request body
{
  "scanId": "eeeeeeee-ffff-aaaa-bbbb-cccccccccccc"
}
Example success response
{
  "success": true
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Code examples
curl -X POST "https://www.gmbradar.com/api/v1/DeleteScan" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"scanId":"eeeeeeee-ffff-aaaa-bbbb-cccccccccccc"}'
POST/api/v1/ScheduleScan

41. ScheduleScan

Required scope: `scans:write`

Create a recurring schedule for an existing classic scan.

Input parameters
ParameterTypeRequirementDescription / validation
scanId—Requiredrequired parameter: body
frequencystringRequiredrequired string
startDate—Requiredrequired yyyy-MM-dd
startTime—Requiredrequired HH:mm UTC
priority—Requiredrequired 1 or 2
Inputs as documented: scanId (required parameter); body frequency (required string); startDate (required yyyy-MM-dd); startTime (required HH:mm UTC); priority (required 1 or 2).
Example JSON request body
{
  "frequency": "weekly",
  "startDate": "2026-10-18",
  "startTime": "09:00",
  "priority": 1
}
Example success response
{
  "success": true,
  "data": {
    "scheduleId": "ffffffff-aaaa-bbbb-cccc-dddddddddddd"
  }
}
Example error response
{
  "success": false,
  "data": null,
  "error": "invalid_request",
  "message": "A human-readable explanation.",
  "requestId": null
}
Behavior and validation

Date/time must parse exactly and be in the future in UTC.

Code examples
curl -X POST "https://www.gmbradar.com/api/v1/ScheduleScan" \
  -H "Authorization: Bearer $GMBRADAR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"frequency":"weekly","startDate":"2026-10-18","startTime":"09:00","priority":1}'