RECORDS ARE PUBLISHED REGULATORY ACTIONS. FIELDS THE ISSUING AUTHORITY DID NOT PUBLISH ARE MARKED AS NOT STATED, NEVER FILLED IN.
Drug Eye AfricaNational Actions, Continental Reach
Data

Using the data

All 755 records are open to read, one by one or a page at a time, with no account and no key. That is not a trial and it will not be withdrawn: a register nobody can cite is not doing its job, and the people this exists for — a pharmacist checking a batch, a regulator confirming what another authority did — should never have to ask anyone’s permission.

Taking a copy of the whole register is a different request, and that one we ask about. It is the work described on the about page: notices read, batch numbers pulled out of PDFs and checked, dates decoded, every source archived.

Free to consult, and we mean any of it. Every record, every field, every filter — up to 50 at a time and as far as the first 200 matches of a query, which is everything we hold for every country except Egypt. Beyond that, or as a single file, write to us. Institutions, researchers and authorities are exactly who it is for.

Endpoints

v1
GET /api/v1/notices?cc=ZM&action=recall&from=2026-01-01
Regulatory actions, filterable on every classification axis. Add format=csv for a spreadsheet.
GET /api/v1/notices/{alert_id}
One record with its batches, version history and context.
GET /api/v1/batches/WL25024
Batch lookup across every authority at once. The highest-intent query on the service.
GET /api/v1/manufacturers/{slug}
Every recorded action naming a manufacturer, continent-wide.
GET /api/v1/events/{slug}
Cross-border clusters with the propagation lag computed.
GET /api/v1/authorities · /api/v1/coverage
Reference data, including the coverage matrix as JSON.

Record shape

openFDA-aligned
{
  "alert_id": "DEA-KE-2026-0015",
  "cc": "KE",  "country": "KE",  "regulator": "PPB",
  "regulator_ref": "REC/2026/015",
  "date_published": "2026-07-20",
  "product_name": "Flazart",
  "inn": null,  "manufacturer": null,
  "batch_numbers": ["WL25024","WL25025","WL25026"],
  "action_type": "recall",
  "classification": null,
  "defect_category": null,
  "verification_tier": 1,
  "source_url": "https://web.pharmacyboardkenya.org/...",
  "no_published_notice_note": null,
  "source_archive_url": null,
  "source_archive_held": false,
  "source_sha256": null,
  "source_retrieved_at": null,
  "status": "active",  "version": 1,
  "publication_tier": "B",  "noindex": true
}

Nulls are returned, not omitted. A consumer can tell the difference between “the authority did not state this” and “we did not capture it”. Every record carries verification_tier, source_url, no_published_notice_note and source_archive_url, whatever their values.

source_archive_url is null unless the archived copy is on storage you can fetch. A copy on a machine you cannot reach is not evidence, and a path naming somebody’s home directory is not an address; the register does not publish one as though it were. Where a copy exists but is not yet reachable, source_archive_held is true and source_sha256 identifies it exactly.

Verification tiers

  • Tier 0 — entered and published by a named officer of the issuing regulator
  • Tier 1 — published by the regulator and captured by us
  • Tier 2 — confirmed to us by the authority, but not published by them
  • Tier 3 — reported by a named credible secondary source
  • Tier 4 — reported and unconfirmed, published as an open question

Publication tiers and indexing

A record reaches search engines only with a date, a product name, and either a batch number or a stated reason. Everything else is kept out of them until that is filled in — but it is stored, searchable and readable here from the moment it lands. Nothing is held back; it is only kept from being found by somebody who would read a half-finished record as the whole story.

Also here