Cheers Public API

The Cheers API allows you to programmatically access your organization's review data, badges, taps, and more. All API endpoints require authentication via API key.

Base URLhttps://app.cheers.tech/api/public/v1

Authentication

All API requests require a Bearer token in the Authorization header. To obtain an API key, visit your organization settings or contact your Cheers account administrator.

Example Request
curl -X GET "https://app.cheers.tech/api/public/v1/organizations?organization_id=123" \
-H "Authorization: Bearer YOUR_API_KEY"

Rate Limits

Limits use a sliding 60-second window and are scoped by API key and endpoint. A request that passes the limiter consumes a slot even if later validation fails.

SurfaceLimitDetails
GET endpoints100 requests per 60 secondsPer API key and endpoint. Different GET endpoints have independent counters.
Single POST or DELETE /employee-links500 requests per 60 secondsShared per API key across single employee-link provisioning and termination requests.
Bulk POST or DELETE /employee-links10 batch requests per 60 secondsUp to 100 items per batch. Items are processed with bounded concurrency of 10 and return per-item results. Bulk calls also consume one slot from the shared 500-request standard bucket.
PATCH /cards500 requests per 60 secondsPer API key.

A limited request returns 429 Too Many Requests with Retry-After, X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers. Wait for Retry-After seconds, then retry the same request unchanged.

Common Parameters

Most endpoints support the following query parameters for filtering, pagination, and date-based queries.

ParameterTypeRequiredDescription
organization_idinteger
Optional
Filter by specific organization ID
parent_organization_idinteger
Optional
Get data for all child organizations
fromISO 8601 datetime
Optional
Filter records updated after this time
toISO 8601 datetime
Optional
Filter records updated before this time
created_fromISO 8601 datetime
Optional
Filter records created after this time
created_toISO 8601 datetime
Optional
Filter records created before this time
limitinteger
Optional
Maximum records to return (default: 100; max 1000 with offset pagination, max 999 on cursor/checkpoint exports)
offsetinteger
Optional
Number of records to skip for pagination

Note: Either organization_id or parent_organization_id is required for all endpoints.

Endpoints

GET/organizations

Retrieve organization details.

Query Parameters

ParameterTypeRequiredDescription
organization_idinteger
Optional
Specific organization ID (one of organization_id or parent_organization_id required)
parent_organization_idinteger
Optional
Get all child organizations (one of organization_id or parent_organization_id required)
citystring
Optional
Exact city match, case-insensitive
statestring
Optional
Exact state name or code match, case-insensitive
is_activeboolean
Optional
Filter active or inactive locations

Response Fields

FieldTypeDescription
idintegerOrganization ID
namestringOrganization name
created_atdatetimeWhen the organization was created
updated_atdatetimeLast update timestamp
billing_statusstringBilling status (NOT PAID, PAID, EXEMPT)
plan_tierstringProduct tier (STARTER, GROWTH, PRO, ENTERPRISE)
subscription_tierstringLegacy billing mirror; use billing_status going forward
parent_organization_idintegerParent organization ID (null if root)
citystringLocation city
statestringLocation state or region
latitudenumberLocation latitude
longitudenumberLocation longitude
timezonestringIANA timezone
is_activebooleanWhether the location is active
Request
curl -X GET "https://app.cheers.tech/api/public/v1/organizations?organization_id=123" \
-H "Authorization: Bearer YOUR_API_KEY"
Response
[
{
"id": 123,
"name": "Acme Restaurant",
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-06-20T14:45:00Z",
"billing_status": "PAID",
"plan_tier": "GROWTH",
"subscription_tier": "PAID",
"parent_organization_id": null
}
]
GET/organization-connections

Retrieve platform connections for organizations (Google, Yelp, Facebook, etc.).

Query Parameters

ParameterTypeRequiredDescription
organization_idinteger
Optional
Specific organization ID (one of organization_id or parent_organization_id required)
parent_organization_idinteger
Optional
Get connections for all child organizations (one of organization_id or parent_organization_id required)

