Intent One Gateway v1.2.0

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

Servers

ServerNotes
https://intent-one-gateway-staging.ihq-eng.devGlobal host — identify yourself with the X-Client-Id header
https://{clientId}intent-one-gateway-staging.ihq-eng.devPer-client host — the subdomain must match the X-Client-Id header

Authentication

SchemeHowNotes
ClientIdX-Client-Id headerIdentifies your client. Required on the global host; on the per-client subdomain it must also match the subdomain.
AppNamex-sdk-app-name headerPaired with x-sdk-api-key to identify your app for /edge/v1/report. Not valid on other endpoints.
AppApiKeyx-sdk-api-key headerPaired with x-sdk-app-name for /edge/v1/report.
ReportTypex-sdk-report-type headerOptional 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.
BearerAuthbearer in AuthorizationCredential required for account management endpoints. Contact your Intent One representative to obtain one.

Public API

RouteBehaviorAuthResponses
POST /edge/v1/reportSubmit 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 header202 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 header202 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.

Account management

Provisioning endpoints. Each requires a bearer token credential — contact your Intent One representative to obtain one.

RouteBehaviorAuthResponses
PUT /admin/accounts/{accountId}Create or update an account — An account is the organization that will own one or more clients.bearer token200 Account updated
201 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 token200 Updated — client already existed
201 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 token200 Updated — replaced the existing set
201 Created — first time apps were set for this client
404 Client doesn't exist yet

Example

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":"..."}

Example: /edge/v1/report

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"}