API reference
A REST API over the same data the dashboard uses: reviews, grid scans, AI visibility probes and profile signals. JSON in, JSON out.
Base URL
https://api.enterrank.io/v1Rate limit
600 req / min
Format
JSON · UTF-8
Demo workspaces
This deployment carries five sample businesses instead of one, each with its own reviews, keywords, probes and profile signals. In production the workspace is determined by your API key; here you select it with a business query parameter. Omit it and you get the default workspace.
| salon | Studio Lucia | Hair salon · Zagreb | loc_8f21c |
| market | Market Klas | Grocery shop · Zagreb | loc_3d92a |
| autoparts | Auto Dijelovi Delta | Car parts · Rijeka | loc_6b41f |
| restaurant | Konoba Fjaka | Restaurant · Split | loc_9c78d |
| gym | Fit Centar Puls | Gym · Zagreb | loc_2a55e |
curl "https://api.enterrank.io/v1/overview?business=restaurant" \ -H "X-API-Key: erk_live_your_key_here"
Review ids are unique across workspaces, so /reviews/{id} and its reply endpoint resolve without the parameter. An unrecognised business value returns 422 rather than falling back to the default.
Authentication
Server-to-server calls use an API key. Keys are created in Settings, shown once, and scoped to a single workspace.
X-API-Key: erk_live_your_key_here
Browser sessions
Authorization: Bearer <session_token>
Pagination
List endpoints return a paginated envelope. Pass page and per_page; per_page is capped at 100.
GET https://api.enterrank.io/v1/reviews?page=2&per_page=25
{
"data": [ ... ],
"meta": {
"current_page": 2,
"per_page": 25,
"total": 218,
"last_page": 9
}
}Errors
| 400 | bad_request | Malformed query string. |
| 401 | unauthenticated | Missing or invalid API key. |
| 403 | forbidden | Key is not scoped to this location. |
| 404 | not_found | No resource matches that identifier. |
| 422 | unprocessable | Validation failed; see error.fields. |
| 429 | rate_limited | Retry after the seconds given in Retry-After. |
{
"error": {
"code": "unprocessable",
"message": "No tracked keyword with id kw_99.",
"fields": {
"keyword_id": ["Must be one of: kw_01, kw_02, kw_03, kw_04, kw_05, kw_06"]
}
}
}Reviews
/reviewsLists reviews, newest first.
Query parameters
| business | string | Demo only. salon · market · autoparts · restaurant · gym. Defaults to salon |
| status | string | needs_reply · drafted · answered · ignored |
| sentiment | string | positive · neutral · negative |
| rating | integer | 1–5 |
| page | integer | Default 1 |
| per_page | integer | Default 25, max 100 |
Example request
curl "https://api.enterrank.io/v1/reviews?status=needs_reply&per_page=2" \ -H "X-API-Key: erk_live_your_key_here"
Example response
{
"data": [
{
"id": "rev_2f9a1",
"author": "Marina Kovač",
"rating": 2,
"createdAt": "2026-07-27T16:52:00Z",
"status": "needs_reply",
"sentiment": "negative",
"sentimentConfidence": 0.94,
"intent": "wait_time",
"topics": ["waiting time", "colour service", "pricing"]
}
],
"meta": { "current_page": 1, "per_page": 2, "total": 4, "last_page": 2 }
}/reviews/{id}Returns a single review with its reply, if one exists.
Example request
curl "https://api.enterrank.io/v1/reviews/rev_2f9a1" \ -H "X-API-Key: erk_live_your_key_here"
Example response
{ "data": { "id": "rev_2f9a1", "author": "Marina Kovač", ... } }/reviews/{id}/replyGenerates a reply draft in the workspace brand voice, optimised for the location's target keywords. Nothing is published.
Example request
curl -X POST "https://api.enterrank.io/v1/reviews/rev_2f9a1/reply" \ -H "X-API-Key: erk_live_your_key_here"
Example response
{
"data": {
"review_id": "rev_2f9a1",
"business": "salon",
"text": { "en": "Marina, you are right and we are sorry...", "hr": "..." },
"keywords": ["Ilica hair salon", "colour appointment"],
"seo_score": 87,
"stages": [
{ "id": "analyze", "duration_ms": 900 },
{ "id": "voice", "duration_ms": 700 },
{ "id": "keywords", "duration_ms": 800 },
{ "id": "compose", "duration_ms": 600 }
],
"generated_at": "2026-07-28T07:00:00Z"
}
}/reviews/{id}/replyPublishes an approved reply to Google.
Example request
curl -X PUT "https://api.enterrank.io/v1/reviews/rev_2f9a1/reply" \
-H "X-API-Key: erk_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{"text": "Marina, you are right and we are sorry..."}'Example response
{
"accepted": true,
"applied": false,
"message": "Publishing a reply to review rev_2f9a1 was accepted but not persisted — this deployment runs in demo mode."
}Rankings
/keywordsLists tracked search terms.
Query parameters
| business | string | Demo only. salon · market · autoparts · restaurant · gym. Defaults to salon |
Example request
curl "https://api.enterrank.io/v1/keywords" \ -H "X-API-Key: erk_live_your_key_here"
Example response
{
"data": [
{ "id": "kw_02", "term": { "en": "balayage zagreb" }, "volume": 1300, "avgRank": 2.4, "delta": -0.8 }
],
"meta": { "current_page": 1, "per_page": 25, "total": 6, "last_page": 1 }
}/scansRuns a geo-grid scan for one keyword and returns every sampled point. rank is null where the business does not appear.
Query parameters
| business | string | Demo only. salon · market · autoparts · restaurant · gym. Defaults to salon |
| keyword_id | string | Required in practice; defaults to the first tracked term |
| size | integer | Odd number 5–13. Grid is size × size |
| spacing_meters | integer | 100–5000 |
Example request
curl "https://api.enterrank.io/v1/scans?keyword_id=kw_02&size=7&spacing_meters=500" \ -H "X-API-Key: erk_live_your_key_here"
Example response
{
"data": {
"id": "scan_kw_02",
"keywordId": "kw_02",
"size": 7,
"spacingMeters": 500,
"ranAt": "2026-07-28T06:00:00Z",
"points": [
{ "row": 0, "col": 0, "offsetX": -1500, "offsetY": -1500, "rank": 4, "topCompetitor": "Salon Adriana" }
],
"avgRank": 2.4,
"atrs": 97.6,
"solv": 95.9
},
"history": [ { "date": "2026-07-28", "atrs": 41.7 } ]
}AI visibility
/ai-visibilityReturns tracked prompts with each assistant's verdict, the competitors named instead, and the sources cited.
Query parameters
| business | string | Demo only. salon · market · autoparts · restaurant · gym. Defaults to salon |
| engine | string | chatgpt · gemini · perplexity · ai_overviews |
Example request
curl "https://api.enterrank.io/v1/ai-visibility?engine=chatgpt" \ -H "X-API-Key: erk_live_your_key_here"
Example response
{
"data": [
{
"id": "probe_01",
"prompt": { "en": "best hair salon in central Zagreb" },
"visibilityScore": 62,
"delta": 14,
"results": [
{
"engine": "chatgpt",
"mentioned": true,
"position": 2,
"competitorsNamed": ["Salon Adriana", "Hair Lab Zagreb"],
"citedSources": ["google.com/maps", "studiolucia.hr", "tripadvisor.com"],
"checkedAt": "2026-07-28T05:00:00Z"
}
]
}
],
"meta": { "current_page": 1, "per_page": 25, "total": 4, "last_page": 1 }
}Presence
/presence/profile-scoreReturns the weighted profile completeness score and the individual checks behind it.
Query parameters
| business | string | Demo only. salon · market · autoparts · restaurant · gym. Defaults to salon |
Example request
curl "https://api.enterrank.io/v1/presence/profile-score" \ -H "X-API-Key: erk_live_your_key_here"
Example response
{
"data": {
"location_id": "loc_8f21c",
"score": 61,
"checks": [
{ "id": "chk_03", "weight": 14, "passed": false,
"label": { "en": "All services listed with prices" } }
]
}
}/presence/postsLists profile posts.
Query parameters
| business | string | Demo only. salon · market · autoparts · restaurant · gym. Defaults to salon |
| status | string | draft · scheduled · published |
Example request
curl "https://api.enterrank.io/v1/presence/posts?status=published" \ -H "X-API-Key: erk_live_your_key_here"
Example response
{
"data": [
{ "id": "post_03", "status": "published", "cta": "learn_more",
"publishedAt": "2026-07-22T08:00:00Z", "metrics": { "views": 1284, "clicks": 96 } }
],
"meta": { "current_page": 1, "per_page": 25, "total": 3, "last_page": 1 }
}/presence/questionsLists profile questions.
Query parameters
| business | string | Demo only. salon · market · autoparts · restaurant · gym. Defaults to salon |
| unanswered | boolean | true returns only unanswered questions |
Example request
curl "https://api.enterrank.io/v1/presence/questions?unanswered=true" \ -H "X-API-Key: erk_live_your_key_here"
Example response
{
"data": [
{ "id": "qst_01", "author": "Marta B.", "views": 340,
"question": { "en": "Do you do keratin treatments and how much do they cost?" } }
],
"meta": { "current_page": 1, "per_page": 25, "total": 4, "last_page": 1 }
}Workspace
/overviewReturns the dashboard metrics, including weekly series.
Query parameters
| business | string | Demo only. salon · market · autoparts · restaurant · gym. Defaults to salon |
Example request
curl "https://api.enterrank.io/v1/overview" \ -H "X-API-Key: erk_live_your_key_here"
Example response
{
"data": {
"reviewsAwaitingReply": 4,
"medianResponseHours": 9,
"rating": 4.6,
"avgRank": 4.2,
"aiVisibilityScore": 47,
"profileScore": 61
}
}/locationsLists every location the key can see. In demo mode that is all five sample workspaces, each carrying the value to pass as business elsewhere.
Example request
curl "https://api.enterrank.io/v1/locations" \ -H "X-API-Key: erk_live_your_key_here"
Example response
{
"data": [
{ "id": "loc_8f21c", "demo_business": "salon", "name": "Studio Lucia", "city": "Zagreb",
"gbpLocationId": "locations/4192837465102938471", "rating": 4.6, "reviewCount": 218 },
{ "id": "loc_9c78d", "demo_business": "restaurant", "name": "Konoba Fjaka", "city": "Split",
"gbpLocationId": "locations/8271039485762013948", "rating": 4.7, "reviewCount": 512 }
],
"meta": { "current_page": 1, "per_page": 25, "total": 5, "last_page": 1 }
}/competitorsLists the tracked local competitor set.
Query parameters
| business | string | Demo only. salon · market · autoparts · restaurant · gym. Defaults to salon |
Example request
curl "https://api.enterrank.io/v1/competitors" \ -H "X-API-Key: erk_live_your_key_here"
Example response
{
"data": [
{ "id": "cmp_01", "name": "Salon Adriana", "rating": 4.8, "reviewCount": 412,
"avgRank": 1.9, "aiVisibility": 71, "distanceMeters": 380 }
],
"meta": { "current_page": 1, "per_page": 25, "total": 5, "last_page": 1 }
}/contactSubmits a quote enquiry. Pricing is scoped per workspace rather than published, so this is how a quote is requested.
Example request
curl -X POST "https://api.enterrank.io/v1/contact" \
-H "Content-Type: application/json" \
-d '{
"name": "Lucia Marić",
"email": "lucia@studiolucia.hr",
"business": "Studio Lucia",
"city": "Zagreb",
"locations": "1"
}'Example response
{
"accepted": true,
"applied": false,
"message": "Your enquiry was accepted but not persisted — this deployment runs in demo mode."
}Webhooks
Events are delivered as POST requests signed with HMAC-SHA256 in the X-EnterRank-Signature header. Respond 2xx within 5 seconds; failures retry with exponential backoff for 24 hours.
POST https://your-server.example/hooks/enterrank
X-EnterRank-Signature: sha256=...
Content-Type: application/json
{
"event": "review.created",
"created_at": "2026-07-27T16:52:04Z",
"data": {
"review_id": "rev_2f9a1",
"location_id": "loc_8f21c",
"rating": 2,
"sentiment": "negative",
"intent": "wait_time"
}
}