Response Fields

FieldTypeDescription
organization_idintegerOrganization ID
google_place_idstringGoogle Places ID
google_account_idstringGoogle Business Profile account ID
google_location_idstringGoogle Business Profile location ID
yelp_business_idstringYelp business ID
tripadvisor_location_idstringTripadvisor location ID
facebook_page_idstringFacebook page ID
facebook_urlstringFacebook page URL
trustpilot_company_websitestringTrustpilot company identifier
bbb_profile_urlstringBetter Business Bureau profile URL
created_atdatetimeWhen the connection was created
Request
curl -X GET "https://app.cheers.tech/api/public/v1/organization-connections?organization_id=123" \
-H "Authorization: Bearer YOUR_API_KEY"
Response
[
{
"organization_id": 123,
"google_place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
"google_account_id": "accounts/123456789",
"google_location_id": "locations/987654321",
"yelp_business_id": "acme-restaurant-new-york",
"tripadvisor_location_id": null,
"facebook_page_id": "123456789012345",
"facebook_url": "https://facebook.com/acmerestaurant",
"trustpilot_company_website": null,
"bbb_profile_url": null,
"created_at": "2024-01-15T10:30:00Z"
}
]
GET/cards

Retrieve badge/card information for your organization.

Query Parameters

ParameterTypeRequiredDescription
organization_idinteger
Optional
Specific organization ID (one of organization_id or parent_organization_id required)
parent_organization_idinteger
Optional
Get cards for all child organizations (one of organization_id or parent_organization_id required)

Response Fields

FieldTypeDescription
idstring (UUID)Unique card identifier
created_atdatetimeWhen the card was created
updated_atdatetimeLast update timestamp
cardholder_namestringName of the badge holder
employee_idstring (UUID)Employee represented by the card
organization_idintegerOrganization ID
titlestringBadge holder's title/position
photo_urlstringURL to badge holder's photo
encode_urlstringEncoded URL for the badge
linktree_enabledbooleanWhether linktree is enabled for this card
direct_link_idintegerExplicit direct review destination, when configured
badge_numberstringCustom badge identifier
Request
curl -X GET "https://app.cheers.tech/api/public/v1/cards?organization_id=123" \
-H "Authorization: Bearer YOUR_API_KEY"
Response
[
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"created_at": "2024-03-01T09:00:00Z",
"updated_at": "2024-03-15T14:30:00Z",
"cardholder_name": "John Smith",
"organization_id": 123,
"title": "Server",
"photo_url": "https://storage.cheers.tech/photos/john-smith.jpg",
"encode_url": "https://app.cheers.tech/t/abc123",
"linktree_enabled": true,
"badge_number": "EMP-001"
}
]
PATCH/cards

Update a card's organization assignment.

Request Body

ParameterTypeRequiredDescription
cardIdstring (body)
Optional
Card UUID to update (one of cardId or badge_number required)
badge_numberstring (body)
Optional
Badge number for bulk update (one of cardId or badge_number required)
organization_idinteger (body)
Required
Target organization ID
Request
curl -X PATCH "https://app.cheers.tech/api/public/v1/cards" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"cardId": "550e8400-e29b-41d4-a716-446655440000", "organization_id": 456}'
Response
{
"success": true
}
GET/taps

Retrieve tap events (when a customer taps a badge). Agent-scoped taps are attributed to the resolved destination organization.

Query Parameters

ParameterTypeRequiredDescription
organization_idinteger
Optional
Specific organization ID (one of organization_id or parent_organization_id required)
parent_organization_idinteger
Optional
Get taps for all child organizations (one of organization_id or parent_organization_id required)

Response Fields

