Skip to main content
POST
Resolve a mobile open
Mobile-open resolution is in Public Beta. Use an official Biqli mobile SDK unless you need to implement the wire contract directly.
POST https://biq.li/api/v1/track/open resolves an iOS or Android open for one registered Mobile App. A successful response can contain an exact match, a probabilistic iOS match, or no match.

Authentication

Send the Mobile App’s public, app-scoped key:
Do not use a biqli_pk_... browser key or a biqli_... secret workspace API key. The key must belong to the appId in the body.

Required headers

The JSON body must be an object no larger than 16 KB and no deeper than 32 levels. Unknown fields are rejected.

Request body

The current official SDKs send no attestation value. Do not advertise device-attestation enforcement until Biqli documents an active contract.

Example request

Matched response

No-match response

No match is a successful 200 response:

Matching behavior

Exact handoff or App Link matching runs before probabilistic evaluation. If handoffToken and deepLink identify different links, the API returns 422 handoff_mismatch. For a matched first open, the first accepted install attribution is immutable. A later firstOpen: true request for the same app instance returns the original accepted result.

Idempotency

The endpoint de-duplicates within the Mobile App by either eventId or the hashed Idempotency-Key. Repeating either identifier with the identical validated request returns the stored result and creates no second open event. Reusing either identifier with different request data returns 409 idempotency_conflict. Persist the event ID, request ID, idempotency key, and complete body together before sending. A retry must not regenerate only part of that set.

Rate limits

Default one-minute limits are 3,000 requests per Mobile App, 120 per source address, 30 per app instance, and 20 per handoff token. Additional abuse protection applies to repeated invalid-token attempts. A 429 response includes Retry-After; wait at least that many seconds and retry with the same idempotent request.

Errors

Errors produced after the mobile resolver accepts the endpoint contain error.code, error.message, and requestId; the same safe request ID is returned in X-Biq-Request-Id. The method guard and unexpected-failure handler use the standard API envelope with request_id instead. Read either request-ID spelling when implementing a direct client. Retry transport failures, 429, and 5xx with bounded backoff and the identical idempotent request. Correct other errors before retrying.

Receipts and caching

Matched live responses can include a short-lived signed receipt. Cached SDK results intentionally omit it. Verify a live receipt on a trusted backend by following Attribution receipts. Responses include Cache-Control: no-store and must not be stored by shared HTTP caches.

Authorizations

Authorization
string
header
required

A public app-scoped key beginning with biqli_mobile_pk_. It resolves mobile opens for one registered Mobile App and grants no workspace-management access.

Headers

Idempotency-Key
string
required

Stable identity for this exact request. Reuse only with the identical canonical body.

Required string length: 8 - 100
Pattern: ^[A-Za-z0-9._~-]+$
X-Biq-SDK
enum<string>
required

Native platform. Must equal the body platform.

Available options:
ios,
android
X-Biq-SDK-Version
string
required

SDK version. Must equal the body sdkVersion.

Required string length: 1 - 32
X-Biq-Request-Id
string
required

Caller-generated request identifier returned in the response.

Required string length: 8 - 100
Pattern: ^[A-Za-z0-9._~-]+$

Body

application/json

JSON object no larger than 16 KB and no deeper than 32 levels. Unknown fields are rejected.

eventId
string
required
Required string length: 8 - 100
Pattern: ^[A-Za-z0-9._~-]+$
appId
string
required

Mobile App ID belonging to the bearer key.

Maximum string length: 40
appInstanceId
string
required

Random stable identifier for this app installation.

Required string length: 16 - 128
Pattern: ^[A-Za-z0-9._~-]+$
platform
enum<string>
required
Available options:
ios,
android
firstOpen
boolean
required
probabilisticAllowed
boolean
required

Valid only for an eligible iOS first-open request with a verified attached domain.

sdkVersion
string
required
Required string length: 1 - 32
handoffToken
string | null

Opaque handoff token. Treat as sensitive and do not log.

Maximum string length: 128

Eligible installed-app HTTPS short URL.

Maximum string length: 2048
domain
string | null

Required verified attached hostname for probabilistic matching.

Maximum string length: 255
appVersion
string | null
Maximum string length: 32
osVersion
string | null
Maximum string length: 32
occurredAt
string<date-time> | null
attestation

Reserved and not currently enforced.

Response

Resolution completed. A no-match result is also a successful response.

open
object
required
click
object | null
required
attribution
object | null
required
attributionReceipt
string | null
required

Short-lived Ed25519 JWT on eligible live matched responses. Cached SDK results omit it.

requestId
string
required
Required string length: 1 - 100