Discover/Oson Apteka API
live

Oson Apteka APIosonapteka.uz ↗

Query pharmacy prices, addresses, and stock availability across all Uzbekistan regions and districts via the Oson Apteka API. 3 endpoints.

Endpoint health
verified 33m ago
list_regions
list_districts
get_medicine_offers
3/3 passing latest checkself-healing
Endpoints
3
Updated
2h ago

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.

This call costs1 credit / call— charged only on success
Try it
Language of returned location names.
→ api.parse.bot/scraper/03037c03-3412-482b-b362-b99fe5837e54/<endpoint>
Ready to send
Fill in the parameters and hit sign in to send to see live response data here.
Call it over HTTPgrab a free API key at signup
curl -X GET 'https://api.parse.bot/scraper/03037c03-3412-482b-b362-b99fe5837e54/list_regions?language=ru' \
  -H 'X-API-Key: $PARSE_API_KEY'
Python SDK · recommended

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")
All endpoints · 3 totalmissing one? ·

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.

Input
ParamTypeDescription
languagestringLanguage of returned location names.
Response
{
  "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.

Reliability & maintenanceVerified

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.

Last verified
33m ago
Latest check
3/3 endpoints passing
Maintenance
Monitored & self-healing
Will this API break when the source site changes?+
It's built not to. Every endpoint is health-checked on a schedule with automated test probes. When the source site changes and a check fails, the API is automatically queued for repair and re-verified — that's the self-healing layer. Each API page shows when its endpoints were last verified. And because marketplace APIs are shared, any fix reaches everyone using it.
Is this an official API from the source site?+
No — Parse APIs are independent, managed REST wrappers over publicly available data. That is the point: where a site has no official API (or only a limited one), Parse gives you a maintained, monitored endpoint for that data and keeps it working as the site changes — so you get a stable contract over a source that never promised one.
Can I fix or extend this API myself if I need a new endpoint or field?+
Yes — and you don't have to wait on us. This API was generated by the Parse agent, which stays attached. Describe the change in plain English ("add an endpoint that returns reviews", "fix the price field") in the revise box on the API page or via the revise_api MCP tool, and the agent rebuilds it against the live site in minutes. Contributing the change back to the public API is free.
What happens if I call an endpoint that has an issue?+
Errors are machine-readable: a bad call returns a clean status with the list of available endpoints and a repair hint, so an agent (or you) can recover or trigger a fix instead of failing silently. Confirmed failures feed the automatic repair queue.
Common use cases
  • 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
Pricing & limitsSee full pricing →
TierPriceCredits/monthRate limit
Free$0/mo2005 req/min
Hobby$30/mo1,00020 req/min
Developer$100/mo5,000100 req/min
Team$300/mo20,000300 req/min
Company$1,000/mo100,000500 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.

Frequently asked questions
Does Oson Apteka have an official developer API?+
Oson Apteka does not publish a documented public developer API. This API provides structured access to the data available on osonapteka.uz.
What does get_medicine_offers return, and how do I restrict results to one district?+
The endpoint returns a product catalogue record (name, brand, manufacturer, dosage form, package size) plus an array of pharmacy offers sorted by price ascending. Each offer includes pharmacy name, price in UZS, address, landmark, region, district, availability, and last_updated. Pass a district slug, numeric id, or exact name to the 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?+
The API always returns 5 offers per page. Use the 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?+
Not currently. The API covers pharmacy availability, pricing, addresses, working hours, and basic catalogue fields (brand, manufacturer, dosage form, package size). Reviews, ratings, and clinical drug data are not part of any endpoint response. You can fork this API on Parse and revise it to add an endpoint that captures those fields if they become available on the source.
Can I search for a medicine by name instead of product slug?+
Not currently. 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.
Page content last updated . Spec covers 3 endpoints from osonapteka.uz.
Related APIs in HealthcareSee all →