FieldTypeDescription
idintegerTap ID
created_atdatetimeWhen the tap occurred
updated_atdatetimeLast update timestamp
card_idstring (UUID)Associated card ID
organization_idintegerOrganization attributed to the tap. For an agent-scoped card, this is the validated destination organization; otherwise it is the card organization.
sourcestringRecorded source of the visit
usedbooleanWhether the tap resulted in a completed action
Request
curl -X GET "https://app.cheers.tech/api/public/v1/taps?organization_id=123&from=2024-01-01T00:00:00Z" \
-H "Authorization: Bearer YOUR_API_KEY"
Response
[
{
"id": 12345,
"created_at": "2024-06-15T18:30:00Z",
"updated_at": "2024-06-15T18:30:00Z",
"card_id": "550e8400-e29b-41d4-a716-446655440000",
"organization_id": 123,
"source": "badge",
"used": true
}
]
GET/reviews

Retrieve customer reviews from all connected platforms. Agent attribution is retained when Cheers can match the review to a recorded journey.

Query Parameters

ParameterTypeRequiredDescription
organization_idinteger
Optional
Specific organization ID (one of organization_id or parent_organization_id required)
parent_organization_idinteger
Optional
Get reviews for all child organizations (one of organization_id or parent_organization_id required)
formatstring
Optional
Use "v2" or "new" for full response fields

Response Fields

FieldTypeDescription
idintegerReview ID
created_atdatetimeWhen the review was received
updated_atdatetimeLast update timestamp
ratingintegerRating value (1-5)
card_idstringAssociated card ID (if attributed)
review_textstringFull review text
organization_idintegerOrganization ID
sourcestringPlatform source (GOOGLE, YELP, FACEBOOK, etc.)
reviewer_namestringReviewer's display name
reviewer_photo_urlstringReviewer's profile photo
owner_responsestringBusiness owner's response
response_timestampdatetimeWhen the response was posted
review_urlstringDirect link to the review
internalbooleanWhether this is an internal Cheers review
not_showingbooleanWhether the review is retained in API history but no longer showing on the source platform
not_showing_atdatetimeWhen Cheers detected the review was no longer showing on the source platform; null when not_showing is false
Request
curl -X GET "https://app.cheers.tech/api/public/v1/reviews?organization_id=123&format=v2" \
-H "Authorization: Bearer YOUR_API_KEY"
Response
[
{
"id": 5678,
"created_at": "2024-06-10T12:00:00Z",
"updated_at": "2024-06-10T12:00:00Z",
"rating": 5,
"card_id": "550e8400-e29b-41d4-a716-446655440000",
"review_text": "Amazing service! John was incredibly helpful.",
"organization_id": 123,
"source": "GOOGLE",
"reviewer_name": "Jane D.",
"reviewer_photo_url": "https://lh3.googleusercontent.com/...",
"owner_response": "Thank you for the kind words!",
"response_timestamp": "2024-06-11T09:00:00Z",
"review_url": "https://search.google.com/local/reviews?...",
"internal": false,
"not_showing": false,
"not_showing_at": null
}
]
GET/gbp-performance

Retrieve daily Google Business Profile Search, Maps, and customer-action metrics by location.

Query Parameters

ParameterTypeRequiredDescription
organization_idinteger
Optional
Specific location (one of organization_id or parent_organization_id required)
parent_organization_idinteger
Optional
Root organization and all permitted descendants
fromISO date or datetime
Optional
First calendar date; defaults to the previous 30 complete UTC dates
toISO date or datetime
Optional
Last calendar date
limitinteger
Optional
Maximum rows, up to 500
offsetinteger
Optional
Rows to skip

Response Fields

