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.

API key setup
curl https://api.ora.248.ai/v1/status \
  -H "Authorization: Bearer $ORA_API_KEY" \
  -H "Ora-Version: 2026-06-01"
ItemContract
Base URLhttps://api.ora.248.ai
AuthenticationSend Authorization: Bearer $ORA_API_KEY on every request.
Version headerSend Ora-Version with the API date your integration was built against.
Key scopeKeys 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

FieldTypeDescription
location_idstringStable Ora ID for the physical restaurant.
namestringBusiness name from Google Places and site evidence.
place_idstringGoogle Places ID when matched.
address.street_addressstringNormalized street address.
address.citystringCity for territory filters.
address.statestringTwo-letter state code.
address.postal_codestringPostal code.
address.latitudenumberLatitude for routing and coverage maps.
address.longitudenumberLongitude for routing and coverage maps.
business_statusenumoperational, closed, or unknown.
website_urlstringCanonical website when discovered.

Operators

FieldTypeDescription
operators.owner_namesstring[]Owners, operators, or managing members.
operators.operating_groupstringRestaurant group, franchisee, or LLC.
operators.chain_statusenumnational_chain, local_chain, or single_location.
operators.location_count_estimatenumberRelated-location estimate.
operators.confidenceenumhigh, medium, or low.

Vendors

FieldTypeDescription
technology.pos.primary_posstringDetected POS provider.
technology.pos.confidenceenumhigh, medium, or low.
technology.online_ordering.deliverystring[]Delivery providers found.
technology.online_ordering.pickupstring[]Pickup or first-party ordering providers.
technology.online_ordering.gapenummissing_first_party, delivery_only, or none.
technology.loyalty.providerstringLoyalty provider when found.
technology.gift_cards.providerstringGift card provider when found.
technology.mobile_apps.ios_app_urlstringiOS app URL.
technology.mobile_apps.android_app_urlstringAndroid app URL.

Signals

FieldTypeDescription
menu_itemsstring[]Observed dishes and offers.
cuisine_tagsstring[]Cuisine and service-model tags.
catering.foundbooleanCatering or ezCater presence.
negative_reviewsobject[]Reviews about ordering, website, app, or loyalty issues.
signals[].typeenumnew_opening, vendor_added, menu_item_added, owner_changed, or license_event.
signals[].labelstringReadable label for the change.
signals[].source_urlstringSource URL used for the signal.
signals[].confidenceenumhigh, medium, or low.
refreshed_atdatetimeMost recent refresh time.

Evidence

FieldTypeDescription
evidence[].field_pathstringExact field path the evidence supports.
evidence[].urlstringCanonical source URL used for the field decision.
evidence[].source_typeenumrestaurant_website, ordering_provider, government_filing, maps, social, news, menu_pdf, or license_record.
evidence[].observed_atdatetimeTimestamp when Ora observed the source.
evidence[].snippetstringShort source excerpt or normalized evidence label when available.

Search restaurants

Filter records by geography, vendor state, chain status, and recent changes.

GET/v1/restaurants/search
Request
curl -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
Response
{
  "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"
}
MethodEndpointUseParams
GET/v1/restaurants/searchFind 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}/signalsRead recent changes for one location.
sincesignal_typelimit
POST/v1/enrichment-jobsRefresh known rows.
fieldsrowswebhook_urlsource_metadata
GET/v1/enrichment-jobs/{job_id}Check job status and row results.
include=items,errors
POST/v1/exportsCreate CSV or JSONL output.
formatfiltersfieldsdestinationwebhook_url
GET/v1/statusCheck API availability and current version.

Refresh known rows

Submit CRM or warehouse rows and choose the fields to return.

