bdtender APIbdtender.com ↗
Access Bangladesh tender listings, categories, organizations, and locations via 8 endpoints. Search live tenders, filter by district, and get today's publications.
What is the bdtender API?
The bdtender.com API provides access to Bangladesh's largest tender portal through 8 endpoints covering search, detail lookup, and reference data. The search_tenders endpoint accepts filters for keyword, category, organization, location, date range, and advertisement type, returning paginated results with tender codes, work descriptions, issue dates, and submission deadlines. Companion endpoints expose the full hierarchical trees for categories, organizations, and districts.
curl -X POST 'https://api.parse.bot/scraper/7d257fbc-af8e-4f78-8464-7c2e39b12b26/search_tenders' \
-H 'X-API-Key: $PARSE_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"page": "1",
"query": "construction",
"date_to": "18/07/2026",
"adv_type": "Goods",
"date_from": "11/06/2026"
}'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 bdtender-com-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.
from parse_apis.bdtender_api import BDTender, AdvertisementType, TenderNotFound
bdtender = BDTender()
# Get site-wide statistics
stats = bdtender.sitestatisticses.get()
print(stats.live_tenders, stats.published_today)
# Search for tenders filtered by advertisement type
for tender in bdtender.tenders.search(query="construction", adv_type=AdvertisementType.WORKS):
print(tender.tendercode, tender.workdesc, tender.tendersource, tender.issudate)
break
# List all categories for filter discovery
for category in bdtender.categories.list():
print(category.id, category.text, category.parent)
break
# List organizations
for org in bdtender.organizations.list():
print(org.id, org.text)
break
# List locations
for loc in bdtender.locations.list():
print(loc.id, loc.text)
break
# Get live tenders
for tender in bdtender.tenders.list_live():
print(tender.tendercode, tender.workdesc, tender.tsubmissiondate)
break
# Get today's publications
for tender in bdtender.tenders.list_published_today():
print(tender.tendercode, tender.workdesc)
break
# Get detail for a specific tender
detail = bdtender.tenders.get(tender_id="11525191")
print(detail.tendercode, detail.workdesc, detail.advertisement_types, detail.note)
Full-text search over Bangladesh tender listings. Supports filtering by keyword, category, organization, location, date range, and advertisement type. Returns paginated results with tender code, description, dates, source, and advertisement types. Note: category, organization, location, and advertisement type filters may return reduced results for unauthenticated access.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination. |
| query | string | Search keyword or tender ID to match against work descriptions. |
| date_to | string | End date filter in DD/MM/YYYY format. |
| adv_type | string | Advertisement type filter. |
| category | string | Category ID from get_categories endpoint (e.g. 'T1', 'T2'). |
| location | string | Location ID from get_locations endpoint (e.g. 'DDist-02'). |
| date_from | string | Start date filter in DD/MM/YYYY format. |
| organization | string | Organization ID from get_organizations endpoint (e.g. 'DG62'). |
{
"type": "object",
"fields": {
"data": "array of tender objects with tendercode, workdesc, issudate, tsubmissiondate, status, tendersource, advertisement_types, categories, organizations, locations",
"total": "integer total number of matching tenders",
"last_page": "integer total number of pages",
"current_page": "integer current page number"
},
"sample": {
"data": {
"data": [
{
"status": "",
"issudate": "11/06/2026",
"workdesc": "A# Ground Floor Collapsible gate and Grill. B# Supplying Sewing Machine.",
"locations": [
"Login to view"
],
"categories": [
"Login to view"
],
"tendercode": "11525191",
"tendersource": "Protidiner Bangladesh",
"organizations": [
"Login to view"
],
"tsubmissiondate": "14/06/2026",
"advertisement_types": [
"Goods",
"Works"
]
}
],
"total": 25643,
"last_page": 2565,
"current_page": 1
},
"status": "success"
}
}About the bdtender API
What the API Covers
The bdtender.com API surfaces tender listings from Bangladesh's central procurement portal. The search_tenders endpoint accepts up to seven filter parameters simultaneously — query, category, organization, location, date_from, date_to, and adv_type — and returns paginated results including tendercode, workdesc, issudate, tsubmissiondate, status, tendersource, and advertisement_types. The get_live_tenders endpoint returns all currently active tenders in the same structure without requiring any filter arguments.
Reference Data Endpoints
Three dedicated endpoints provide the valid filter values needed for precise searching. get_categories returns a hierarchical tree of tender categories (e.g. T1, T2) with id, parent, and text fields. get_organizations returns the full tree of government departments and agencies using the same node shape, with IDs such as DG62. get_locations covers districts and upazilas with IDs like DDist-02. All three trees are returned as flat arrays with parent references, so you can reconstruct hierarchy on the client side.
Tender Detail and Today's Activity
get_tender_detail accepts a tender_id string and returns the basic listing fields — workdesc, issudate, tsubmissiondate, status, tendersource, and advertisement_types — along with a note regarding authentication requirements for full tender documents on the source portal. get_tenders_published_today returns only tenders published on the current calendar date in Bangladesh Standard Time (UTC+6), and may return an empty list early in the day before any notices appear.
Site Statistics
get_site_statistics returns four aggregate counts: Live Tenders, Private Tenders, Corrigendum, and Published Today. These are string-typed counts reflecting the current state of the portal and are useful for dashboards or health checks.
The bdtender API is a managed, monitored endpoint for bdtender.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when bdtender.com 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 bdtender.com 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?+
- Monitor new Bangladesh government procurement opportunities daily using
get_tenders_published_today - Filter tenders by district using location IDs from
get_locationsto surface regional bidding activity - Track tender volume trends by polling
get_site_statisticsfor live and published-today counts over time - Build a department-specific tender feed by filtering
search_tenderswith organization IDs fromget_organizations - Alert on keyword-matched tenders by running scheduled
search_tendersqueries against specific work description terms - Compile category-level procurement reports by combining
get_categoriestree data with filtered search results - Check submission deadline proximity by retrieving
tsubmissiondatefromget_tender_detailfor tracked tender codes
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does bdtender.com have an official developer API?+
What does `get_tender_detail` return and are full tender documents included?+
tendercode, workdesc, issudate, tsubmissiondate, status, tendersource, and advertisement_types. Full tender documents — specifications, bill of quantities, and other attachments — require authentication on the source portal and are not returned by this endpoint. A note field in the response describes this limitation.How do category, organization, and location filters work in `search_tenders`?+
get_categories, get_organizations, or get_locations to retrieve the correct IDs (for example, T1 for a category or DDist-02 for a district), then pass those values as category, organization, or location parameters in search_tenders. Passing arbitrary strings not present in those trees will return no results.Does the API cover private tender listings?+
get_site_statistics reports a Private Tenders count, but the search and listing endpoints (search_tenders, get_live_tenders) do not currently expose private tender records. The API covers public procurement notices. You can fork it on Parse and revise to add an endpoint targeting private tender listings if the source makes them accessible.Is there an endpoint to retrieve historical tenders or tenders by a specific past date range?+
search_tenders supports date_from and date_to filters in DD/MM/YYYY format, which can target past date ranges. However, there is no dedicated historical archive endpoint. Coverage depth depends on what the source portal retains. You can fork the API on Parse and revise it to add a dedicated historical query endpoint if deeper archival access is needed.