Oson Apteka APIosonapteka.uz ↗
Query pharmacy prices, addresses, and stock availability across all Uzbekistan regions and districts via the Oson Apteka API. 3 endpoints.
What is the Oson Apteka API?
The Oson Apteka API provides access to pharmacy offer data across Uzbekistan through 3 endpoints covering location discovery and live medicine listings. The get_medicine_offers endpoint returns price in UZS, pharmacy address, landmark, working hours, and availability status for any product slug, filterable by country, region, district, or city. The list_regions and list_districts endpoints supply the stable slugs and IDs needed to narrow any offer query to a specific location.
curl -X GET 'https://api.parse.bot/scraper/03037c03-3412-482b-b362-b99fe5837e54/list_regions?language=ru' \ -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 osonapteka-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: find pharmacies selling a medicine in Uzbekistan, narrowing by region and district."""
from parse_apis.osonapteka_uz_api import OsonApteka, Language, InputNotFound
client = OsonApteka()
# List all supported regions and pick the first non-country entry.
region = client.locations.list(language=Language.RU, limit=5).first()
if region is None:
raise SystemExit("no regions returned")
print(f"Region: {region.name} (slug={region.slug}, type={region.type})")
# Drill into its districts via the sub-resource.
for district in region.districts.list(limit=3):
print(f" District: {district.name} (slug={district.slug})")
# Search for a medicine's full availability page in that region.
# The typed Availability wrapper exposes product metadata alongside offers.
try:
result = client.offers.search(product_id="kordaron-tab-200mg-30-x-DXB-P", region=region.slug)
except InputNotFound:
raise SystemExit("product not found")
print(f"Product: {result.product.name} by {result.product.brand}")
print(f"Price range: {result.product.min_price_uzs}–{result.product.max_price_uzs} UZS")
print(f"Total offers: {result.total_offers}, pages: {result.total_pages}")
# Iterate paginated offers for the same product, capped to 10 items.
for offer in client.offers.list(product_id="kordaron-tab-200mg-30-x-DXB-P", region=region.slug, limit=10):
print(f" {offer.pharmacy_name}: {offer.price_uzs} {offer.currency} — {offer.address}")
print("exercised: locations.list / districts.list / offers.search / offers.list")
Returns every top-level location Oson Apteka supports: the country-wide pseudo-region (type country, meaning all of Uzbekistan), the 12 regions (viloyats), Tashkent city (type city) and the Republic of Karakalpakstan (type republic). One round trip; names are returned in the requested language. The slug (or id, or exact name) of any entry except the country-wide one is accepted as the region input of list_districts and get_medicine_offers.
| Param | Type | Description |
|---|---|---|
| language | string | Language of returned location names. |
{
"type": "object",
"fields": {
"total": "number of regions returned",
"regions": "array of location records: id (integer), slug (string, stable identifier), name, type (country|region|city|republic), parent_region_id/slug/name (null for the country-wide entry)",
"language": "language code the names are in"
},
"sample": {
"data": {
"total": 15,
"regions": [
{
"id": 21,
"name": "По всему Узбекистану",
"slug": "ozbekiston-boylab",
"type": "country",
"parent_region_id": null,
"parent_region_name": null,
"parent_region_slug": null
},
{
"id": 1,
"name": "Ташкент",
"slug": "toshkent",
"type": "city",
"parent_region_id": 21,
"parent_region_name": "По всему Узбекистану",
"parent_region_slug": "ozbekiston-boylab"
},
{
"id": 2,
"name": "Самарканд",
"slug": "samarqand",
"type": "region",
"parent_region_id": 21,
"parent_region_name": "По всему Узбекистану",
"parent_region_slug": "ozbekiston-boylab"
}
],
"language": "ru"
},
"status": "success"
}
}About the Oson Apteka API
Location Coverage
The list_regions endpoint returns all top-level locations Oson Apteka supports: a country-wide pseudo-region (type country), 12 viloyats (type region), Tashkent city (type city), and the Republic of Karakalpakstan (type republic). Each record includes an integer id, a stable slug, a human-readable name, and type. The optional language parameter controls the language of returned names and applies across all three endpoints.
District Discovery
list_districts resolves one region from list_regions — identified by slug, numeric id, or exact name — and returns all child districts and cities within it. Each district record carries id, slug, name, type (district or city), and parent region fields (parent_region_id, parent_region_slug, parent_region_name). The result_status field is ok when districts were found and no_results otherwise, making it safe to use for programmatic checks.
Medicine Offers
get_medicine_offers requires a product_id (the last path segment of an osonapteka.uz product URL) and returns a product record with name, brand, manufacturer, dosage form, and package size as written by the site. The offers array is sorted by price ascending and contains up to 5 entries per page (page_size is always 5). Each offer exposes pharmacy_id, pharmacy_name, price_uzs, currency (always UZS), address, landmark, region, district, availability, and last_updated. Location filtering uses the most specific supplied parameter — district over city over region — or defaults to all of Uzbekistan when none are provided. Pagination is handled via page, total_pages, total_offers, and has_more.
The Oson Apteka API is a managed, monitored endpoint for osonapteka.uz — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when osonapteka.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 osonapteka.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 medicine prices across Tashkent pharmacies using price_uzs from get_medicine_offers
- Build a district-level pharmacy locator using address and landmark fields
- Track working hours and availability across regions for a specific drug
- Aggregate offer counts by region to map medicine availability across Uzbekistan
- Monitor last_updated timestamps to detect price changes over time
- Populate location pickers in a health app using list_regions and list_districts slugs
- Find the cheapest in-stock pharmacy for a product in a given viloyat
| 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 Oson Apteka have an official developer API?+
What does get_medicine_offers return, and how do I restrict results to one district?+
district parameter to restrict results to that district. If you also pass region, the district value takes precedence.How many offers are returned per page, and how do I paginate?+
page parameter (1-based) to step through results. The response includes total_pages, total_offers, offers_on_page, and has_more so you can determine when you have fetched all available offers.Does the API return medicine reviews, ratings, or detailed drug interaction data?+
Can I search for a medicine by name instead of product slug?+
get_medicine_offers requires a product_id which is the slug from the product's URL on osonapteka.uz (for example, kordaron-tab). Free-text name search is not an input parameter in any of the three endpoints. You can fork this API on Parse and revise it to add a search-by-name endpoint.