Restaurant data API for RevOps agents.
Query current restaurant records, refresh missing fields, and export evidence-backed rows for GTM systems.
Keys, versions, and health
Use one workspace API key, pin the API version, and log request IDs for support.
curl https://api.ora.248.ai/v1/status \
-H "Authorization: Bearer $ORA_API_KEY" \
-H "Ora-Version: 2026-06-01"| Item | Contract |
|---|---|
| Base URL | https://api.ora.248.ai |
| Authentication | Send Authorization: Bearer $ORA_API_KEY on every request. |
| Version header | Send Ora-Version with the API date your integration was built against. |
| Key scope | Keys are scoped to a workspace. Use separate keys for production and internal testing. |
Fields
Restaurant-level fields grouped by how RevOps teams use them.
Location
| Field | Type | Description |
|---|---|---|
| location_id | string | Stable Ora ID for the physical restaurant. |
| name | string | Business name from Google Places and site evidence. |
| place_id | string | Google Places ID when matched. |
| address.street_address | string | Normalized street address. |
| address.city | string | City for territory filters. |
| address.state | string | Two-letter state code. |
| address.postal_code | string | Postal code. |
| address.latitude | number | Latitude for routing and coverage maps. |
| address.longitude | number | Longitude for routing and coverage maps. |
| business_status | enum | operational, closed, or unknown. |
| website_url | string | Canonical website when discovered. |
Operators
| Field | Type | Description |
|---|---|---|
| operators.owner_names | string[] | Owners, operators, or managing members. |
| operators.operating_group | string | Restaurant group, franchisee, or LLC. |
| operators.chain_status | enum | national_chain, local_chain, or single_location. |
| operators.location_count_estimate | number | Related-location estimate. |
| operators.confidence | enum | high, medium, or low. |
Vendors
| Field | Type | Description |
|---|---|---|
| technology.pos.primary_pos | string | Detected POS provider. |
| technology.pos.confidence | enum | high, medium, or low. |
| technology.online_ordering.delivery | string[] | Delivery providers found. |
| technology.online_ordering.pickup | string[] | Pickup or first-party ordering providers. |
| technology.online_ordering.gap | enum | missing_first_party, delivery_only, or none. |
| technology.loyalty.provider | string | Loyalty provider when found. |
| technology.gift_cards.provider | string | Gift card provider when found. |
| technology.mobile_apps.ios_app_url | string | iOS app URL. |
| technology.mobile_apps.android_app_url | string | Android app URL. |
Signals
| Field | Type | Description |
|---|---|---|
| menu_items | string[] | Observed dishes and offers. |
| cuisine_tags | string[] | Cuisine and service-model tags. |
| catering.found | boolean | Catering or ezCater presence. |
| negative_reviews | object[] | Reviews about ordering, website, app, or loyalty issues. |
| signals[].type | enum | new_opening, vendor_added, menu_item_added, owner_changed, or license_event. |
| signals[].label | string | Readable label for the change. |
| signals[].source_url | string | Source URL used for the signal. |
| signals[].confidence | enum | high, medium, or low. |
| refreshed_at | datetime | Most recent refresh time. |
Evidence
| Field | Type | Description |
|---|---|---|
| evidence[].field_path | string | Exact field path the evidence supports. |
| evidence[].url | string | Canonical source URL used for the field decision. |
| evidence[].source_type | enum | restaurant_website, ordering_provider, government_filing, maps, social, news, menu_pdf, or license_record. |
| evidence[].observed_at | datetime | Timestamp when Ora observed the source. |
| evidence[].snippet | string | Short source excerpt or normalized evidence label when available. |
Search restaurants
Filter records by geography, vendor state, chain status, and recent changes.
/v1/restaurants/searchcurl -G https://api.ora.248.ai/v1/restaurants/search \
-H "Authorization: Bearer $ORA_API_KEY" \
-d city=Chicago \
-d state=IL \
-d pos=toast \
-d online_ordering=missing_first_party{
"data": [{
"location_id": "loc_123",
"name": "Sofia's Tacos",
"address": {
"city": "Chicago",
"state": "IL"
},
"operators": {
"owner_names": ["Sofia Lopez"]
},
"technology": {
"pos": "Toast",
"ordering_gap": "missing_first_party"
},
"signals": [{
"type": "menu_item_added",
"label": "squid ink pasta"
}],
"evidence": {
"operators.owner_names": "sos.ca.gov",
"technology.pos": "sofias.example/order"
}
}],
"next_cursor": "cur_9XQ7"
}| Method | Endpoint | Use | Params |
|---|---|---|---|
| GET | /v1/restaurants/search | Find matching restaurant locations. | citystatecategoryposonline_orderingchain_statuschanged_sincelimitcursor |
| GET | /v1/restaurants/{location_id} | Read one current restaurant record. | include=operators,technology,menu,signals,evidence |
| GET | /v1/restaurants/{location_id}/signals | Read recent changes for one location. | sincesignal_typelimit |
| POST | /v1/enrichment-jobs | Refresh known rows. | fieldsrowswebhook_urlsource_metadata |
| GET | /v1/enrichment-jobs/{job_id} | Check job status and row results. | include=items,errors |
| POST | /v1/exports | Create CSV or JSONL output. | formatfiltersfieldsdestinationwebhook_url |
| GET | /v1/status | Check API availability and current version. |
Refresh known rows
Submit CRM or warehouse rows and choose the fields to return.
{
"fields": [
"google_match",
"technology.pos.primary_pos",
"operators.owner_names"
],
"rows": [{
"input_name": "Sofia's Tacos",
"input_address": "2147 W Division St, Chicago"
}]
}Allowed values
google_matchGoogle Places match and location ID.
website_discoveryCanonical website.
operators.owner_namesOwner or operator names with evidence.
operators.operating_groupRestaurant group, franchisee, or LLC.
technology.pos.primary_posPOS provider.
technology.online_orderingDelivery and pickup providers.
technology.loyalty.providerLoyalty program and provider.
technology.gift_cards.providerGift card availability and provider.
technology.mobile_appsiOS and Android app links.
negative_reviewsDigital ordering pain from reviews.
cateringCatering and ezCater presence.
Operational behavior
The contracts that matter when Ora is wired into CRM, warehouse, and agent workflows.
| Topic | Behavior |
|---|---|
| Policy | Limits are set per workspace and returned in response headers. |
| Headers | X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, and X-Request-Id. |
| 429 behavior | Back off until Retry-After. Reusing the same cursor after waiting is safe. |
| Availability | GET /v1/status returns API health, current version, and incident state. |
| Field | Behavior |
|---|---|
| limit | Defaults to 25. Maximum accepted value is 100. |
| next_cursor | Opaque cursor returned when more rows are available. |
| cursor | Pass next_cursor back unchanged with the same filters and sort order. |
| Ordering | Search results are stable for the cursor window; changed records may appear in later pages. |
{
"event_type": "enrichment_job.completed",
"job_id": "job_123",
"status": "completed",
"counts": {
"submitted": 1000,
"matched": 947
},
"results_path": "/v1/enrichment-jobs/job_123/results",
"completed_at": "2026-06-04T15:16:42Z"
}| Topic | Behavior |
|---|---|
| Delivery | Ora sends a POST to webhook_url when an enrichment job or export completes or fails. |
| Retries | Non-2xx responses are retried with backoff for 24 hours. |
| Signature | X-Ora-Signature contains an HMAC-SHA256 signature over the raw request body. |
| Idempotency | Use job_id, export_id, and event_id to ignore duplicate webhook deliveries. |
| Confidence | Meaning |
|---|---|
| high | Direct source evidence for the field, such as a first-party website, ordering page, filing, or license record. |
| medium | Multiple public hints agree, but no single source is conclusive. |
| low | A weak public signal exists. Use for prioritization, not automatic CRM overwrite. |
{
"error": {
"code": "rate_limit_exceeded",
"message": "Too many requests.",
"request_id": "req_123",
"retry_after_seconds": 42
}
}| Status | Code | When it happens |
|---|---|---|
| 400 | bad_request | Missing or malformed query parameter. |
| 401 | unauthorized | Missing, expired, or invalid API key. |
| 403 | forbidden | The API key is valid but not allowed to access the workspace or field. |
| 404 | not_found | No record, job, export, or cursor exists for the supplied ID. |
| 409 | conflict | The job or export is already running with the same idempotency key. |
| 422 | validation_failed | The payload shape is valid JSON but does not match the contract. |
| 429 | rate_limit_exceeded | The workspace has exceeded its provisioned request limit. |
| 500 | internal_error | Ora could not complete the request. Retry with the same idempotency key. |
| Evidence field | Meaning |
|---|---|
| field_path | The exact field the source supports, such as technology.pos.primary_pos. |
| url | Canonical URL of the source used for the field decision. |
| source_type | restaurant_website, ordering_provider, government_filing, maps, social, news, menu_pdf, or license_record. |
| observed_at | Timestamp when Ora observed the source. |
| snippet | Short source excerpt or normalized evidence label when available. |
Freshness and sources
Ora refreshes fields at the cadence that matches the source and the buyer workflow.
| Field group | Refresh behavior |
|---|---|
| Location identity and status | Daily for covered markets; refreshed immediately when a submitted row is enriched. |
| Technology vendors | Daily checks for POS, online ordering, delivery, loyalty, gift cards, reservations, and mobile apps. |
| Menu, cuisine, and catering | Daily where the menu or ordering source is reachable. |
| Signals | Daily change detection for openings, vendor changes, menu changes, licenses, and visible movement. |
| Operators and ownership | Weekly plus event-triggered refreshes when filings, articles, or customer requests expose new evidence. |
| Reviews and social profiles | Weekly unless a batch job asks for the field directly. |
| Source group | Examples | Used for |
|---|---|---|
| Places and maps | Google Places, map panels, hours, status, category, reviews, photos, and address evidence. | Location match, business status, category, and routing fields. |
| Restaurant web | Official websites, menus, PDFs, ordering pages, catering pages, and location pages. | Menu items, service model, catering, and first-party ordering. |
| Vendor surfaces | Delivery, pickup, POS, loyalty, gift card, reservation, payment, and mobile app providers. | Technology vendor detection and missing-provider gaps. |
| Public records | Secretary of State filings, liquor licenses, local permits, and related public registries. | Owners, operating groups, alcohol signals, and opening movement. |
| Market signals | Local news, launch articles, social pages, operator profiles, and visible expansion signals. | Fresh outreach events and expansion context. |
RevOps agent tasks
| Workflow | Fields | Output |
|---|---|---|
| Territory build | city, state, category_tags, chain_status, location_count_estimate | Restaurant accounts grouped by coverage area. |
| Vendor displacement | technology.pos.primary_pos, technology.online_ordering.delivery, technology.loyalty.provider, technology.gift_cards.provider | Accounts with a vendor match or missing provider. |
| Fresh outreach | signals[].type, changed_since, refreshed_at | Recently changed accounts for time-sensitive sequences. |
| CRM refresh | operators.owner_names, website_url, business_status, evidence[].url, operators.confidence | Field updates with source context. |
| Agent handoff | location_id, requested_fields, evidence[].url, run_status | A bounded packet instead of open-ended browsing. |