Public API for integrators. Any request whose method/path doesn't match one of the operations below is also accepted: authenticate with X-Client-Id (see security schemes) and it's queued for asynchronous processing the same way as the documented endpoints — this generic fallback isn't representable as a single OpenAPI operation, so it's noted here instead of in `paths`.
Machine-readable spec: /openapi.json
| Server | Notes |
|---|---|
https://intent-one-gateway-staging.ihq-eng.dev | Global host — identify yourself with the X-Client-Id header |
https://{clientId}intent-one-gateway-staging.ihq-eng.dev | Per-client host — the subdomain must match the X-Client-Id header |
| Scheme | How | Notes |
|---|---|---|
| ClientId | X-Client-Id header | Identifies your client. Required on the global host; on the per-client subdomain it must also match the subdomain. |
| AppName | x-sdk-app-name header | Paired with x-sdk-api-key to identify your app for /edge/v1/report. Not valid on other endpoints. |
| AppApiKey | x-sdk-api-key header | Paired with x-sdk-app-name for /edge/v1/report. |
| ReportType | x-sdk-report-type header | Optional on /edge/v1/report. Declares the report type explicitly instead of relying on structural auto-detection — when present it's authoritative: only that type's schema versions are checked, with no fallback to any other type. |
| BearerAuth | bearer in Authorization | Credential required for account management endpoints. Contact your Intent One representative to obtain one. |
| Route | Behavior | Auth | Responses |
|---|---|---|---|
POST /edge/v1/report | Submit data for processing (type/timeliness/version resolved from headers or inferred) — Body is a single edge report object (microsegments, microsegments_snapshot, events, jema_campaign, jema_triggers, usage, debug, or encoded_enrichment), or a JSON array of report objects to submit as a batch in one request. Optionally gzip-compressed — signal this with either the standard Content-Encoding: gzip header, or a Content-Type that names gzip directly (e.g. "content-gzip"). Report type/timeliness/version are normally resolved from the x-sdk-report-type/x-sdk-report-timeliness/x-sdk-report-version headers (each optional, independent, see their own descriptions), falling back to auto-detection from the body's shape (type/version) or a default of "realtime" (timeliness) for whichever of the three isn't supplied that way. Alternatively, POST to /edge/v1/report/{type}/{timeliness}/{version} instead (see that path's own entry below) to declare all three explicitly via the URL, mirroring edge-reports-api's own route convention. | x-sdk-app-name header + x-sdk-api-key header | 202 Accepted for processing. reportType/protocolVersion/timeliness are the resolved report type, its protocol version (v1-v5, meaning differs per reportType), and timeliness (see x-sdk-report-timeliness); sdkVersion is read directly from the body.400 unrecognized_report_version: the body doesn't structurally match any known edge report type/version, and no type was declared via x-sdk-report-type. report_type_mismatch: a declared type's schema versions were checked but the body matched none of them (reportType echoes what was declared). unknown_report_type: the declared type isn't one of the eight known report types (reportType echoes the invalid value). unknown_report_version: the declared type is valid but the declared version isn't one of its known versions (reportType/version echo what was declared). |
POST /edge/v1/report/{type}/{timeliness}/{version} | Submit data for processing, declaring type/timeliness/version via the URL — Same endpoint as /edge/v1/report (identical auth, body, and response shape — see that entry for the full description), except type/timeliness/version are read from the path instead of headers/auto-detection — mirroring edge-reports-api's own POST /{type}/{timeliness}/{version} route, the convention an SDK transitions onto before this gateway is eventually removed from the path entirely. version is trusted outright once it's a recognized version for type (unknown_report_version otherwise) — there's no structural check against the body the way the header-only form (no declared version) still runs. | x-sdk-app-name header + x-sdk-api-key header | 202 Same shape as /edge/v1/report's 202 — see that entry.400 unknown_report_type (invalid type segment) or unknown_report_version (valid type, invalid version segment) — see those error codes on the bare /edge/v1/report entry. |
Provisioning endpoints. Each requires a bearer token credential — contact your Intent One representative to obtain one.
| Route | Behavior | Auth | Responses |
|---|---|---|---|
PUT /admin/accounts/{accountId} | Create or update an account — An account is the organization that will own one or more clients. | bearer token | 200 Account updated201 Account created |
PUT /admin/client/new/{clientName} | Create a new client under an account — Returns a X-Client-Id value for use with the Public API endpoints above. | bearer token | 200 Updated — client already existed201 Created — first time this client was created |
PUT /admin/client-apps/{clientId} | Set app credentials for a client — Sets the x-sdk-app-name/x-sdk-api-key credentials used with /edge/v1/report. Replaces the full set. | bearer token | 200 Updated — replaced the existing set201 Created — first time apps were set for this client404 Client doesn't exist yet |
curl -i https://intent-one-gateway-staging.ihq-eng.dev/ \
-H "X-Client-Id: $CLIENT_ID" \
-X POST -d '{"hello":"world"}'
# -> 202 {"accepted":true,"requestId":"..."}
The body may be a single report object, or a JSON array of report objects submitted as a batch in one
request. It may optionally be gzip-compressed — signal this with either the standard
Content-Encoding: gzip header, or a Content-Type that names gzip directly
(e.g. content-gzip). Report type/timeliness/version resolve from
x-sdk-report-type/x-sdk-report-timeliness/x-sdk-report-version
headers (each optional and independent), falling back to auto-detection/a default of
realtime for whichever isn't supplied that way — or POST to
/edge/v1/report/{type}/{timeliness}/{version} instead to declare all three via the URL,
mirroring edge-reports-api's own route.
# A single report
curl -i https://intent-one-gateway-staging.ihq-eng.dev/edge/v1/report \
-H "x-sdk-app-name: $APP_NAME" \
-H "x-sdk-api-key: $APP_API_KEY" \
-H "Content-Type: application/json" \
-X POST -d '{"SDKVersion":"1.2.3","Microsegments":[{"Name":"seg","Value":"x"}]}'
# -> 202 {"accepted":true,"requestId":"...","reportType":"microsegments","protocolVersion":"v2","timeliness":"realtime","sdkVersion":"1.2.3"}
# A batch of reports in one request
curl -i https://intent-one-gateway-staging.ihq-eng.dev/edge/v1/report \
-H "x-sdk-app-name: $APP_NAME" \
-H "x-sdk-api-key: $APP_API_KEY" \
-H "Content-Type: application/json" \
-X POST -d '[{"SDKVersion":"1.2.3","Microsegments":[{"Name":"seg","Value":"x"}]}, {"SDKVersion":"1.2.3","Microsegments":[{"Name":"seg2","Value":"y"}]}]'
# -> 202 {"accepted":true,"requestId":"...","reportType":"microsegments","protocolVersion":"v2","timeliness":"realtime","sdkVersion":"1.2.3"}
# Gzip-compressed body — either header works
gzip -c report.json > report.json.gz
curl -i https://intent-one-gateway-staging.ihq-eng.dev/edge/v1/report \
-H "x-sdk-app-name: $APP_NAME" \
-H "x-sdk-api-key: $APP_API_KEY" \
-H "Content-Type: application/json" \
-H "Content-Encoding: gzip" \
--data-binary @report.json.gz \
-X POST
# -> 202 {"accepted":true,"requestId":"...","reportType":"microsegments","protocolVersion":"v2","timeliness":"realtime","sdkVersion":"1.2.3"}
# A different report type — same endpoint, detected automatically
curl -i https://intent-one-gateway-staging.ihq-eng.dev/edge/v1/report \
-H "x-sdk-app-name: $APP_NAME" \
-H "x-sdk-api-key: $APP_API_KEY" \
-H "Content-Type: application/json" \
-X POST -d '{"SDKVersion":"1.2.3","DataVersion":2,"ReportUserID":"u1","ReportMode":"core","WifiEnabled":"true","LocationEnabled":true}'
# -> 202 {"accepted":true,"requestId":"...","reportType":"usage","protocolVersion":"v2","timeliness":"realtime","sdkVersion":"1.2.3"}
# Declaring the report type explicitly instead of relying on auto-detection —
# a body that doesn't match it is rejected (report_type_mismatch), even if it
# would otherwise auto-detect as a different type
curl -i https://intent-one-gateway-staging.ihq-eng.dev/edge/v1/report \
-H "x-sdk-app-name: $APP_NAME" \
-H "x-sdk-api-key: $APP_API_KEY" \
-H "x-sdk-report-type: usage" \
-H "Content-Type: application/json" \
-X POST -d '{"SDKVersion":"1.2.3","ReportMode":"core","WifiEnabled":"true"}'
# -> 202 {"accepted":true,"requestId":"...","reportType":"usage","protocolVersion":"v2","timeliness":"realtime","sdkVersion":"1.2.3"}
# Declaring type + version together trusts the version outright (no
# structural check), and timeliness independently — none of these three need
# each other to be present
curl -i https://intent-one-gateway-staging.ihq-eng.dev/edge/v1/report \
-H "x-sdk-app-name: $APP_NAME" \
-H "x-sdk-api-key: $APP_API_KEY" \
-H "x-sdk-report-type: usage" \
-H "x-sdk-report-version: v3" \
-H "x-sdk-report-timeliness: historical" \
-H "Content-Type: application/json" \
-X POST -d '{"SDKVersion":"1.2.3","ReportMode":"core","WifiEnabled":"true"}'
# -> 202 {"accepted":true,"requestId":"...","reportType":"usage","protocolVersion":"v3","timeliness":"historical","sdkVersion":"1.2.3"}
# Or declare all three via the URL instead — edge-reports-api's own path
# convention, the form an SDK transitions onto before this gateway is
# eventually removed from the path entirely
curl -i https://intent-one-gateway-staging.ihq-eng.dev/edge/v1/report/usage/historical/v3 \
-H "x-sdk-app-name: $APP_NAME" \
-H "x-sdk-api-key: $APP_API_KEY" \
-H "Content-Type: application/json" \
-X POST -d '{"SDKVersion":"1.2.3","ReportMode":"core","WifiEnabled":"true"}'
# -> 202 {"accepted":true,"requestId":"...","reportType":"usage","protocolVersion":"v3","timeliness":"historical","sdkVersion":"1.2.3"}