Kenya PPB Registered Products (Medicines, Devices)
Pricing
from $1.00 / 1,000 product registrations
Kenya PPB Registered Products (Medicines, Devices)
Kenya Pharmacy and Poisons Board public registers as English-keyed JSON: registered medicines, food supplements, medical devices and herbals with registration number, product, active ingredients, form, country, holder, local representative and ISO registration and expiry dates.
Pricing
from $1.00 / 1,000 product registrations
Rating
0.0
(0)
Developer
Aloever Dulay
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
0
Monthly active users
16 days ago
Last modified
Categories
Security
Limited permissionsShare
Kenya PPB Registered Products Actor (Medicines, Food, Devices, Herbals)
The public product registers of the Pharmacy and Poisons Board (PPB) of Kenya, read from products.pharmacyboardkenya.org, as clean, English-keyed JSON: registration number, product name, active ingredients, dosage form, country of origin, marketing authorisation holder, local technical representative or manufacturer, and ISO registration and expiry dates.
Four registers, about 17,300 rows on 2026-10-11:
list | Register | Rows |
|---|---|---|
medicines | Registered medicines (the retention register) | 3,273 |
food | Food supplements and nutritional products | 12,754 |
devices | Retained medical devices (the 2026 retention list) | 1,246 |
herbals | Registered herbal products | 21 |
Who needs this
- Pharmacies, distributors, importers and e-pharmacies checking that a product is registered in Kenya, who holds the registration and when it expires.
- Pharmaceutical and device companies and their local technical representatives watching new registrations, competitors' portfolios and upcoming expiries.
- Hospitals, insurers, procurement and tender teams verifying products and suppliers against the regulator's register.
- Regulatory-affairs consultants, researchers and journalists studying what is registered in Kenya, from which countries and by which companies.
- AI agents and automations that need a stable schema instead of a paged admin grid.
Input
| Field | Type | Default | Description |
|---|---|---|---|
list | string | "medicines" | medicines, food, devices or herbals. |
productName | string | "" | Trade name contains this text, any case (panadol, oximeter). |
activeIngredient | string | "" | Active ingredient column contains this text (cefixime). Medicines and food. |
registrationNumber | string | "" | Registration number contains this text (H2026/CTD13447, MD/2026/001). Medicines and devices. |
company | string | "" | Part of a company name: holder or local technical representative (medicines), holder or manufacturing site (food), manufacturer or local representative (devices), manufacturer (herbals). |
country | string | "" | Country of origin contains this text (India). Medicines, food and herbals. |
registeredSince | string | "" | Registered on or after this date (YYYY-MM-DD). Devices and herbals publish only a year, so that whole year matches. Not food. |
expiringBefore | string | "" | Medicines whose registration expires before this date (YYYY-MM-DD). |
maxItems | integer | 100 | Stop after this many rows (1-20,000). |
proxyConfiguration | object | no proxy | Optional Apify Proxy, if the site is unreachable from Apify's network. |
Filters combine with AND. The site's search takes one text per request, so the actor sends
it the most selective filter (registration number, then product name, ingredient, company,
country) and checks the others on each row it reads. A filter the chosen register does not
publish (for example activeIngredient on devices) stops the run with a clear message
instead of returning nothing.
Order. Medicines come newest registration first. With expiringBefore and no
registeredSince, they come soonest expiry first. Food, devices and herbals come in
the register's own record order, highest record ID (newest record) first.
Date filters stop early. The actor reads medicines one registration year at a time,
newest first, so registeredSince: "2025-07-01" reads 2026 and 2025 and stops; and one
expiry year at a time for expiringBefore. A whole register fits in the default
300-second run timeout.
Output
One dataset item per register row. Keys are English and shared across registers where they
mean the same thing; a register's items leave out the fields it does not publish. Names
are kept exactly as the register prints them (HTML entities decoded, whitespace tidied),
dates are ISO (YYYY-MM-DD), years are numbers. The Output tab on this page documents
every field, with one table view per register.
A real medicines item (2026-10-11):
{"list": "medicines","registrationNumber": "H2026/CTD13447/29671","productName": "ACECOR GEL","activeIngredients": ["ACECLOFENAC"],"dosageForm": "Gel","countryOfOrigin": "India","localOrForeign": "Foreign","marketingAuthorizationHolder": "SIGNATURE HEALTHCARE LIMITED","localTechnicalRepresentative": "SIGNATURE HEALTHCARE LTD","registeredAt": "2026-09-29","expiresAt": "2031-09-29","sourceUrl": "https://products.pharmacyboardkenya.org/ppb_admin/pages/public_view_retention_products.php","fetchedAt": "2026-10-11T22:35:13.238Z"}
A real food item:
{"list": "food","sourceId": "15080","productName": "Fitfizz Immuno D","activeIngredients": ["Vitamin C", "Zinc", "Vitamin D3"],"strength": "Vitamin C 1000 mg + Zinc 10 mg 400 IU","dosageForm": "Effervescent Tablet","route": "Oral","countryOfOrigin": "India","localOrForeign": "Foreign","marketingAuthorizationHolder": "MAXIM PHARMACEUTICALS LIMITED","manufacturer": "VITAEGISS WELLNESS PVT. LTD","humanOrVet": "Human","applicationType": "New/Innovator","packaging": "1 Tube of 20 Effervescent Tablets","shelfLife": null,"approved": true,"sourceUrl": "https://products.pharmacyboardkenya.org/ppb_admin/pages/public_view_food.php","fetchedAt": "2026-10-11T22:35:40.694Z"}
A real medical device item:
{"list": "devices","sourceId": "21227","registrationNumber": "MD/2026/001","productName": "PULSE OXIMETER","manufacturer": "SHENZHEN MINDRAY BIO-MEDICAL ELECTRONICS CO., LTD","localTechnicalRepresentative": "MEDIGLOBE SOLUTIONS LIMITED","registrationYear": 2026,"retentionYear": 2026,"licenceStatus": "VALID","sourceUrl": "https://products.pharmacyboardkenya.org/ppb_admin/pages/public_view_md_retained.php","fetchedAt": "2026-10-11T22:35:27.147Z"}
A real herbal item:
{"list": "herbals","sourceId": "153","productName": "EUGICA IVY SYRUP","countryOfOrigin": "THAILAND","manufacturer": "MEGA LIFESCIENCEC PUBLIC COMPANY LIMITED","registrationYear": 2024,"sourceUrl": "https://products.pharmacyboardkenya.org/ppb_admin/pages/public_view_herbal.php","fetchedAt": "2026-10-11T22:36:34.485Z"}
Notes on the fields:
- Active ingredients are the register's "Inn Of Api" text split at commas, semicolons,
+,&and the word "and". Food rows often leave it blank ([]). - Cut values. The register itself cuts long text at about 50 characters and marks it
with
…(for example"KETOCONAZOLE 2%, ZINC PYRITHIONE 1% & ALOE VERA…"). The actor keeps the mark, so you can see where text is incomplete. - sourceUrl is the register's public page. Its rows load through a form the page posts, so the link opens the register, not the row.
Pricing
Pay per event:
| Event | Charged for |
|---|---|
product-record | Each register row stored in the dataset. |
Apify's standard run-start event covers starting the actor. Rows are stored first and charged after, so you never pay for data you did not receive. When your spending limit runs out, the run stops cleanly and never stores an unpaid row.
Data source and politeness
- Source: the Pharmacy and Poisons Board's public register pages under
https://products.pharmacyboardkenya.org/ppb_admin/pages/(public_view_retention_products.php,public_view_food.php,public_view_md_retained.php,public_view_herbal.php), linked from the Board's website. Each is a data grid; the actor loads the page, then asks the grid for rows the way the page's own buttons do (up to 1,000 rows per request), sending back the one-time key each answer carries. No login, no captcha. TLS certificates are always verified. - robots.txt: the register host has none; the Board's main site
(web.pharmacyboardkenya.org) disallows only
/wp-admin/. The actor still- waits at least 1.5 seconds after each request ends before the next one starts (retries and session renewals included; a constant, not an input),
- uses one connection, one request at a time,
- identifies itself honestly as
ke-ppb-actor/0.1 (+https://apify.com/a-g-d/ke-ppb), - asks only for the rows it needs: 20 newest medicines take 4 requests.
- Measured on 2026-10-11: 20 newest medicines in 8 s (4 requests); 200 in 7 s; the whole medicines register (3,273) in 17 s (9 requests, 165 KB on the wire); 100 food rows in 3 s (2 requests); the whole food register (12,754) in 36 s (14 requests, about 85 KB per 1,000-row page); 300 devices in 4 s.
- Resilience: connection errors, timeouts, HTTP 5xx and 429, and answers that are not a register grid are retried with exponential backoff and jitter inside a run-wide budget (90 s of backoff). If the grid's key or session expires, the actor reloads the page once and repeats the same request; a second refusal, an HTTP 403/404, a challenge page or a changed grid layout stops the run with a clear message rather than working around it.
- Terms: the Board's terms page carries a disclaimer, a cookie and server-log notice and "Copyright © 2026 Pharmacy and Poisons Board. All Rights Reserved."; nothing about automated access. The registers are published so the public can check products. Check the Board's terms for your own use of the data.
Data and privacy
The registers publish product and company data: registered products, the companies that hold, make or represent them, and dates. The actor outputs only the fields listed above.
- Company fields are output as the register publishes them, but without addresses
or contact details. In the food register (230 of 12,754 rows on 2026-10-11) and a few
medicines (77) and device (17) rows, a company column carries the company's postal or
street address after its name ("Four Life Research Africa Limited P.O Box 23433…",
"LABOREX KENYA LTD-MOMBASA ROAD"). The actor keeps the name and drops the address; a
value that is only an address becomes
null. Any e-mail address or phone number is dropped the same way (none appeared on 2026-10-11), and free-text fields (strength,packaging) that contain one becomenull. - The food register's "Visual Description" (what the product looks like) is not collected.
- People named as companies. The register sometimes names a natural person as marketing authorisation holder (an individual is listed as holder of a cream made in India). The actor outputs the name as the regulator publishes it on its public register. Kenya's Data Protection Act, 2019 applies to personal data you store: use the data for the purpose it is published for, checking products and their registrations.
Limitations
- Cut text. Long names, ingredients and company names arrive cut at about 50 characters (see Output). The site's search sees the full value, so a search still finds text beyond the cut, but other filters checked by the actor see only the shown part.
- No detail pages. The registers have no per-product page the actor could read (the food grid's "view" button is one request per row and is not used), so the fields are the grid's columns.
- Food has no dates; devices and herbals have only years.
registeredSinceandexpiringBeforesay which registers they apply to. - Which products are listed is the register's choice. The medicines list is the retention register (currently valid registrations, 2021-2026 on 2026-10-11); the device list is the 2026 retention list.
- A run is a snapshot. Rows added while a long run pages through a register belong to the next run; a row seen twice is stored once.
- Search wildcards. The site's search treats
%and_as wildcards; when your text contains them, the actor checks the rows itself.