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.
https://app.cheers.tech/api/public/v1Authentication
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.
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.
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.
Note: Either organization_id or parent_organization_id is required for all endpoints.
Endpoints
/organizationsRetrieve organization details.
Query Parameters
Response Fields
curl -X GET "https://app.cheers.tech/api/public/v1/organizations?organization_id=123" \-H "Authorization: Bearer YOUR_API_KEY"
[{"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}]
/location-linksMap each scoped business location to its configured Cheers survey URL and Trustpilot destination.
Query Parameters
Response Fields
A missing status reflects real configuration state; the API never fabricates a destination.
Every usable configured card and Trustpilot review destination is returned; oversized responses fail with 413 instead of being silently truncated.
The database derives and verifies the exact organization hierarchy for every request.
curl -X GET "https://app.cheers.tech/api/public/v1/location-links?parent_organization_id=123&state=TX" \-H "Authorization: Bearer YOUR_API_KEY"
[{"organization_id": 1300,"name": "Houston","city": "Houston","state": "TX","cheers_survey_urls": [{ "card_id": "550e8400-e29b-41d4-a716-446655440000", "url": "https://app.cheers.tech/api/v1/tap?card-id=550e8400-e29b-41d4-a716-446655440000&source=survey" }],"trustpilot_destinations": [{ "link_id": 101, "name": "Trustpilot", "url": "https://www.trustpilot.com/evaluate/example.com" }],"mapping_status": "ready"}]
/organization-connectionsRetrieve platform connections for organizations (Google, Yelp, Facebook, etc.).
Query Parameters
Response Fields
curl -X GET "https://app.cheers.tech/api/public/v1/organization-connections?organization_id=123" \-H "Authorization: Bearer YOUR_API_KEY"
[{"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"}]
/cardsRetrieve badge/card information for your organization.
Query Parameters
Response Fields
curl -X GET "https://app.cheers.tech/api/public/v1/cards?organization_id=123" \-H "Authorization: Bearer YOUR_API_KEY"
[{"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"}]
/cardsUpdate a card's organization assignment.
Request Body
Either cardId or badge_number is required in the request body.
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}'
{"success": true}
/tapsRetrieve tap events (when a customer taps a badge).
Query Parameters
Response Fields
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"
[{"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}]
/reviewsRetrieve customer reviews from all connected platforms.
Query Parameters
Response Fields
Use format=v2 to get all available fields including source and reviewer information.
Reviews with not_showing=true are retained for API history but hidden from Cheers review counts and views.
not_showing_at is the time Cheers detected the review was no longer showing on the source platform, not necessarily the exact platform deletion time.
from and to filters include the time Cheers first ingested a review and include not_showing_at for reviews where not_showing=true, so rolling syncs recover late arrivals and deletion visibility changes.
The ingestion timestamp is not exported; clients must trust the server-side activity-window decision instead of re-filtering returned rows by visible timestamps.
curl -X GET "https://app.cheers.tech/api/public/v1/reviews?organization_id=123&format=v2" \-H "Authorization: Bearer YOUR_API_KEY"
[{"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}]
/linksRetrieve review links configured for your organization.
Query Parameters
Response Fields
curl -X GET "https://app.cheers.tech/api/public/v1/links?organization_id=123" \-H "Authorization: Bearer YOUR_API_KEY"
[{"id": 101,"created_at": "2024-02-01T10:00:00Z","updated_at": "2024-02-01T10:00:00Z","url": "https://search.google.com/local/writereview?placeid=ChIJN1t_tDeuEmsRUsoyG83frY4","organization_id": 123,"name": "Leave a Google Review","subtitle": "Leave a review","sms_template": null,"is_verify": false}]
/link_interactionsRetrieve link click/interaction events.
Query Parameters
Response Fields
curl -X GET "https://app.cheers.tech/api/public/v1/link_interactions?organization_id=123" \-H "Authorization: Bearer YOUR_API_KEY"
[{"id": 9876,"link_id": 101,"card_id": "550e8400-e29b-41d4-a716-446655440000","created_at": "2024-06-15T18:31:00Z","updated_at": "2024-06-15T18:31:00Z","used": true,"organization_id": 123}]
/employee-linksCreate or update one employee review link, or provision up to 100 links with an items array. One case-insensitive agent_id maps to one employee across the root organization.
Request Body
Response Fields
Repeated requests with the same case-insensitive agent_id reuse one root employee; each location receives at most one active card for that employee.
Batch responses preserve input order. Full success returns 200; partial failure returns 207 with per-item status values. Successful items remain committed and are safe to retry.
Repeated agent_id values in one batch must use identical employee metadata, while organization and destination fields may differ.
API-provisioned cards are digital-only and never enter the physical badge print queue.
The API key must belong to the root organization, and organization_id must be an active location within that tenant.
Archived agents are never reactivated as a side effect; send reactivate: true to bring one back.
curl -X POST "https://app.cheers.tech/api/public/v1/employee-links" \-H "Authorization: Bearer YOUR_API_KEY" \-H "Content-Type: application/json" \-d '{"organization_id": 456,"agent_id": "AGENT-0042","first_name": "Ada","last_name": "Lovelace","destination_mode": "linktree"}'
{"employee_id": "8b194ed6-88a0-4f42-a280-d63ea47b5718","card_id": "550e8400-e29b-41d4-a716-446655440000","organization_id": 456,"agent_id": "AGENT-0042","destination_mode": "linktree","review_link_id": null,"url": "https://app.cheers.tech/api/v1/tap?card-id=550e8400-e29b-41d4-a716-446655440000","landing_page_url": "https://app.cheers.tech/urltree?id=550e8400-e29b-41d4-a716-446655440000","created_employee": true,"created_link": true}
Batch (up to 100 links)
curl -X POST "https://app.cheers.tech/api/public/v1/employee-links" \-H "Authorization: Bearer YOUR_API_KEY" \-H "Content-Type: application/json" \-d '{"items": [{"organization_id": 456,"agent_id": "AGENT-0042","first_name": "Ada","last_name": "Lovelace"},{"organization_id": 789,"agent_id": "AGENT-0042","first_name": "Ada","last_name": "Lovelace"}]}'
{"requested": 2,"succeeded": 2,"failed": 0,"created_employee_count": 1,"created_link_count": 2,"results": [{"index": 0,"status": 201,"employee_id": "8b194ed6-88a0-4f42-a280-d63ea47b5718","card_id": "550e8400-e29b-41d4-a716-446655440000"},{"index": 1,"status": 201,"employee_id": "8b194ed6-88a0-4f42-a280-d63ea47b5718","card_id": "550e8400-e29b-41d4-a716-446655440001"}]}
/employee-linksTerminate an agent. Deactivates the agent's review links and archives the employee. Idempotent: repeating the call returns 200 with zero newly deactivated links.
Request Body
Response Fields
A deactivated link stops resolving; visitors who follow it see the inactive-link page instead of a review destination.
Historical taps and reviews stay attributed to the agent after termination.
An unknown agent_id returns 404 employee_not_found; an organization_id outside the tenant returns 403.
curl -X DELETE "https://app.cheers.tech/api/public/v1/employee-links" \-H "Authorization: Bearer YOUR_API_KEY" \-H "Content-Type: application/json" \-d '{ "agent_id": "AGENT-0042" }'
{"employee_id": "8b194ed6-88a0-4f42-a280-d63ea47b5718","agent_id": "AGENT-0042","organization_id": null,"employee_archived": true,"deactivated_link_count": 1,"deactivated_card_ids": ["550e8400-e29b-41d4-a716-446655440000"]}
/gbp-performanceRetrieve daily Google Business Profile Search, Maps, and customer-action metrics by location.
Query Parameters
Response Fields
Missing observations are returned as unavailable with null metrics, never as misleading zeroes.
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"
[{"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"}]
/search-performanceRetrieve daily Google Search Console, Google Analytics, referral, and Cheers Search Visibility metrics by location.
Query Parameters
Response Fields
A row is complete only when both GSC and GA4 observations exist. Missing source metrics stay null.
Use X-Total-Count, X-Limit, and X-Offset for pagination.
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"
[{"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"}]
/search-keywordsRetrieve daily Google Search Console query metrics by location.
Query Parameters
Response Fields
Query rows are a top-500 daily diagnostic dimension and must not be summed as property totals.
Each request is limited to a 31-day window.
Advance offset by X-Limit while X-Has-More is true.
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"
[{"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"}]
/website-optimization-scoresRetrieve Website Optimization audit state and versioned site scores.
Query Parameters
Response Fields
Queued, failed, blocked, or unscored audits retain null scores; zero is never substituted.
Compare score movement only when the score_model_version supports that comparison.
Advance offset by X-Limit while X-Has-More is true.
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"
[{"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}]
/map-pack-rankingsRetrieve every grid-point rank observation from completed Google Local Finder runs.
Query Parameters
Response Fields
The supported default grid expects 25 rows. A partial completed run can contain fewer; inspect run_data_status and the grid-point counts.
A null business_rank means not found in the observed results, not rank zero.
Raw provider result payloads are not exposed.
Enumerate locations with /organizations, then export one location at a time in windows of at most 31 days.
Follow X-Next-Cursor while X-Has-More is true; nonzero offsets are rejected.
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"
[{"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}]
/ai-visibilityRetrieve daily brand appearance, rank, and citation metrics by location, prompt, and AI platform.
Query Parameters
Response Fields
Four or more valid observations are complete, one to three are partial, and zero is unavailable.
minimum_complete_runs is a quality threshold, not the tracked prompt's scheduling cadence.
Unavailable performance fields are null; zero in a partial or complete row is an observed zero.
A null avg_rank_when_present is intentional for platforms that do not provide a dependable numbered rank.
Use the X-Next-Cursor response header for scalable pagination; nonzero offsets are rejected.
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"
[{"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.
{"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.
# 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 parametersGET /reviews?cursor=VALUE_FROM_X_NEXT_CURSOR# Start the next incremental run after the prior final page commitsGET /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:
# Reviews updated in the last 7 daysGET /reviews?organization_id=123&from=2024-06-08T00:00:00Z# Reviews created in January 2024GET /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