apteka APIapteka.uz ↗
Search the apteka.uz medicine catalogue and retrieve real-time pharmacy offers, prices, and pickup/delivery availability across Tashkent pharmacies.
What is the apteka API?
The apteka.uz API covers 2 endpoints that expose Uzbekistan's largest online pharmacy catalogue: search the full medicine database by name or active ingredient via search_medicines, then pull every current pharmacy offer — price in UZS, pickup and delivery flags, booking URL, and district location — for a specific product via get_medicine_offers. Responses include parsed dosage, package size, manufacturer, country of origin, and per-offer pharmacy address for Tashkent.
curl -X GET 'https://api.parse.bot/scraper/5fb54a06-f6de-49b3-b4b1-1ff1b5c6204c/search_medicines?query=paracetamol' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace apteka-uz-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: search medicines on apteka.uz, then fetch pharmacy offers."""
from parse_apis.apteka_uz_api import AptekaUz, OfferSort, MedicineNotFound
client = AptekaUz()
# Search the catalogue for paracetamol products.
for med in client.medicines.search(query="paracetamol", limit=5):
print(med.name, med.slug, med.min_price, med.availability)
# Drill into the first hit to see pharmacy-level offers sorted by price.
hit = client.medicines.search(query="paracetamol", limit=1).first()
if hit is not None:
try:
listing = hit.offers(sort=OfferSort.PRICE)
except MedicineNotFound:
print("medicine no longer listed")
else:
print(f"{listing.medicine.name}: {listing.total_offers} offers, cheapest {listing.min_price} UZS")
for offer in listing.offers[:3]:
print(f" {offer.pharmacy_name} — {offer.price} {offer.currency}, {offer.pharmacy_address}")
print("exercised: medicines.search / offers / OfferSort / MedicineNotFound")
Searches the apteka.uz medicine catalogue by name (brand, generic or active ingredient; Latin or Cyrillic spelling as the site accepts) and returns one row per medicine product (a specific dosage, form, package and manufacturer). Each row carries the catalogue summary: name, parsed dosage and package size (null when the name does not contain them), dosage form, manufacturer, country, availability flag, number of Tashkent pharmacies stocking it, the lowest listed price in UZS (min_price, min_price_order for online order, min_price_booking for reservation; null when no pharmacy lists it), the product page URL and the slug accepted by get_medicine_offers. Results are paginated with page/per_page (per_page is clamped to 100); total and total_pages come from the site. An unknown name returns an empty results list with total 0. One upstream request per call.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based result page. |
| queryrequired | string | Medicine name or active ingredient to search for, e.g. one shape is 'paracetamol'. |
| per_page | integer | Results per page; values above 100 are clamped to 100. |
{
"type": "object",
"fields": {
"page": "current page number",
"query": "echo of the search term",
"total": "total matching medicines reported by the site",
"results": "array of medicine summaries: id, slug (input for get_medicine_offers), name, brand_name, dosage (parsed from name, nullable), dosage_form, package_size (units per pack parsed from name, nullable), manufacturer, country, active_ingredients, drug_group, availability ('available'/'not_available'), is_purchasable, over_the_counter, pharmacy_count, min_price/min_price_order/min_price_booking in UZS (nullable), currency, product_url",
"has_more": "true when a later page exists",
"per_page": "page size applied",
"total_pages": "number of pages at this per_page"
},
"sample": {
"data": {
"page": 1,
"query": "paracetamol",
"total": 114,
"results": [
{
"id": 59823,
"name": "PARASETAMOL tabletkalari 500mg N10",
"slug": "paratsetamol-tabletki-500-mg-10sht-3797",
"dosage": "500mg",
"country": "Rossiya Federatsiyasi",
"currency": "UZS",
"min_price": 2000,
"brand_name": "PARASETAMOL",
"drug_group": "Paratsetamol",
"dosage_form": "Tabletkalar",
"product_url": "https://apteka.uz/uz/offer/paratsetamol-tabletki-500-mg-10sht-3797",
"availability": "available",
"manufacturer": "Dalximfarm, OAO",
"package_size": 10,
"is_purchasable": true,
"pharmacy_count": 33,
"min_price_order": 2000,
"over_the_counter": false,
"min_price_booking": 3000,
"active_ingredients": [
"Parasetamol"
]
}
],
"has_more": true,
"per_page": 5,
"total_pages": 23
},
"status": "success"
}
}About the apteka API
Medicine Search
The search_medicines endpoint accepts a query string (brand name, generic name, or active ingredient in Latin or Cyrillic script) and returns a paginated catalogue. Each result row includes id, slug, name, brand_name, dosage (parsed from the product name, nullable), package_size, manufacturer, country, and category. The slug field is the key input for the second endpoint. Pagination is controlled by page and per_page (capped at 100); the response includes total, total_pages, and has_more to support full traversal.
Pharmacy Offers
The get_medicine_offers endpoint takes a slug and returns the medicine's detail header alongside an offers array. Each offer carries price (in UZS), currency, has_pickup, has_delivery, booking_url (nullable), offer_name, and the pharmacy's name, address, and parsed district. The response also surfaces min_price across all returned offers — useful for price comparison without iterating the full array.
Filtering and Sorting Offers
Offers can be filtered by offer_type to restrict results to pharmacies that support pickup or delivery (omitting this param includes listing-only pharmacies without a booking option). The district param does case-insensitive text matching against the pharmacy address, so passing a Tashkent district name like Yunusobod narrows results geographically. A sort param controls offer ordering. The response reports both total_offers (site-reported count before district filtering) and returned_offers (count after the district filter is applied).
Coverage Scope
All pharmacy offers are scoped to Tashkent city. The city field is always Toshkent; finer granularity comes from the district parsed from each pharmacy's address, which may be null for some listings. Product data such as manufacturer country and category reflect what apteka.uz catalogues for Uzbekistan's market.
The apteka API is a managed, monitored endpoint for apteka.uz — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when apteka.uz changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official apteka.uz API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Compare current UZS prices for a generic drug across all Tashkent pharmacies using
min_priceand theoffersarray. - Filter pharmacy offers by Tashkent district to surface the nearest pickup location for a given medicine.
- Build a delivery-only drug availability checker using the
offer_typefilter andhas_deliveryflag. - Track price changes over time for a specific slug by polling
get_medicine_offerson a schedule. - Map Tashkent pharmacy locations for a specific medicine using the address and district fields from each offer.
- Catalogue Uzbekistan medicines by manufacturer or country using fields returned by
search_medicines. - Identify which pharmacies offer a booking URL for a given medicine using the nullable
booking_urlfield.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does apteka.uz have an official developer API?+
What does get_medicine_offers return and how can I filter results?+
district parameter (case-insensitive text match on the address) and the offer_type parameter to restrict to pharmacies that support pickup or delivery.Are pharmacy offers available outside Tashkent?+
city field is always Toshkent. District-level granularity is parsed from pharmacy addresses and may be null for some listings. You can fork this API on Parse and revise it if apteka.uz extends coverage to other Uzbekistan cities.Does the API return patient reviews or ratings for medicines?+
How does pagination work in search_medicines?+
page and per_page. The per_page value is clamped to a maximum of 100. The response includes total, total_pages, and has_more, so you can determine how many pages exist and iterate through them programmatically.