Store profile by domain
The current profile of one store from completed observations: platform, technologies with install state and dates, geography, industry, catalog aggregates, lifecycle status, and the last five confirmed signals. Cacheable; identical inputs return identical bodies until the next completed observation.
read:storesbilling unitlookup_cachedagent notesOne lookup_cached unit on 200; nothing on 404. A 404 with code not_found means the domain is not in the corpus, which is not evidence that the site is not a store; use POST /v1/stores/enrich with refresh: true (if the key has write:scans) to request an observation. Before concluding a technology is absent, check observation.scope: only a `full` scope supports that reading. Never infer an uninstall from a missing entry when last_completed_scan_at is old; use /history for confirmed removals.
The current profile of one store from completed observations: platform, technologies with install state and dates, geography, industry, catalog aggregates, lifecycle status, and the last five confirmed signals. Cacheable; identical inputs return identical bodies until the next completed observation.
Authorization
ApiKey Workspace API key as a bearer token. Create keys in the dashboard under Settings → API keys. Test keys (oai_test_) answer from a fixed test tenant and never queue production scans.
In: header
Path Parameters
Hostname of the store, for example gymshark.com. A full URL also works but must be percent-encoded, because this is a single path segment. Either way the value is canonicalized server-side to the registrable domain; the response carries the canonical domain and, when different, the storefront_host that actually serves the shop.
3 <= length <= 253Header Parameters
Optional caller-supplied request id (8 to 64 characters, A-Z a-z 0-9 _ -). Echoed back on the response; otherwise the API generates one.
Response Body
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/stores/string"{ "match": "matched", "store": { "brand_group_id": "bg_01J9X4K6ZP3M8Q2R5T7V9W1Y3A", "catalog": { "as_of": "2026-09-09T02:20:00Z", "available_count": null, "coverage": "first_page", "currency": "GBP", "price_range": { "median": 34, "p25": 28, "p75": 98 }, "product_count": 1284 }, "domain": "gymshark.com", "geography": { "basis": "observed", "country": "GB" }, "industry": { "basis": "classified", "slug": "apparel" }, "name": "Gymshark", "observation": { "coverage_note": null, "last_completed_scan_at": "2026-09-08T04:12:31Z", "scope": "full" }, "platform": { "confidence": "high", "first_observed_at": "2025-11-02T09:41:00Z", "last_confirmed_at": "2026-09-08T04:12:31Z", "name": "Shopify", "slug": "shopify" }, "profile_url": "https://ongoing.ai/stores/gymshark.com", "recent_signals": [ { "confidence": "high", "confirmed_at": "2026-09-01T04:02:44Z", "effective_at": "2026-08-30T03:58:10Z", "from": null, "id": "evt_7Q2M4K9ZP3R5T7V9W1Y3A6B8C", "technology": "gorgias", "to": null, "type": "technology_added" } ], "status": { "as_of": "2026-09-08T04:12:31Z", "state": "active_storefront" }, "storefront_host": "www.gymshark.com", "storefront_id": "sf_01J9X4K6ZP3M8Q2R5T7V9W1Y3A", "technologies": [ { "category": "email-marketing", "confidence": "high", "first_observed_at": "2026-02-14T11:05:12Z", "install_state": "active", "last_confirmed_at": "2026-09-08T04:12:31Z", "name": "Klaviyo", "slug": "klaviyo" }, { "category": "customer-support", "confidence": "high", "first_observed_at": "2026-08-30T03:58:10Z", "install_state": "active", "last_confirmed_at": "2026-09-08T04:12:31Z", "name": "Gorgias", "slug": "gorgias" }, { "category": "reviews", "confidence": "medium", "first_observed_at": "2026-01-20T08:00:00Z", "install_state": "configured", "last_confirmed_at": "2026-09-08T04:12:31Z", "name": "Yotpo", "slug": "yotpo" } ] }}Enrich up to 100 domains POST
Batch form of the store profile. Each input is canonicalized and answered independently; the response preserves input order. Matched and stale inputs return the full store object. No-match inputs return a reason and are not billed. With `refresh: true` and the `write:scans` scope, unknown or stale domains are queued for observation and the result is marked `scan_requested`.
One technology GET
Metadata for one slug.