Read published changes#
GET /v1/changes returns published events with data and next_cursor. Omit since on the first request. limit accepts 1–100, default 50. Ordering by occurred_at and UUID provides stable pagination of available history.
curl --fail-with-body --get "$IABULA_API_BASE/v1/changes" \
--header "X-API-Key: $IABULA_API_KEY" \
--data-urlencode "limit=50"Continue with since#
Send the returned next_cursor as since on the next request. Keep the cursor after an empty data list so polling can resume later. Do not reuse search cursors here. Persist a cursor only after successfully processing its events.
curl --fail-with-body --get "$IABULA_API_BASE/v1/changes" \
--header "X-API-Key: $IABULA_API_KEY" \
--data-urlencode "since=$IABULA_CURSOR" \
--data-urlencode "limit=50"An observed change is not a clinical conclusion#
Canonical events use created, updated or withdrawn. Source comparisons may use observed_in_source, changed_in_source and removed_from_source. Interpretation depends on entity_type, before, after and evidence.
Defensive synchronization#
Use the event ID to prevent duplicate processing in your integration. Inspect source evidence, version, URL, source_record_id and source_run_id when available. Delivery uses HTTP polling; V1 does not document change webhooks.
GET /v1/changes#
| Parameter | Location | Required | Type and bounds |
|---|---|---|---|
| since | query | no | string; maxLength=2048 | null |
| limit | query | no | integer; minimum=1, maximum=100, default=50 |
| HTTP | Content-Type | Schema |
|---|---|---|
| 200 | application/json | ChangePage |
| 400 | application/json | Problem |
| 401 | application/json | Problem |
| 403 | application/json | Problem |
| 429 | application/json | Problem |
| 500 | application/json | Problem |
| 503 | application/json | Problem |
| 422 | application/json | HTTPValidationError |
OpenAPI contract fields#
| Schema.field | Type and bounds | Required |
|---|---|---|
| ChangeEvidence.class | string | yes |
| ChangeEvidence.source | string | null | no |
| ChangeEvidence.dataset | string | null | no |
| ChangeEvidence.retrieved_at | string (date-time) | null | no |
| ChangeEvidence.source_version | string | yes |
| ChangeEvidence.source_record_id | string | null | no |
| ChangeEvidence.source_run_id | string | null | no |
| ChangeEvidence.attribute | string | null | no |
| ChangeEvidence.rule_version | string | null | no |
| ChangeEvidence.source_url | string | yes |
| ChangePage.data | array<ChangeRecord> | yes |
| ChangePage.next_cursor | string | null | yes |
| ChangeRecord.id | string (uuid) | yes |
| ChangeRecord.entity_type | string | yes |
| ChangeRecord.entity_id | string (uuid) | yes |
| ChangeRecord.operation | string: created, updated, withdrawn, observed_in_source, changed_in_source, removed_from_source | yes |
| ChangeRecord.before | object | null | no |
| ChangeRecord.after | object | null | no |
| ChangeRecord.occurred_at | string (date-time) | yes |
| ChangeRecord.evidence | ChangeEvidence | yes |
| HTTPValidationError.detail | array<ValidationError> | no |
| Problem.type | string | yes |
| Problem.title | string | yes |
| Problem.status | integer | yes |
| Problem.code | string | yes |
| Problem.detail | string | null | no |
| Problem.request_id | string | yes |
| ValidationError.loc | array<string | integer> | yes |
| ValidationError.msg | string | yes |
| ValidationError.type | string | yes |
| ValidationError.input | object | no |
| ValidationError.ctx | object | no |