FieldTypeDescription
organization_idintegerCheers location organization ID
datedateMetric calendar date
data_statuscomplete | unavailableWhether an observation exists for the connected location/day
search_viewsinteger | nullCombined desktop and mobile Search impressions
maps_viewsinteger | nullCombined desktop and mobile Maps impressions
website_clicksinteger | nullWebsite actions
phone_callsinteger | nullCall actions
direction_requestsinteger | nullDirection actions
total_actionsinteger | nullWebsite clicks + phone calls + direction requests
bookingsinteger | nullBookings, reported separately from total_actions
last_updated_atdatetime | nullFreshness timestamp for the observation
Request
curl -X GET "https://app.cheers.tech/api/public/v1/gbp-performance?parent_organization_id=123&from=2026-08-01&to=2026-08-07&limit=500" \
-H "Authorization: Bearer YOUR_API_KEY"
Response
[
{
"organization_id": 456,
"date": "2026-08-01",
"data_status": "complete",
"search_views": 320,
"maps_views": 184,
"website_clicks": 12,
"phone_calls": 8,
"direction_requests": 5,
"total_actions": 25,
"bookings": 2,
"last_updated_at": "2026-08-02T12:00:00.000Z"
}
]
GET/search-performance

Retrieve daily Google Search Console, Google Analytics, referral, and Cheers Search Visibility metrics by location.

Query Parameters

ParameterTypeRequiredDescription
organization_idinteger
Optional
Specific non-ADMIN location (exactly one scope selector is required)
parent_organization_idinteger
Optional
Root organization and all permitted non-ADMIN descendants
fromISO date or datetime
Optional
First calendar date; defaults to the previous 30 complete UTC dates
toISO date or datetime
Optional
Last calendar date
limitinteger
Optional
Maximum location/day rows, up to 500
offsetinteger
Optional
Rows to skip

Response Fields

FieldTypeDescription
organization_idintegerCheers location organization ID
datedateMetric calendar date
data_statuscomplete | partial | unavailableCombined source availability for the location/day
search_impressions, search_clicksinteger | nullAuthoritative Search Console property totals
search_ctrnumber | nullSearch click-through rate as a 0–1 ratio
average_search_positionnumber | nullAverage Search Console position
sessions and channel fieldsinteger | nullGA4 total, organic, direct, referral, social, and paid sessions
search_visibility_scorenumber | nullStored Cheers Search Visibility score
source status/freshnessstring | datetime | nullPer-source maintained ingest receipts, fetch status, and freshness metadata
Request
curl -X GET "https://app.cheers.tech/api/public/v1/search-performance?parent_organization_id=123&from=2026-08-01&to=2026-08-07&limit=500" \
-H "Authorization: Bearer YOUR_API_KEY"
Response
[
{
"organization_id": 456,
"date": "2026-08-01",
"data_status": "complete",
"search_impressions": 950,
"search_clicks": 74,
"search_ctr": 0.0779,
"average_search_position": 6.4,
"sessions": 410,
"organic_sessions": 220,
"referral_sessions": 31,
"search_visibility_score": 72,
"last_updated_at": "2026-08-04T12:00:00.000Z"
}
]
GET/search-keywords

Retrieve daily Google Search Console query metrics by location.

Query Parameters

ParameterTypeRequiredDescription
organization_idinteger
Optional
Specific non-ADMIN location (exactly one scope selector is required)
parent_organization_idinteger
Optional
Root organization and all permitted non-ADMIN descendants
fromISO date or datetime
Optional
First calendar date; maximum 31-day window
toISO date or datetime
Optional
Last calendar date
limitinteger
Optional
Maximum rows, up to 500
offsetinteger
Optional
Rows to skip

Response Fields

FieldTypeDescription
organization_idintegerCheers location organization ID
datedateMetric calendar date
querystringGoogle Search query
impressions, clicksintegerDaily query impressions and clicks
search_ctrnumber | nullDaily query click-through rate as a 0–1 ratio
average_search_positionnumber | nullDaily query average position
coveragestringExplicit bounded-retention contract
last_updated_atdatetimeFreshness timestamp
Request
curl -X GET "https://app.cheers.tech/api/public/v1/search-keywords?parent_organization_id=123&from=2026-08-01&to=2026-08-07&limit=500" \
-H "Authorization: Bearer YOUR_API_KEY"
Response
[
{
"organization_id": 456,
"date": "2026-08-01",
"query": "best electricity provider",
"impressions": 85,
"clicks": 7,
"search_ctr": 0.0824,
"average_search_position": 5.2,
"coverage": "daily_top_500_queries_by_impressions_per_location"
}
]
GET/website-optimization-scores

