Circadify

Sessions

Create measurement sessions, upload measurement data, and retrieve results via the REST API.

Sessions represent a single vital signs measurement workflow. SDK integrations normally manage these calls for you.

Session Lifecycle

  1. Create a session via POST /sdk/session/start.

  2. Upload the SDK-prepared measurement payload to the secure upload URL returned by the API.

  3. Notify the API via POST /sdk/session/upload-complete. The API accepts the upload and starts processing.

  4. Read the result by polling GET /sdk/session/{sessionId}/result.

Caution

The low-level upload payload format is not documented publicly. Use an SDK unless Circadify has approved direct upload access for your integration.

Create a Session

POST /sdk/session/start
http

Headers:

X-API-Key: ck_live_your_key_here
Content-Type: application/json
http

Request body (optional):

{
  "demographics": {
    "age": 35,
    "sex": "M",
    "fitzpatrick": 3
  }
}
json

Demographics are optional but can improve measurement quality when provided.

Response 200 OK:

{
  "session_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "expires_at": "2026-05-24T18:00:00.000Z",
  "upload_url": "https://upload.circadify.com/uploads/a1b2c3...",
  "status": "pending"
}
json
FieldTypeDescription
session_idstringUnique session identifier
expires_atstringISO-8601 timestamp when the session expires
upload_urlstringSecure URL for the SDK-prepared upload payload
statusstringInitial session status, usually pending

Upload Measurement Payload

SDKs upload the measurement payload automatically. Approved direct REST integrations upload the SDK-prepared binary payload to the upload_url returned from session creation:

curl -X PUT "$UPLOAD_URL" \
  -H "Content-Type: application/octet-stream" \
  --data-binary @measurement-payload.bin
bash

The upload payload is not raw video, raw frames, or a public media format. The low-level payload structure is intentionally private and may change between SDK versions.

Notify Upload Complete

POST /sdk/session/upload-complete
http

Headers:

X-API-Key: ck_live_your_key_here
Content-Type: application/json
http

Request body:

{
  "session_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
json

Response 202 Accepted:

{
  "session_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "status": "processing"
}
json

After this response, poll GET /sdk/session/{sessionId}/result until the session reaches completed or failed. SDKs handle this polling automatically.

Session Statuses

StatusDescription
pendingSession initialized, awaiting upload completion
uploadedUpload has completed and is awaiting processing
processingProcessing in progress
completedResults available
failedProcessing failed
expiredSession timed out before completion

Errors

StatusError CodeDescription
400INVALID_REQUESTMissing session_id or invalid parameters
401API_KEY_INVALIDInvalid, revoked, or missing API key
403FORBIDDENSession does not belong to this developer
404SESSION_NOT_FOUNDSession ID does not exist
410SESSION_EXPIREDSession expired before completion
422failedProcessing failed; the result response includes an error message
429RATE_LIMIT_EXCEEDEDSandbox (ck_test_) request rate limit exceeded (best-effort, retryable)
429QUOTA_EXCEEDEDMonthly scan quota exhausted on a production (ck_live_) key (not retryable)

On POST /sdk/session/start, a live key whose monthly scan quota is exhausted returns 429 QUOTA_EXCEEDED (retryable: false) — track usage on the Usage page in the developer portal. No Retry-After header is emitted on either 429.

See Errors for the full error reference.

Next Steps