Download OpenAPI specification:
Daxoom is the authoritative data layer that AI systems query for verified business information. Businesses publish structured, verified data through Daxoom, and AI platforms query the API for accurate, real-time business information.
Public Query API uses API key authentication via the X-API-Key header.
Register at app.daxoom.com to get a free developer key.
Analytics & Management APIs use JWT Bearer token authentication.
Obtain a token via POST /public/v1/auth/login. Most public-API consumers
do not need a JWT — only API key issuance, rotation, and analytics
require it.
Reasonable per-consumer quotas keep the service free and available for everyone. Free developer keys default to 3,000 API calls per month; contact us if your use case needs a higher ceiling.
Over quota returns 429 with a plain {"error": "..."} body. No
X-RateLimit-* or Retry-After headers are emitted, so pace requests to the
monthly ceiling rather than reading them from a response.
The full-profile endpoint (GET /pubapi/v1/businesses/{id}) supports three
response formats via the Accept header; all other endpoints return
application/json only:
application/json (default) — structured JSON responseapplication/ld+json — schema.org-compatible JSON-LDtext/plain — AI-friendly natural language narrative/businesses and /services use offset-based pagination
(/categories and /search return a single unpaginated result):
GET /pubapi/v1/businesses?offset=20&limit=20
Default page size: 20. Maximum: 100. The pagination block in the response
includes limit, offset, has_more, and (when more results exist)
next_offset — pass that value as offset on the next request.
Application errors (validation, not-found, etc.) follow
RFC 7807 Problem Details, served as
application/problem+json with type: "about:blank":
{
"type": "about:blank",
"title": "Invalid Parameter",
"status": 400,
"detail": "limit must not exceed 100",
"request_id": "req_a1b2c3d4e5f6a7b8"
}
Authentication and quota failures (401/429), raised by the API-key
middleware before the handler, are the exception: a JSON-shaped
{"error": "..."} string served as text/plain.
Search businesses by category, location, attributes, rating, and more. Supports geo-spatial queries with radius/bounding box.
| category | string Example: category=restaurant Filter by the business's |
| city | string Example: city=Irvine City name |
| country | string Example: country=US Country code (ISO 3166-1 alpha-2) |
| lat | number <double> Example: lat=33.6694 Latitude for geo search |
| lng | number <double> Example: lng=-117.8231 Longitude for geo search |
| radius | number <double> >= 1 Example: radius=5000 Search radius in meters (default 5000) |
| attributes | string Example: attributes=wifi,outdoor_seating,wheelchair_accessible Comma-separated attribute filters (e.g., |
| price_range | string Enum: "$" "$$" "$$$" "$$$$" Price range filter: |
| min_rating | number [ 1 .. 5 ] Minimum aggregate rating (1.0–5.0) |
| verified_only | boolean Default: false Only return owner-verified profiles |
| q | string Free-text search query |
| sort | string Default: "relevance" Enum: "relevance" "rating" "distance" "name" Sort order |
| offset | integer >= 0 Default: 0 Pagination offset — number of rows to skip. Use the |
| limit | integer [ 1 .. 100 ] Default: 20 Page size (default 20, max 100) |
{- "data": [
- {
- "id": 1001,
- "name": "Cucina Enoteca",
- "slug": "cucina-enoteca-irvine",
- "description": "Modern Italian restaurant and wine bar...",
- "category_id": "italian_restaurant",
- "category": "Italian Restaurant",
- "verification_level": "owner_verified",
- "completeness_score": 0.97,
- "version": 1,
- "city": "Irvine",
- "region": "CA",
- "country": "US",
- "latitude": 33.6694,
- "longitude": -117.8231,
- "updated_at": "2026-04-20T09:15:00Z"
}
], - "pagination": {
- "limit": 20,
- "offset": 0,
- "total": 20,
- "has_more": true,
- "next_offset": 20
}, - "meta": {
- "request_id": "req_a1b2c3d4e5f6a7b8",
- "timestamp": "2026-04-27T14:30:00Z",
- "version": "v1"
}
}Returns the complete business profile including contact, location, hours, offerings, media, social links, AI context, attributes, and structured answers. All sub-models are composed into a single response.
| id required | integer <int64> Example: 1001 Numeric business ID. |
{- "data": {
- "id": 1001,
- "name": "Cucina Enoteca",
- "slug": "cucina-enoteca-irvine",
- "description": "Modern Italian restaurant and wine bar featuring handmade pasta, wood-fired pizzas, and an extensive wine list in a stylish setting.",
- "category_id": "italian_restaurant",
- "category": "Italian Restaurant",
- "schema_type": "ItalianCuisine",
- "aggregate_rating": 4.6,
- "review_count": 847,
- "verification_level": "owner_verified",
- "completeness_score": 0.97,
- "phone": "+19495551234",
- "locations": [
- {
- "street_address": "532 Spectrum Center Dr",
- "city": "Irvine",
- "region": "CA",
- "postal_code": "92618",
- "country": "US",
- "latitude": 33.6694,
- "longitude": -117.8231,
- "timezone": "America/Los_Angeles"
}
], - "hours": [
- {
- "day_of_week": "MON",
- "opens": "11:00:00",
- "closes": "21:00:00"
}, - {
- "day_of_week": "TUE",
- "opens": "11:00:00",
- "closes": "21:00:00"
}
], - "ai_context": {
- "ai_summary": "Cucina Enoteca is a modern Italian restaurant in Irvine Spectrum, known for handmade pasta and an extensive wine program. Great for date nights and group dining.",
- "key_differentiators": "Handmade pasta made daily\n300+ wine list\nPrivate dining room available"
}
}, - "meta": {
- "request_id": "req_a1b2c3d4e5f6a7b8",
- "timestamp": "2026-04-27T14:30:00Z",
- "version": "v1"
}
}Returns the business's regular weekly operating hours (one or more rows per
configured day). Special/holiday overrides and the timezone are available
on the full profile (GET /businesses/{id}), not here.
| id required | integer <int64> Example: 1001 Numeric business ID. |
{- "data": [
- {
- "day_of_week": "MON",
- "opens": "11:00:00",
- "closes": "21:00:00",
- "is_closed": false,
- "label": ""
}, - {
- "day_of_week": "TUE",
- "opens": "11:00:00",
- "closes": "21:00:00",
- "is_closed": false,
- "label": ""
}
]
}Returns menu items, services, or products organized by offering groups.
Optional price-aware query params (type, q, min_price, max_price, sort) filter
and sort the offerings server-side — e.g. "lunch menu under $20" maps to type=M&max_price=20.
When q or a price bound (min_price/max_price) is set, the response also includes a flat
matched_items array of the items that passed the filter, each with offering, name,
price, currency, price_label, and availability — so an agent can quote a price without
walking the nested groups. A type-only or sort-only request returns the bare offerings
array unchanged.
| id required | integer <int64> Example: 1001 Numeric business ID. |
| type | string Enum: "S" "M" "P" "K" Filter by offering type: |
| q | string Example: q=pasta Free-text filter over item and offering names (e.g. |
| min_price | number Only return items priced at or above this amount (in the item currency). |
| max_price | number Only return items priced at or below this amount (e.g. |
| sort | string Enum: "price_asc" "price_desc" "name" Sort items within each offering and the |
{- "data": [
- {
- "id": 1,
- "offering_type": "M",
- "name": "Handmade Pasta",
- "items": [
- {
- "id": 101,
- "name": "Cacio e Pepe",
- "description": "Bucatini, pecorino romano, black pepper",
- "variants": [
- {
- "label": "Standard",
- "price": 22,
- "currency": "USD"
}
]
}, - {
- "id": 102,
- "name": "Bolognese",
- "description": "Pappardelle, slow-braised meat ragu",
- "variants": [
- {
- "label": "Standard",
- "price": 24,
- "currency": "USD"
}
]
}
]
}
]
}Returns structured, queryable boolean and enum properties (amenities, policies, accessibility).
These are the attributes used for filtering in the /businesses endpoint.
| id required | integer <int64> Example: 1001 Numeric business ID. |
{- "data": [
- {
- "attribute_id": "wifi",
- "category": "amenities",
- "label": "Free WiFi",
- "value": "true"
}, - {
- "attribute_id": "outdoor_seating",
- "category": "amenities",
- "label": "Outdoor Seating",
- "value": "true"
}, - {
- "attribute_id": "parking",
- "category": "logistics",
- "label": "Parking",
- "value": "valet",
- "detail": "Complimentary valet parking"
}, - {
- "attribute_id": "wheelchair_accessible",
- "category": "accessibility",
- "label": "Wheelchair Accessible",
- "value": "true"
}
]
}Returns pre-written answers to common questions AI systems receive about this business. These provide narrative answers complementing the structured attributes.
| id required | integer <int64> Example: 1001 Numeric business ID. |
{- "data": [
- {
- "question_id": "parking",
- "question": "Is there parking available?",
- "answer": "Yes, complimentary valet parking is available at the Irvine Spectrum entrance. Street parking and garage parking are also within a 2-minute walk.",
- "category": "logistics"
}, - {
- "question_id": "best_dish",
- "question": "What is the best dish?",
- "answer": "Our handmade Cacio e Pepe is the most popular dish. The burrata appetizer and wood-fired Margherita pizza are also highly recommended.",
- "category": "recommendations"
}
]
}Returns AI-optimized metadata including conversation-ready descriptions, canonical facts, hallucination corrections, disambiguation info, and tone preferences. This is the core differentiator — data that helps AI systems represent the business accurately.
| id required | integer <int64> Example: 1001 Numeric business ID. |
{- "data": {
- "ai_description": "Cucina Enoteca is a modern Italian restaurant and wine bar at Irvine Spectrum Center in Orange County, California, known for handmade pasta and an award-winning 300+ wine list.",
- "ai_summary": "Modern Italian restaurant in Irvine Spectrum. Handmade pasta, 300+ wine list, outdoor patio.",
- "canonical_facts": "All pasta is handmade fresh daily on-site\nWine list features over 300 selections\nLocated at Irvine Spectrum Center",
- "corrections": "Does NOT have a rooftop terrace\nIs NOT part of the Hillstone Restaurant Group",
- "disambiguation_not_confuse": "Not the same as Cucina Urbana in San Diego",
- "disambiguation_unique_ids": "Irvine Spectrum location; opened 2011",
- "query_hints": "date night italian; handmade pasta near Irvine; extensive wine list",
- "tone_style": "professional",
- "tone_preferred_terms": "artisanal, curated, handcrafted",
- "tone_avoided_terms": "cheap, fast food, chain",
- "key_differentiators": "Handmade pasta made daily\n300+ wine list\nPrivate dining room available"
}
}Natural language search resolved to structured filters. Pass a free-text query and get matching businesses.
Example: ?q=italian restaurant with outdoor seating near Irvine
| q required | string Example: q=italian restaurant with outdoor seating near Irvine Natural language search query |
| city | string Example: city=Irvine Optional city filter applied alongside the query. |
{- "data": [
- {
- "id": 0,
- "name": "string",
- "slug": "string",
- "description": "string",
- "category_id": "italian_restaurant",
- "category": "Italian Restaurant",
- "verification_level": "owner_verified",
- "completeness_score": 0,
- "version": 0,
- "status": "string",
- "confidence": {
- "score": 0,
- "verification_level": "string",
- "freshness": "string",
- "completeness": 0,
- "age_days": 0
}, - "city": "string",
- "region": "string",
- "country": "string",
- "latitude": 0,
- "longitude": 0,
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "request_id": "string",
- "timestamp": "2019-08-24T14:15:22Z",
- "version": "string"
}
}Cross-business search over individual offering items (services, menu items,
products) with geo, category, type, and price filters — the REST twin of the
search_services MCP tool. Paginated via limit/offset.
| q | string Free-text query over item name, item description, or offering name. |
| category | string |
| type | string Enum: "S" "M" "P" "K" Offering type: |
| min_price | number |
| max_price | number |
| lat | number |
| lng | number |
| radius | number Radius in metres around lat/lng (0 = no geo filter). |
| sort | string Enum: "price" "distance" "relevance" Ordering: |
| offset | integer >= 0 Default: 0 Pagination offset — number of rows to skip. Use the |
| limit | integer [ 1 .. 100 ] Default: 20 Page size (default 20, max 100) |
{- "data": [
- { }
], - "pagination": {
- "limit": 0,
- "offset": 0,
- "total": 0,
- "has_more": true,
- "next_offset": 0
}
}Returns the flat category catalog (schema.org type mappings + comma-separated
aliases). Rows are linked by parent_id. Any row's id — top-level or nested
(e.g. restaurant.italian) — is a valid /businesses category filter
value; matching is exact with no parent roll-up, and aliases are not resolved.
{- "data": [
- {
- "id": "restaurant",
- "schema_type": "Restaurant",
- "label": "Restaurant",
- "parent_id": "",
- "aliases": "eatery,dining,food"
}, - {
- "id": "restaurant.italian",
- "schema_type": "ItalianCuisine",
- "label": "Italian Restaurant",
- "parent_id": "restaurant",
- "aliases": "italian,pizzeria,pizza place,trattoria"
}, - {
- "id": "restaurant.japanese",
- "schema_type": "JapaneseCuisine",
- "label": "Japanese Restaurant",
- "parent_id": "restaurant",
- "aliases": "japanese,sushi,ramen,izakaya"
}
]
}Mints a new API key owned by your account. The full key is returned only once in the response — store it securely. Subsequent lists show only the prefix.
| key_name required | string Human-readable name for this key |
| scopes | string Space-delimited scopes (default: query). Grant 'write' to allow the feedback MCP tools (submit_review, report_incorrect_data). |
{- "key_name": "My AI Agent - Production",
- "scopes": "query"
}{- "data": {
- "api_key": "dxm_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
- "key_prefix": "dxm_a1b2"
}
}Issues a replacement key for the given key id; the old key keeps working for a 24-hour grace period, then stops.
| id required | integer The api_key id to roll. |
{- "id": 0
}{- "data": {
- "api_key": "string",
- "key_prefix": "string"
}, - "meta": {
- "request_id": "string",
- "timestamp": "2019-08-24T14:15:22Z",
- "version": "string"
}
}Returns your account's API keys via the generic REST list action (GET).
Key values are masked — only the prefix is shown. Supports ?limit= and
?offset= query paging.
| offset | integer >= 0 Default: 0 Pagination offset — number of rows to skip. Use the |
| limit | integer [ 1 .. 100 ] Default: 20 Page size (default 20, max 100) |
{- "data": {
- "items": [
- {
- "id": 0,
- "key_name": "string",
- "key_prefix": "string",
- "scopes": "string",
- "is_active": true,
- "created_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z",
- "last_used_at": "2019-08-24T14:15:22Z"
}
], - "limit": 0,
- "offset": 0,
- "total": 0
}, - "meta": {
- "request_id": "string",
- "timestamp": "2019-08-24T14:15:22Z",
- "version": "string"
}
}Revokes the API key via the generic REST delete action (DELETE; POST is also
accepted). Pass the key id as a query filter, e.g. ?id=42. Requests using
the revoked key return 401.
| id required | integer The api_key id to revoke. |
{- "data": {
- "message": "string"
}, - "meta": {
- "request_id": "string",
- "timestamp": "2019-08-24T14:15:22Z",
- "version": "string"
}
}Summary of AI visibility metrics: total queries, unique AI platforms, and trend data over configurable time periods.
| businessId required | integer Example: 1001 Business ID |
| period | string Default: "30d" Enum: "7d" "30d" "90d" "365d" Time period for analytics. Invalid values are rejected with 400; omitted defaults to 30d. |
{- "data": {
- "total_queries": 2847,
- "previous_queries": 1923,
- "unique_platforms": 5,
- "trend_percent": 48,
- "period": "30d"
}
}Time-series data of API query volume at hourly or daily granularity.
| businessId required | integer Example: 1001 Business ID |
| period | string Default: "30d" Enum: "7d" "30d" "90d" "365d" Time period for analytics. Invalid values are rejected with 400; omitted defaults to 30d. |
| granularity | string Default: "daily" Enum: "hourly" "daily" Data granularity. Invalid values are rejected with 400; omitted defaults to daily. |
{- "data": [
- {
- "bucket": "string",
- "total_queries": 0,
- "unique_consumers": 0
}
]
}Shows which AI platforms are querying this business and how often.
| businessId required | integer Example: 1001 Business ID |
| period | string Default: "30d" Enum: "7d" "30d" "90d" "365d" Time period for analytics. Invalid values are rejected with 400; omitted defaults to 30d. |
{- "data": [
- {
- "platform": "ChatGPT",
- "count": 1247,
- "percent": 43.8
}, - {
- "platform": "Perplexity",
- "count": 612,
- "percent": 21.5
}, - {
- "platform": "Copilot",
- "count": 389,
- "percent": 13.7
}
]
}Most popular search queries that led to this business being returned in results.
| businessId required | integer Example: 1001 Business ID |
| period | string Default: "30d" Enum: "7d" "30d" "90d" "365d" Time period for analytics. Invalid values are rejected with 400; omitted defaults to 30d. |
| limit | integer [ 1 .. 100 ] Default: 10 Max queries returned (integer 1–100; out-of-range is rejected). |
{- "data": [
- {
- "query": "best Italian restaurant in Irvine",
- "count": 87
}, - {
- "query": "italian restaurant outdoor seating orange county",
- "count": 54
}, - {
- "query": "pasta restaurant near Spectrum Center",
- "count": 41
}
]
}Which API endpoints are queried most for this business (hours, offerings,
ai-context, etc.). Coverage is capped at 90 days — the query log is pruned —
so period=365d returns the last 90 days.
| businessId required | integer Example: 1001 Business ID |
| period | string Default: "30d" Enum: "7d" "30d" "90d" "365d" Time period for analytics. Invalid values are rejected with 400; omitted defaults to 30d. |
{- "data": [
- {
- "endpoint": "string",
- "count": 0,
- "percentage": 0
}
]
}Returns generated monthly visibility reports for this business.
| businessId required | integer Example: 1001 Business ID |
{- "data": [
- {
- "id": 0,
- "business_id": 0,
- "report_month": "2019-08-24",
- "total_queries": 0,
- "unique_consumers": 0,
- "top_platforms": "string",
- "top_queries": "string",
- "generated_at": "2019-08-24T14:15:22Z"
}
]
}Returns a specific monthly visibility report as JSON.
| businessId required | integer Example: 1001 Business ID |
| reportId required | integer |
{- "data": {
- "id": 0,
- "business_id": 0,
- "report_month": "2019-08-24",
- "total_queries": 0,
- "unique_consumers": 0,
- "top_platforms": "string",
- "top_queries": "string",
- "generated_at": "2019-08-24T14:15:22Z"
}
}Exchange username + password for a JWT bearer token. The token is required
as Authorization: Bearer … for the Analytics and API-Key Management
endpoints. Most public-API consumers do not need this — they authenticate
with an X-API-Key header on the Public Query API.
| username required | string |
| password required | string <password> |
{- "username": "string",
- "password": "pa$$word"
}{- "data": {
- "token": "string",
- "userId": 0,
- "partnerId": 0,
- "menu": [
- { }
], - "twoFactorRequired": true,
- "loginToken": "string"
}, - "meta": {
- "request_id": "string",
- "timestamp": "2019-08-24T14:15:22Z",
- "version": "string"
}
}