Retrieve Website Optimization audit state and versioned site scores.

Query Parameters

ParameterTypeRequiredDescription
organization_idinteger
Optional
Specific organization in the API key hierarchy
parent_organization_idinteger
Optional
Root organization and all permitted descendants
fromISO date or datetime
Optional
First audit week_start date
toISO date or datetime
Optional
Last audit week_start date
limitinteger
Optional
Maximum rows, up to 500
offsetinteger
Optional
Rows to skip

Response Fields

FieldTypeDescription
audit_run_idUUIDStable audit run identifier
organization_idintegerCheers organization ID
week_startdateAudit week
data_statuscomplete | unavailableWhether comparable site scores exist
availability_reasonstring | nullTyped unavailable reason
audit_status, audit_phasestringAudit lifecycle state
score fieldsnumber | nullOverall, schema, AI readiness, content, performance, and crawlability scores
score_model_versioninteger | nullScore formula version required for comparison
Request
curl -X GET "https://app.cheers.tech/api/public/v1/website-optimization-scores?parent_organization_id=123&from=2026-07-01&to=2026-08-31" \
-H "Authorization: Bearer YOUR_API_KEY"
Response
[
{
"audit_run_id": "550e8400-e29b-41d4-a716-446655440000",
"organization_id": 456,
"week_start": "2026-08-17",
"data_status": "complete",
"overall_score": 82,
"schema_score": 70,
"ai_readiness_score": 88,
"content_score": 80,
"performance_score": 76,
"crawlability_score": 91,
"score_model_version": 15
}
]
GET/map-pack-rankings

Retrieve every grid-point rank observation from completed Google Local Finder runs.

Query Parameters

ParameterTypeRequiredDescription
organization_idinteger
Required
One non-ADMIN location in the API key hierarchy
fromISO date or datetime
Optional
First UTC capture date; maximum 31-day window
toISO date or datetime
Optional
Last UTC capture date
limitinteger
Optional
Maximum grid rows, up to 999
cursorstring
Optional
Opaque X-Next-Cursor value from the previous page

Response Fields

FieldTypeDescription
organization_idintegerCheers location organization ID
tracked_keyword_id, keywordUUID | stringTracked search term identity
run_idUUIDGroup key for one completed grid run
grid_generationintegerVersioned grid identity
grid_row, grid_colintegerZero-based grid placement
latitude, longitudenumberExact query point coordinates
run_data_statuscomplete | partial | unknownRun-level grid completeness
grid-point countsinteger | nullExpected, succeeded, and failed point counts
business_rankinteger | nullNumerical rank within the observed results
rank_statusranked | not_rankedExplicit null-rank meaning
Request
curl -X GET "https://app.cheers.tech/api/public/v1/map-pack-rankings?organization_id=456&from=2026-08-01&to=2026-08-07&limit=500" \
-H "Authorization: Bearer YOUR_API_KEY"
Response
[
{
"organization_id": 456,
"keyword": "electric company",
"run_id": "0787d09e-89a3-4dab-ac2a-cb7927d30aa2",
"grid_generation": 3,
"grid_row": 0,
"grid_col": 0,
"latitude": 29.7604,
"longitude": -95.3698,
"business_rank": 7,
"rank_status": "ranked",
"run_data_status": "complete",
"grid_points_expected": 25,
"grid_points_succeeded": 25,
"grid_points_failed": 0
}
]
GET/ai-visibility

Retrieve daily brand appearance, rank, and citation metrics by location, prompt, and AI platform.

Query Parameters

