Estafetabo APIestafetabo.com ↗
Search and browse the ESTAFETA Bolivia marketplace. Get products, prices in Bs., categories, brands, and availability filters via 3 structured endpoints.
What is the Estafetabo API?
The ESTAFETA Bolivia API gives programmatic access to the estafetabo.com marketplace through 3 endpoints covering product search, catalog browsing, and category listing. The search_products endpoint accepts free-text queries and returns up to 20 results per page with pricing in Bolivian bolivianos, store names, discount labels, and a site-reported total match count. The browse_catalog endpoint exposes the site's full filter panel including price range, brand, sale status, and featured flags.
curl -X GET 'https://api.parse.bot/scraper/e9f3defd-efc0-4cf0-9a05-4d9e58f2627c/search_products?sort=precio_asc&query=audifonos' \ -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 estafetabo-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.
"""Walkthrough: ESTAFETA Bolivia marketplace — bounded, re-runnable."""
from parse_apis.estafetabo_com_api import Estafeta, CatalogSort, SearchSort, InputFormatInvalid
client = Estafeta()
# List categories and pick the first with products to filter the catalog.
cat = client.categories.list(limit=50).first()
if cat is not None:
print(f"Category: {cat.label} ({cat.product_count} products)")
# Browse the catalog filtered to that category, cheapest first.
for product in client.products.browse(
category_id=cat.category_id, sort=CatalogSort.PRECIO_ASC, limit=5
):
discount = f" (was {product.original_price_bs} Bs)" if product.original_price_bs else ""
print(f" {product.name} — {product.price_bs} Bs{discount}")
# Full-text search across all categories.
try:
hit = client.products.search(query="audifonos", sort=SearchSort.PRECIO_ASC, limit=1).first()
except InputFormatInvalid as e:
print(f"Search rejected: {e.message}")
hit = None
if hit is not None:
print(f"Cheapest match: {hit.name} — {hit.price_bs} Bs @ {hit.store_name}")
print("exercised: categories.list / products.browse / products.search")
Full-text product search across the ESTAFETA marketplace. Returns one page of matching products (20 per page as served by the site) with the site's reported result total. Optional filters: category_id restricts results to one marketplace category, sort changes the result order. Pagination is caller-driven through the page parameter; page defaults to 1 when omitted and has_more is true when the page came back full, meaning a further page can be requested. Note that the site's search screen does not accept price, brand, featured, on-sale or in-stock filters; use browse_catalog for those. A query that matches nothing returns an empty products list with total_results 0.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based result page. |
| sort | string | Result order on the search screen. Omitted = the site's default (most recent first). |
| queryrequired | string | Free-text search term, matched against product names (e.g. audifonos). |
| category_id | string | Numeric marketplace category id, as emitted by list_categories in categories[*].category_id. Omitted = search all categories. |
{
"type": "object",
"fields": {
"page": "integer page number of this result page",
"query": "the search term that was executed",
"has_more": "boolean, true when this page came back full so a further page can be requested",
"products": "array of matching product summaries (product_id, name, url, image_url, category_label, store_name, price_bs, original_price_bs, discount_label)",
"total_results": "integer count of matches the site reports for this search (null when the site omits it)"
},
"sample": {
"data": {
"page": 1,
"query": "audifonos",
"has_more": false,
"products": [
{
"url": "https://estafetabo.com/producto/47/audifonos-inalambricos",
"name": "audífonos inalámbricos",
"price_bs": 120,
"image_url": "https://estafetabo.com/assets/uploads/productos/7196ca7d55fa06d125291d46169ff298.jpg",
"product_id": 47,
"store_name": "TI3ND4 G0NZ4L3S",
"category_label": "💻 Tecnología",
"discount_label": "-20%",
"original_price_bs": 150
}
],
"total_results": 10
},
"status": "success"
}
}About the Estafetabo API
Endpoints and Data Shape
The API exposes three endpoints. list_categories returns every marketplace category with its numeric category_id, display label (including any emoji the site shows), and product_count where published. Those category_id values feed directly into search_products and browse_catalog to restrict results.
search_products takes a required query string and optional category_id, sort, and page parameters. Each product in the response carries product_id, name, url, image_url, category_label, store_name, price_bs, original_price_bs, and discount_label. The total_results field reflects the site's reported match count and may be null when the site omits it. has_more is true when the current page returned a full 20 results, signaling that the next page can be requested.
Filtering with browse_catalog
browse_catalog mirrors the site's filter panel. Callers can combine category_id, min_price, max_price, brand_id, on_sale_only, and featured_only in any combination. The sort parameter changes the display order. The response includes total_reported, which is the count shown above the product grid by the site — this figure may not reflect every active filter, consistent with site behavior. Products carry the same fields as search results, with prices denominated in Bolivian bolivianos (Bs.).
Pagination
Both search_products and browse_catalog use 1-based page parameters and return 20 items per page as served by the site. Callers should check has_more before requesting subsequent pages rather than relying solely on total_results or total_reported, since those counts can be null.
The Estafetabo API is a managed, monitored endpoint for estafetabo.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when estafetabo.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 estafetabo.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 price changes on ESTAFETA Bolivia by polling
browse_catalogwithcategory_idand comparingprice_bsagainstoriginal_price_bsover time. - Build a product comparison tool that queries
search_productswith the same term across multiple categories usingcategory_idfromlist_categories. - Surface discounted inventory by calling
browse_catalogwithon_sale_only: trueand extractingdiscount_labelandoriginal_price_bs. - Generate a category sitemap by consuming
list_categoriesand using eachcategory_idandproduct_countto prioritize crawl depth. - Filter products within a buyer's budget by passing
min_priceandmax_pricetobrowse_catalogwith prices in Bolivian bolivianos. - Track featured product placement on the marketplace by calling
browse_catalogwithfeatured_only: trueon a scheduled interval. - Identify which brands operate in a given category by combining
category_idandbrand_idparameters inbrowse_catalogcalls.
| 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 ESTAFETA Bolivia have an official developer API?+
What does the `total_reported` field in `browse_catalog` actually count?+
total_reported is the integer the site prints above the product grid. It may not update immediately when every filter combination is active — this is site behavior, not an API limitation. It can also be null when the site omits the figure. Use has_more on each response to drive reliable pagination.Does the API return seller or store details beyond the store name?+
search_products include store_name, but deeper seller profiles — such as seller ratings, contact details, or individual store pages — are not currently exposed. The API covers product summaries, pricing, and category data. You can fork it on Parse and revise to add a seller-detail endpoint.Can I retrieve individual product detail pages, such as full descriptions or multiple images?+
search_products and browse_catalog return product summary fields including name, url, image_url, price_bs, and discount_label, but not extended descriptions, specification tables, or image galleries. You can fork it on Parse and revise to add a product-detail endpoint.How does category filtering interact between `search_products` and `browse_catalog`?+
category_id values emitted by list_categories. In search_products, category_id narrows the free-text results to one category. In browse_catalog, it combines with other filter parameters like brand_id, min_price, max_price, on_sale_only, and featured_only to refine the catalog grid.