POST /v1/enrichment-jobs
{
  "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_match

Google Places match and location ID.

website_discovery

Canonical website.

operators.owner_names

Owner or operator names with evidence.

operators.operating_group

Restaurant group, franchisee, or LLC.

technology.pos.primary_pos

POS provider.

technology.online_ordering

Delivery and pickup providers.

technology.loyalty.provider

Loyalty program and provider.

technology.gift_cards.provider

Gift card availability and provider.

technology.mobile_apps

iOS and Android app links.

negative_reviews

Digital ordering pain from reviews.

catering

Catering and ezCater presence.

Operational behavior

The contracts that matter when Ora is wired into CRM, warehouse, and agent workflows.

Rate limits and status
TopicBehavior
PolicyLimits are set per workspace and returned in response headers.
HeadersX-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, and X-Request-Id.
429 behaviorBack off until Retry-After. Reusing the same cursor after waiting is safe.
AvailabilityGET /v1/status returns API health, current version, and incident state.
Pagination
FieldBehavior
limitDefaults to 25. Maximum accepted value is 100.
next_cursorOpaque cursor returned when more rows are available.
cursorPass next_cursor back unchanged with the same filters and sort order.
OrderingSearch results are stable for the cursor window; changed records may appear in later pages.
Webhook payload
{
  "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"
}
TopicBehavior
DeliveryOra sends a POST to webhook_url when an enrichment job or export completes or fails.
RetriesNon-2xx responses are retried with backoff for 24 hours.
SignatureX-Ora-Signature contains an HMAC-SHA256 signature over the raw request body.
IdempotencyUse job_id, export_id, and event_id to ignore duplicate webhook deliveries.
ConfidenceMeaning
highDirect source evidence for the field, such as a first-party website, ordering page, filing, or license record.
mediumMultiple public hints agree, but no single source is conclusive.
lowA weak public signal exists. Use for prioritization, not automatic CRM overwrite.
Error response
{
  "error": {
    "code": "rate_limit_exceeded",
    "message": "Too many requests.",
    "request_id": "req_123",
    "retry_after_seconds": 42
  }
}
StatusCodeWhen it happens
400bad_requestMissing or malformed query parameter.
401unauthorizedMissing, expired, or invalid API key.
403forbiddenThe API key is valid but not allowed to access the workspace or field.
404not_foundNo record, job, export, or cursor exists for the supplied ID.
409conflictThe job or export is already running with the same idempotency key.
422validation_failedThe payload shape is valid JSON but does not match the contract.
429rate_limit_exceededThe workspace has exceeded its provisioned request limit.
500internal_errorOra could not complete the request. Retry with the same idempotency key.
Evidence fieldMeaning
field_pathThe exact field the source supports, such as technology.pos.primary_pos.
urlCanonical URL of the source used for the field decision.
source_typerestaurant_website, ordering_provider, government_filing, maps, social, news, menu_pdf, or license_record.
observed_atTimestamp when Ora observed the source.
snippetShort 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.

Refresh cadence
Field groupRefresh behavior
Location identity and statusDaily for covered markets; refreshed immediately when a submitted row is enriched.
Technology vendorsDaily checks for POS, online ordering, delivery, loyalty, gift cards, reservations, and mobile apps.
Menu, cuisine, and cateringDaily where the menu or ordering source is reachable.
SignalsDaily change detection for openings, vendor changes, menu changes, licenses, and visible movement.
Operators and ownershipWeekly plus event-triggered refreshes when filings, articles, or customer requests expose new evidence.
Reviews and social profilesWeekly unless a batch job asks for the field directly.
Source groupExamplesUsed for
Places and mapsGoogle Places, map panels, hours, status, category, reviews, photos, and address evidence.Location match, business status, category, and routing fields.
Restaurant webOfficial websites, menus, PDFs, ordering pages, catering pages, and location pages.Menu items, service model, catering, and first-party ordering.
Vendor surfacesDelivery, pickup, POS, loyalty, gift card, reservation, payment, and mobile app providers.Technology vendor detection and missing-provider gaps.
Public recordsSecretary of State filings, liquor licenses, local permits, and related public registries.Owners, operating groups, alcohol signals, and opening movement.
Market signalsLocal news, launch articles, social pages, operator profiles, and visible expansion signals.Fresh outreach events and expansion context.

RevOps agent tasks

WorkflowFieldsOutput
Territory buildcity, state, category_tags, chain_status, location_count_estimateRestaurant accounts grouped by coverage area.
Vendor displacementtechnology.pos.primary_pos, technology.online_ordering.delivery, technology.loyalty.provider, technology.gift_cards.providerAccounts with a vendor match or missing provider.
Fresh outreachsignals[].type, changed_since, refreshed_atRecently changed accounts for time-sensitive sequences.
CRM refreshoperators.owner_names, website_url, business_status, evidence[].url, operators.confidenceField updates with source context.
Agent handofflocation_id, requested_fields, evidence[].url, run_statusA bounded packet instead of open-ended browsing.