ParameterTypeRequiredDescription
organization_idinteger
Optional
Specific location (one of organization_id or parent_organization_id required)
parent_organization_idinteger
Optional
Root organization and all permitted descendants
fromISO date or datetime
Optional
First calendar date
toISO date or datetime
Optional
Last calendar date
limitinteger
Optional
Maximum rows, up to 1000
cursorstring
Optional
Opaque X-Next-Cursor value from the previous page

Response Fields

FieldTypeDescription
brand_idinteger | nullCheers organization ID for the tracked brand
brand_namestring | nullTracked brand name
location_idintegerCheers location organization ID
location_namestring | nullLocation name
datedateMetric calendar date
ai_prompt_idstringTracked prompt ID
ai_promptstring | nullTracked prompt text
ai_platform_idstringAI platform/provider identifier
ai_platformstring | nullAI platform/provider name
data_statuscomplete | partial | unavailableCoverage status based on valid observations
runsintegerValid observations included in the row
minimum_complete_runsintegerQuality threshold for complete status; not the prompt schedule
appearancesinteger | nullObserved appearances; null when no valid observations exist
appearance_rate_pctnumber | nullAppearance rate reported as a percentage
avg_rank_when_presentnumber | nullAverage rank when the provider supplies a dependable rank
citationsinteger | nullObserved citations; null when no valid observations exist
citation_rate_pctnumber | nullCitation rate reported as a percentage
last_updated_atdatetimeFreshness timestamp
Request
curl -X GET "https://app.cheers.tech/api/public/v1/ai-visibility?parent_organization_id=123&from=2026-08-01&to=2026-08-07&limit=1000" \
-H "Authorization: Bearer YOUR_API_KEY"
Response
[
{
"brand_id": 123,
"brand_name": "Example Energy",
"location_id": 456,
"location_name": "Houston",
"date": "2026-08-01",
"ai_prompt_id": "9018cc4f-5170-42b3-9bfd-493d91bf2f81",
"ai_prompt": "best electricity provider in Houston",
"ai_platform_id": "chatgpt",
"ai_platform": "ChatGPT",
"data_status": "complete",
"runs": 20,
"minimum_complete_runs": 4,
"appearances": 12,
"appearance_rate_pct": 60,
"avg_rank_when_present": null,
"citations": 7,
"citation_rate_pct": 35,
"last_updated_at": "2026-08-02T12:00:00.000Z"
}
]

Error Handling

All endpoints return consistent error responses with appropriate HTTP status codes.

Status CodeDescription
207Multi-Status - Batch completed with one or more failed items
400Bad Request - Missing or invalid parameters
401Unauthorized - Invalid or missing API key
403Forbidden - No access to requested resource
404Not Found - Resource does not exist
429Too Many Requests - Rate limit exceeded
500Internal Server Error
503Service Unavailable - Rate limiter or another required service is unavailable
Error Response Format
{
"error": "Error message describing the issue"
}

Pagination

For taps and reviews, omit offset to use immutable cursor pagination. Follow the X-Next-Cursor header until X-Has-More is false, then save the final X-Checkpoint for the next incremental run.

Pagination Example
# Start an immutable export (1-999 rows per page)
GET /reviews?parent_organization_id=123&format=v2&limit=500
# Continue the same session; send no other query parameters
GET /reviews?cursor=VALUE_FROM_X_NEXT_CURSOR
# Start the next incremental run after the prior final page commits
GET /reviews?checkpoint=VALUE_FROM_X_CHECKPOINT

Cursor sessions expire after six hours; metadata-only checkpoints expire after seven days. Upsert by record ID and only advance a checkpoint after every page succeeds. Explicit offset is legacy compatibility mode.

Filtering by Date

Use ISO 8601 format for date filtering:

Date Filtering Examples
# Reviews updated in the last 7 days
GET /reviews?organization_id=123&from=2024-06-08T00:00:00Z
# Reviews created in January 2024
GET /reviews?organization_id=123&created_from=2024-01-01T00:00:00Z&created_to=2024-01-31T23:59:59Z

Need Help?

For API support, contact us at info@cheers.tech