{
"submissionId": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
"jobId": "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb",
"partnerSubmissionId": "partner-ext-sub-0001",
"partnerSubjectId": "partner-ext-pt-0001",
"status": "accepted"
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid submission payload",
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"correlationId": "corr-example-1",
"details": {}
}
}{
"error": {
"code": "INVALID_API_KEY",
"message": "Invalid or expired API key",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"requestId": "<string>",
"correlationId": "<string>",
"details": "<unknown>"
}
}{
"error": {
"code": "IDEMPOTENCY_MISMATCH",
"message": "Idempotency-Key was already used with a different request body",
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"correlationId": "corr-example-1"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "Internal server error",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}Create Submissions
Accepts de-identified payload. partnerId MUST equal the authenticated PartnerCredential.id.
At least one of markers or reportDocuments MUST be present (non-empty). Extra keys on nested objects are rejected (.strict() Zod schemas).
{
"submissionId": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
"jobId": "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb",
"partnerSubmissionId": "partner-ext-sub-0001",
"partnerSubjectId": "partner-ext-pt-0001",
"status": "accepted"
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid submission payload",
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"correlationId": "corr-example-1",
"details": {}
}
}{
"error": {
"code": "INVALID_API_KEY",
"message": "Invalid or expired API key",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"requestId": "<string>",
"correlationId": "<string>",
"details": "<unknown>"
}
}{
"error": {
"code": "IDEMPOTENCY_MISMATCH",
"message": "Idempotency-Key was already used with a different request body",
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"correlationId": "corr-example-1"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "Internal server error",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}canonical_submission_v1). Map your intake questionnaire and blood panel in your backend before calling this endpoint — see Canonical submission JSON and the Input Data Preparation Guide.
Request requirements
partnerIdmust equal the UUID of the PartnerCredential tied to your API key.- Include a non-empty
markers[]array with all 14 Health Yourself blood marker codes. - Structure questionnaire data under
subject(notmarkers.healthQuestionnaireMarkers). - Send
options.requestedOutputs(required) andoptions.requestedOutcomesfor the four HY wellbeing areas. - Provide
sourceMetadata.sourceTimestampfor when the intake was completed; optionalsourceMetadata.markerRangesfor lab reference intervals. - On every
POST, send non-emptyx-correlation-idandIdempotency-Keyheaders.
400 with field-level details — see Errors.
Top-level field reference
| Field | Required | Notes |
|---|---|---|
schemaVersion | Yes | canonical_submission_v1 |
partnerId | Yes | Partner credential UUID |
partnerSubmissionId | Yes | Your unique reference (max 512 characters) |
partnerSubjectId | Yes | De-identified subject reference |
subject | Yes | Demographics, measurements, history, family history |
markers | Yes | 14 blood observations (code, value, unit) |
options | Yes | requestedOutputs + requestedOutcomes |
sourceMetadata | Recommended | sourceTimestamp, markerRanges, lab metadata |
Health Yourself request example
curl -X POST "https://api.idunox.com/v1/submissions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <your-api-key>" \
-H "x-correlation-id: hy-2026-05-25-001" \
-H "Idempotency-Key: hy-submission-0001" \
-d @submission.json
submission.json:
{
"schemaVersion": "canonical_submission_v1",
"partnerId": "11111111-1111-4111-8111-111111111111",
"partnerSubmissionId": "hy-sub-0001",
"partnerSubjectId": "hy-pt-0001",
"sourceMetadata": {
"sourceSystem": "health-yourself-frontend",
"sourceTimestamp": "2026-04-20T09:00:00.000Z",
"labName": "Partner Central Lab",
"facilityId": "FAC-001",
"markerRanges": {
"ALBUMIN": { "unit": "g/L", "lowerBound": 35, "upperBound": 50 },
"ALT": { "unit": "U/L", "lowerBound": 7, "upperBound": 56 },
"ALP": { "unit": "U/L", "lowerBound": 44, "upperBound": 147 },
"AST": { "unit": "U/L", "lowerBound": 10, "upperBound": 40 },
"CALCIUM": { "unit": "mmol/L", "lowerBound": 2.1, "upperBound": 2.55 },
"CHOL": { "unit": "mmol/L", "lowerBound": 0.5, "upperBound": 5.2 },
"CYSTATIN_C": { "unit": "mg/L", "lowerBound": 0.61, "upperBound": 0.95 },
"GGT": { "unit": "U/L", "lowerBound": 9, "upperBound": 48 },
"HDL": { "unit": "mmol/L", "lowerBound": 1.0, "upperBound": 4.65 },
"CRP": { "unit": "mg/L", "lowerBound": 0.08, "upperBound": 3.0 },
"LDL": { "unit": "mmol/L", "lowerBound": 0.26, "upperBound": 3.3 },
"PHOSPHATE": { "unit": "mmol/L", "lowerBound": 0.8, "upperBound": 1.5 },
"URATE": { "unit": "µmol/L", "lowerBound": 155, "upperBound": 357 },
"HBA1C_MMOL_MOL": { "unit": "mmol/mol", "lowerBound": 20, "upperBound": 41 }
}
},
"subject": {
"demographics": {
"sexAtBirth": "female",
"ageYears": 52
},
"measurements": {
"weightKg": 72.4,
"heightCm": 168
},
"history": {
"overallHealth": "good",
"smoking": {
"status": "former",
"pastFrequency": "heavy",
"pastCigsPerDay": 12,
"startAge": 19,
"stopAge": 41
},
"conditions": {
"hasDiabetes": false,
"hasDementia": false,
"hasCardioCerebrovascular": false,
"hasLungCancer": false,
"hasKidneyDisease": false
},
"medications": {
"takesRegularMedication": true
}
},
"familyHistory": {
"father": {
"aliveStatus": "deceased",
"deathAge": 73,
"conditions": [
"alzheimer_disease",
"diabetes_mellitus",
"cardiovascular_disease",
"hypertension"
]
},
"mother": {
"aliveStatus": "alive",
"currentAge": 79,
"conditions": ["hypertension", "diabetes_mellitus"]
}
}
},
"markers": [
{ "code": "ALBUMIN", "value": 42, "unit": "g/L" },
{ "code": "ALT", "value": 28, "unit": "U/L" },
{ "code": "ALP", "value": 85, "unit": "U/L" },
{ "code": "AST", "value": 24, "unit": "U/L" },
{ "code": "CALCIUM", "value": 2.35, "unit": "mmol/L" },
{ "code": "CHOL", "value": 5.2, "unit": "mmol/L" },
{ "code": "CYSTATIN_C", "value": 0.95, "unit": "mg/L" },
{ "code": "GGT", "value": 32, "unit": "U/L" },
{ "code": "HDL", "value": 1.4, "unit": "mmol/L" },
{ "code": "CRP", "value": 1.2, "unit": "mg/L" },
{ "code": "LDL", "value": 3.1, "unit": "mmol/L" },
{ "code": "PHOSPHATE", "value": 1.1, "unit": "mmol/L" },
{ "code": "URATE", "value": 320, "unit": "µmol/L" },
{ "code": "HBA1C_MMOL_MOL", "value": 38, "unit": "mmol/mol" }
],
"options": {
"requestedOutputs": ["inference_score_v1", "json", "html"],
"requestedOutcomes": [
"wellbeing.cardiovascular",
"wellbeing.cognitive",
"wellbeing.renal",
"wellbeing.respiratory"
]
}
}
Accepted response (202)
{
"submissionId": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
"jobId": "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb",
"partnerSubmissionId": "hy-sub-0001",
"partnerSubjectId": "hy-pt-0001",
"status": "accepted",
"receivedAt": "2026-04-20T09:00:02.000Z"
}
submissionId. Poll GET /v1/submissions/{submissionId} or wait for the result.ready webhook, then call GET /v1/results/{resultId}.Authorizations
Plaintext API key issued for the tenant (stored hashed server-side).
Headers
Client-supplied correlation id for writes; bound to error logs and payloads where applicable.
1Client key for at-most-once submit semantics (24h scope). Reuse with the same body returns the same submissionId/jobId; reuse with a different body returns 409.
1Optional; echoed when possible. Server generates when absent.
Body
Canonical Type A ingestion JSON (canonical_submission_v1). At least one of markers or reportDocuments
must be non-empty (Zod superRefine). Cross-field smoking and family-history rules are Zod-only.
canonical_submission_v1 1 - 5121 - 512Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Optional partner extensions; keys scanned for disallowed direct identifiers. Rules enforced in Zod.
Response
Accepted — submission persisted; pipeline job enqueued
Partner-facing ingestion outcome for this endpoint. The persisted Submission.status
in PostgreSQL continues to reflect pipeline state (e.g. PROCESSING).
accepted