
TikTok Shop Scraper
scrape.ly/store/shelfbright/tiktok-shop-scraperE-commerceSocial media
1 monthly user

Export open government bids, RFPs, RFQs and tenders from Bonfire (Euna Procurement) agency portals across the US and Canada: title, reference number, solicitation type, deadline in UTC and local time, status, department and link. Add notices and addenda, past and awarded opportunities, and public contracts with the awarded vendor. No login needed.
Export open government bids, RFPs, RFQs and tenders from Bonfire (Euna Procurement) agency portals across the US and Canada into a clean table: title, reference number, solicitation type, deadline in UTC and the agency's local time, status, department and link. Add public notices and addenda, past and awarded opportunities, and public contracts with the awarded vendor. No login needed, a two-agency run takes seconds, and you pay only for the results you keep.
| Field | What it does |
|---|---|
agencySlugs | Agency portals: catalog picks, any slug such as dallascityhall, or links such as https://ubc.bonfirehub.ca/portal. |
states | Add every catalog agency in these US states or Canadian provinces (TX, CA, ON, BC, …). |
agencyTypes | Add every catalog agency of these types: city, county, state-agency, k12, higher-ed, transit, airport, port, utility, housing, workforce, healthcare, other. |
maxItems | Results to save in total (default 20; 0 = no limit). Opportunities come first, contracts use what is left. |
keywords / excludeKeywords | Whole-word title match on opportunities and contracts, any case; roof* matches "Roofing". Exclude wins. |
closingWithinDays / minDaysLeft | Keep open opportunities whose deadline is at most / at least N days away. |
includeActiveOpportunities | Open opportunities (default on). |
includeNotices | Add each open opportunity's notices and addenda. |
includePastOpportunities | Add closed, awarded and cancelled opportunities. |
includeContracts / contractStatuses | Add public contracts, optionally only active, pending, closed, terminated or term-expired ones. |
Which agencies are scanned: your agencySlugs plus the catalog agencies matching states and agencyTypes (when only one of the two is set, the other does not restrict).
{
"agencySlugs": ["dallascityhall", "harriscountytx"],
"keywords": ["roof*", "hvac"],
"closingWithinDays": 30,
"includeNotices": true,
"maxItems": 100
}
All transit agencies in Texas: {"states": ["TX"], "agencyTypes": ["transit"]}.
Each opportunity is one row:
{
"recordType": "opportunity",
"agency": "cityofvancouver",
"agencyName": "City of Vancouver",
"agencyRegion": "WA",
"agencyType": "city",
"projectId": "254789",
"referenceId": "RFQ 48-26",
"title": "Fourth Plain Blvd Mobility Improvements",
"solicitationType": "RFQ",
"closeDate": "2026-10-21T22:00:00.000Z",
"closeDateLocal": "2026-10-21T15:00:00-07:00",
"agencyTimezone": "America/Los_Angeles",
"daysLeft": 0.2,
"status": "open",
"departmentId": "3777",
"departmentName": null,
"url": "https://cityofvancouver.bonfirehub.com/opportunities/254789",
"scrapedAt": "2026-10-21T17:37:09.000Z",
"notices": [
{
"threadId": "1563429",
"subject": "Project Details Have Changed - RFQ 48-26 Fourth Plain Blvd Mobility Improvements",
"content": "Addendum no 1 has been uploaded. Responses are due next Wednesday, 10/21, by 3pm pst.",
"dateCreated": "2026-10-14T17:46:51.000Z"
}
],
"noticesFetched": true,
"noticeCount": 1
}
| Field | Meaning |
|---|---|
title, referenceId, projectId | The solicitation's title, the agency's own reference number and Bonfire's id. |
solicitationType | RFP, RFQ, ITB, IFB, CSP, RFI, … read from the title or the reference number; empty when neither names one. |
closeDate / closeDateLocal | The deadline in UTC and in the agency's own time zone (agencyTimezone). |
daysLeft | Days until the deadline (open opportunities). |
status | open, or for past ones closed, awarded (award published) or cancelled. |
agency, agencyName, agencyRegion, agencyType | The portal and, for catalog agencies, its state or province and type. |
departmentId / departmentName | The buying department (names only where the agency publishes them). |
notices | Notices and addenda, oldest first (with Include notices). |
url | The opportunity page on the agency portal. |
With Public contracts on, contracts are rows with recordType: "contract" and their own Contracts view:
{
"recordType": "contract",
"agency": "alleghenycounty",
"agencyName": "Allegheny County, PA",
"contractId": "142920",
"name": "8788 - Clear Mattresses for ACJ - #49901",
"status": "active",
"isExtendable": true,
"startDate": "2025-11-01T04:00:00.000Z",
"endDate": "2026-10-31T04:00:00.000Z",
"vendorName": "Example Supply Co.",
"vendorContactName": "Jane Doe",
"vendorEmail": "sales@example.com",
"vendorPhone": "555-0100",
"vendorCity": "Hudson",
"url": "https://alleghenycounty.bonfirehub.com/publicContracts/142920"
}
Pay per result:
Example: 1,000 open opportunities ≈ $4.00; with notices ≈ $10.00. Platform usage (compute and proxy traffic) is billed on top and is small for this actor: our test runs at the default 512 MB used about $0.0003 for 20 results, $0.001 for 1,000 results and $0.014 for 1,000 results with notices. Filtered-out results and failed agencies are never charged. Set Maximum results or a maximum charge per run to cap your spend.
Is it legal? It reads only data the agencies publish openly on their public portals for transparency. Check your local rules for how you use personal data such as vendor contacts.
Do I need a Bonfire login or a proxy? No login. The default datacenter proxy works; if the portals refuse it, the run switches to US residential exits by itself.
Which agencies are covered? Any portal on bonfirehub.com or bonfirehub.ca. 322 are in the built-in list with their state or province and type; type any other slug or paste its link.
How many results can I get? Everything the portals publish: across the catalog that is about 1,700 open opportunities on a typical day, and more than 14,000 past opportunities plus thousands of public contracts.
Why is a field empty? Bonfire's public lists carry the title, reference, deadline, status and department only. solicitationType is empty when neither title nor reference names one, departmentName when the agency publishes no department names, and region/type for agencies outside the catalog.
Can I schedule it or use the API? Yes. Schedule a daily run for a bid feed, and read results through the API or send them on with integrations and webhooks.
url for documents (downloading them needs a free vendor account, which this actor does not use).Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
agencySlugsarrayOptionalAgencies
Bonfire agency portals to scrape. Pick from the list of 322 US and Canadian agencies, or type any other agency slug (the part before .bonfirehub.com or .bonfirehub.ca, e.g. "dallascityhall") or paste a portal link such as https://dallascityhall.bonfirehub.com/portal. Leave empty together with States and Agency types to scan every catalog agency.
statesarrayOptionalStates / provinces
Add every catalog agency in these US states or Canadian provinces. Combined with Agency types, both must match.
agencyTypesarrayOptionalAgency types
Add every catalog agency of these types, e.g. transit or K-12. Combined with States, both must match.
maxItemsintegerOptionaldefault 20Maximum results
How many results to save in total across all agencies, counted after filters. 0 = no limit. Opportunities come first; contracts use what is left.
Optional. Filtered-out results are not saved and not charged.
keywordsarrayOptionalKeywords
Keep opportunities (and contracts) whose title contains any of these words or phrases. Whole words, any case (IT does not match "Unit"); end a word with * for a prefix, e.g. roof* matches "Roofing".
excludeKeywordsarrayOptionalExclude keywords
Drop opportunities (and contracts) whose title contains any of these words or phrases. Same matching as Keywords; wins over Keywords.
closingWithinDaysintegerOptionalClosing within (days)
Keep open opportunities whose deadline is at most this many days away.
minDaysLeftintegerOptionalMinimum days left
Keep open opportunities whose deadline is at least this many days away, e.g. 7 to skip bids you could not prepare in time.
includeActiveOpportunitiesbooleanOptionaldefault trueOpen opportunities
Open bids, RFPs, RFQs and tenders that accept submissions now.
includeNoticesbooleanOptionaldefault falseInclude notices and addenda
Add each open opportunity's public notices and addenda (extensions, revised scope, Q&A). One extra request per opportunity, charged at the notices rate.
includePastOpportunitiesbooleanOptionaldefault falsePast opportunities
Also collect closed, awarded and cancelled opportunities from each agency's archive. A large agency can have 1,000+ of them, so set Maximum results too.
includeContractsbooleanOptionaldefault falsePublic contracts
Also collect the agency's public contracts with dates, status and the awarded vendor. Only agencies that publish contracts return any. Contracts share the Maximum results limit.
contractStatusesarrayOptionalContract statuses
Keep only contracts with these statuses, e.g. Active to watch contracts that will be rebid. Empty = all.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
The default datacenter proxy works for Bonfire portals. The run switches to US residential exits by itself if the portals refuse it.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| recordType | string | null | |
| agency | string | null | |
| agencyName | string | null | |
| agencyRegion | string | null | |
| agencyType | string | null | |
| projectId | string | null | |
| referenceId | string | null | |
| title | string | null | |
| solicitationType | string | null | |
| closeDate | string | null | |
| closeDateLocal | string | null | |
| agencyTimezone | string | null | |
| status | string | null | |
| departmentId | string | null | |
| departmentName | string | null | |
| url | string | null | |
| scrapedAt | string | null | |
| contractId | string | null | |
| name | string | null | |
| startDate | string | null | |
| endDate | string | null | |
| vendorName | string | null | |
| vendorContactName | string | null | |
| vendorEmail | string | null | |
| vendorPhone | string | null | |
| vendorAddress | string | null | |
| vendorCity | string | null | |
| daysLeft | number | null | |
| isExtendable | boolean | null | |
| noticeCount | number | null | |
| noticesFetched | boolean | null | |
| notices | array | null | |
| vendorRegion | string | null | |
| vendorPostalCode | string | null | |
| vendorCountry | string | null |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Opportunity or contract | Charged per opportunity (open or past) or public contract saved. | $0.004 |
| Opportunity with notices | Charged per open opportunity saved with its public notices and addenda (Include notices on). | $0.01 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('cornerledger/bonfire-scraper').call({
"agencySlugs": [
"dallascityhall",
"harriscountytx"
],
"maxItems": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run cornerledger/bonfire-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=cornerledger/bonfire-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
No examples yet
The developer hasn't published example inputs for this actor.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.