# Medication and source change tracking

Synchronize your integration using /v1/changes, since and next_cursor without confusing source changes with regulatory conclusions.

Canonical: https://iabula.com/docs/en/changes

## 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.

```bash
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.

```bash
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.

> removed_from_source describes an observation missing from the compared source resource. It does not mean market withdrawal, registration cancellation or a clinical conclusion.

## 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.

- [Errors and limits](https://iabula.com/docs/en/errors)
- [CMED data and provenance](https://iabula.com/docs/en/provenance)

## 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 |

## Resources

- [OpenAPI JSON](https://iabula.com/openapi.json)
- [Swagger](https://iabula.com/docs/swagger)
- [Documentation index](https://iabula.com/llms.txt)
