---
type: "firecrawl-provider"
description: "PennBid, the Pennsylvania public procurement portal hosted on Bonfire (pennbid.bonfirehub.com): the public lists of open and past (closed) opportunities and a lookup of one opportunity's listing record by ProjectID or detail URL. Read-only; no bidding, registration or vendor account surfaces. The opportunity detail page itself sits behind a Cloudflare managed challenge and is not read."
use_when: "PennBid, the Pennsylvania public procurement portal hosted on Bonfire (pennbid.bonfirehub.com): the public lists of open and past (closed) opportunities and a lookup of one opportunity's listing record by ProjectID or detail URL. Read-only; no bidding, registration or vendor account surfaces. The opportunity detail page itself sits behind a Cloudflare managed challenge and is not read."
categories: "Public records"
capabilities: 3
credits_per_call: 5
---
# PennBid (Bonfire) public procurement portal on Firecrawl Alexandria

PennBid, the Pennsylvania public procurement portal hosted on Bonfire (pennbid.bonfirehub.com): the public lists of open and past (closed) opportunities and a lookup of one opportunity's listing record by ProjectID or detail URL. Read-only; no bidding, registration or vendor account surfaces. The opportunity detail page itself sits behind a Cloudflare managed challenge and is not read.

- Categories: Public records
- Category index: [Public records category](https://firecrawl.dev/alexandria/agents/categories/public-records)
- Provider key: `pennbid-bonfirehub-com`
- Access: Firecrawl credits
- Cost: 5 credits per call

## More

- [Human guide](https://firecrawl.dev/app/alexandria/pennbid-bonfirehub-com)
- [OpenAPI spec](https://firecrawl.dev/alexandria/agents/providers/pennbid-bonfirehub-com/openapi.json)

## Capabilities

- [Get opportunity](https://firecrawl.dev/alexandria/agents/providers/pennbid-bonfirehub-com/public-tenders/get_opportunity): One PennBid opportunity's public listing record, found by Bonfire ProjectID or by a pasted detail URL (/opportunities/{ProjectID} or /opportunities/private/{PrivateProjectID}): name, awarding agency reference, status ids, closing date (UTC), award flag and which list (open or past) it sits in. Searches the open list first, then the full past list; an id in neither is `not_found`. The detail page (statement of work, open/questions dates, documents, Q&A, bid results) is behind a Cloudflare managed challenge and is not read by this version.
- [List open opportunities](https://firecrawl.dev/alexandria/agents/providers/pennbid-bonfirehub-com/public-tenders/list_open_opportunities): Open (accepting submissions) public opportunities on PennBid, from the portal's JSON listing endpoint. The upstream endpoint returns the complete list in one response and accepts no parameters; the text filter, date window and paging are applied by this program. Sorted by closing date ascending, then project id. All dates are UTC (ISO 8601 `Z`), converted from the portal's UTC database strings.
- [List past opportunities](https://firecrawl.dev/alexandria/agents/providers/pennbid-bonfirehub-com/public-tenders/list_past_opportunities): Past (closed) public opportunities on PennBid, from the portal's JSON listing endpoint: every closed project back to late 2023 (about 8,000 records, one ~3 MB upstream response). The endpoint accepts no parameters; the text filter, closing-date window, status and award filters and paging are applied by this program. Sorted by closing date descending, then project id. All dates are UTC (ISO 8601 `Z`).

## 1. Choose this provider when

PennBid, the Pennsylvania public procurement portal hosted on Bonfire (pennbid.bonfirehub.com): the public lists of open and past (closed) opportunities and a lookup of one opportunity's listing record by ProjectID or detail URL. Read-only; no bidding, registration or vendor account surfaces. The opportunity detail page itself sits behind a Cloudflare managed challenge and is not read.

## 2. Minimal request

Call `POST https://api.firecrawl.dev/v2/scrape` with `{ alexandria: { provider, capability, options } }`. For a batch, send `{ alexandria: [...] }` with up to 10 calls.

```json
{
  "provider": "pennbid-bonfirehub-com",
  "capability": "public-tenders/get_opportunity",
  "options": {
    "project_id": "252422"
  }
}
```

## 3. Add provider options

Use only the options needed for the task:

- `project_id` (string): Bonfire ProjectID, as in the listings. Exactly one of `project_id` and `url`. Pattern: ^[0-9]{1,12}$. Example: `project_id`
- `url` (string): Detail URL: https://pennbid.bonfirehub.com/opportunities/{ProjectID} or https://pennbid.bonfirehub.com/opportunities/private/{PrivateProjectID}. Example: `<url>`

## 4. Request through your preferred interface

### JavaScript

```javascript
const result = await firecrawl.scrape({
  alexandria: {
    provider: "pennbid-bonfirehub-com",
    capability: "public-tenders/get_opportunity",
    options: {
      project_id: "252422",
    },
  },
});
```

### Python

```python
result = firecrawl.scrape_alexandria({
  "provider": "pennbid-bonfirehub-com",
  "capability": "public-tenders/get_opportunity",
  "options": {
    "project_id": "252422"
  }
})
```

### cURL

```sh
curl https://api.firecrawl.dev/v2/scrape \
  -H "Authorization: Bearer $FIRECRAWL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "alexandria": {
    "provider": "pennbid-bonfirehub-com",
    "capability": "public-tenders/get_opportunity",
    "options": {
      "project_id": "252422"
    }
  }
}'
```

### CLI

```sh
firecrawl scrape 'pennbid-bonfirehub-com/public-tenders/get_opportunity' \
  --options '{"project_id":"252422"}'
```


### MCP

Call the FCX MCP retrieve tool with this object:

```json
{
  "provider": "pennbid-bonfirehub-com",
  "capability": "public-tenders/get_opportunity",
  "options": {
    "project_id": "252422"
  }
}
```

Ask for only the returned fields needed by the task.

## 5. Full request shape

```json
{
  "provider": "pennbid-bonfirehub-com",
  "capability": "public-tenders/get_opportunity",
  "options": {
    "project_id": "252422"
  }
}
```

## 6. Response data

The response includes `success`, `provider`, `capability`, `creditsCost` and `data`. This example shows the provider payload in `data`:

```json
{
  "date_close": "2026-10-09T14:00:00Z",
  "department_id": "8474",
  "is_public_award": false,
  "listing": "past",
  "name": "Myra Avenue Sanitary Sewer Replacement",
  "observed_at_ms": 1791621367569,
  "private_project_id": "1adbb1d04515cb0eedf5269bec556103",
  "project_id": "252422",
  "reference": "Yeadon Borough, Delaware County",
  "status_id": 3,
  "sub_status_id": 1,
  "url": "https://pennbid.bonfirehub.com/opportunities/252422",
  "visibility_id": 1
}
```

## API reference-derived contract

The following capability contract is generated from the same normalized Alexandria API reference exposed in the API spec.

### Get opportunity

- Capability: `public-tenders/get_opportunity`
- Description: One PennBid opportunity's public listing record, found by Bonfire ProjectID or by a pasted detail URL (/opportunities/{ProjectID} or /opportunities/private/{PrivateProjectID}): name, awarding agency reference, status ids, closing date (UTC), award flag and which list (open or past) it sits in. Searches the open list first, then the full past list; an id in neither is `not_found`. The detail page (statement of work, open/questions dates, documents, Q&A, bid results) is behind a Cloudflare managed challenge and is not read by this version.
- Instructions: Resolve a PennBid ProjectID or a pasted https://pennbid.bonfirehub.com/opportunities/... URL to its listing record and learn whether it is still open or already closed/awarded.
- Cost: 5 credits per call
- Capability file: [Get opportunity](https://firecrawl.dev/alexandria/agents/providers/pennbid-bonfirehub-com/public-tenders/get_opportunity)

Accepted options:
- `project_id` (string): Bonfire ProjectID, as in the listings. Exactly one of `project_id` and `url`. Pattern: ^[0-9]{1,12}$. Example: `project_id`
- `url` (string): Detail URL: https://pennbid.bonfirehub.com/opportunities/{ProjectID} or https://pennbid.bonfirehub.com/opportunities/private/{PrivateProjectID}. Example: `<url>`

Response schema example:
```json
{
  "date_close": "2026-10-09T14:00:00Z",
  "department_id": "8474",
  "is_public_award": false,
  "listing": "past",
  "name": "Myra Avenue Sanitary Sewer Replacement",
  "observed_at_ms": 1791621367569,
  "private_project_id": "1adbb1d04515cb0eedf5269bec556103",
  "project_id": "252422",
  "reference": "Yeadon Borough, Delaware County",
  "status_id": 3,
  "sub_status_id": 1,
  "url": "https://pennbid.bonfirehub.com/opportunities/252422",
  "visibility_id": 1
}
```

### List open opportunities

- Capability: `public-tenders/list_open_opportunities`
- Description: Open (accepting submissions) public opportunities on PennBid, from the portal's JSON listing endpoint. The upstream endpoint returns the complete list in one response and accepts no parameters; the text filter, date window and paging are applied by this program. Sorted by closing date ascending, then project id. All dates are UTC (ISO 8601 `Z`), converted from the portal's UTC database strings.
- Instructions: Find currently open bids/RFPs on PennBid by keyword (project name or awarding agency) or closing window, then pass `project_id` to `get_opportunity`.
- Cost: 5 credits per call
- Capability file: [List open opportunities](https://firecrawl.dev/alexandria/agents/providers/pennbid-bonfirehub-com/public-tenders/list_open_opportunities)

Accepted options:
- `closing_from` (string): Keep opportunities closing at or after this UTC instant. A date alone means the start of that day (00:00:00Z). Pattern: ^[0-9]{4}-[0-9]{2}-[0-9]{2}(T[0-9]{2}:[0-9]{2}:[0-9]{2}Z)?$. Example: `<closing_from>`
- `closing_to` (string): Keep opportunities closing at or before this UTC instant. A date alone means the end of that day (23:59:59Z). Pattern: ^[0-9]{4}-[0-9]{2}-[0-9]{2}(T[0-9]{2}:[0-9]{2}:[0-9]{2}Z)?$. Example: `<closing_to>`
- `limit` (number): Page size applied locally (default 50). Example: `50`
- `offset` (number): Zero-based position in the filtered, sorted list; pass `next_offset` from the previous page. Example: `0`
- `q` (string): Case-insensitive substring matched against the project name and the reference (awarding agency / county) text. Example: `<q>`

Response schema example:
```json
{
  "count": 5,
  "items": [
    {
      "date_close": "2026-10-14T15:00:00Z",
      "department_id": "8020",
      "name": "B562-26-08 Susquehanna Water Treatment Plant Sludge & Grit Disposal Service",
      "private_project_id": "f046f462dcbb2d52aba7c2f106036ca5",
      "project_id": "251507",
      "reference": "City of Lancaster, Lancaster County",
      "status_id": 2,
      "sub_status_id": 1,
      "url": "https://pennbid.bonfirehub.com/opportunities/251507",
      "visibility_id": 1
    },
    {
      "date_close": "2026-10-14T15:00:00Z",
      "department_id": "8020",
      "name": "B405-26-01 FMLA LEAVE MANAGEMENT SERVICES",
      "private_project_id": "78ac84d99f9d18c6580193ec5c05dde5",
      "project_id": "254507",
      "reference": "City of Lancaster, Lancaster County",
      "status_id": 2,
      "sub_status_id": 1,
      "url": "https://pennbid.bonfirehub.com/opportunities/254507",
      "visibility_id": 1
    },
    {
      "date_close": "2026-10-14T15:00:00Z",
      "department_id": "8020",
      "name": "B405-26-02 HUMAN RESOURCES INFORMATION SYSTEM (HRIS)",
      "private_project_id": "cb092805e743a8313a56229be2ab152f",
      "project_id": "254518",
      "reference": "City of Lancaster, Lancaster County",
      "status_id": 2,
      "sub_status_id": 1,
      "url": "https://pennbid.bonfirehub.com/opportunities/254518",
      "visibility_id": 1
    },
    {
      "date_close": "2026-10-16T15:00:00Z",
      "department_id": "8198",
      "name": "Paradise Township Park Improvements 2026",
      "private_project_id": "dea5f9c58cb95068fd3afc60378edeeb",
      "project_id": "256521",
      "reference": "Paradise Township, Lancaster County",
      "status_id": 2,
      "sub_status_id": 1,
      "url": "https://pennbid.bonfirehub.com/opportunities/256521",
      "visibility_id": 1
    },
    {
      "date_close": "2026-10-21T15:00:00Z",
      "department_id": "8278",
      "name": "COLUMBIA BOROUGH COLLECTION SYSTEM REHABILITATION 2026",
      "private_project_id": "53d97d49db2d5446d034ea84840d1d67",
      "project_id": "254661",
      "reference": "Lancaster Area Sewer Authority, Lancaster County",
      "status_id": 2,
      "sub_status_id": 1,
      "url": "https://pennbid.bonfirehub.com/opportunities/254661",
      "visibility_id": 1
    }
  ],
  "limit": 5,
  "matched": 14,
  "next_offset": 5,
  "observed_at_ms": 1791621348853,
  "offset": 0,
  "total": 154
}
```

### List past opportunities

- Capability: `public-tenders/list_past_opportunities`
- Description: Past (closed) public opportunities on PennBid, from the portal's JSON listing endpoint: every closed project back to late 2023 (about 8,000 records, one ~3 MB upstream response). The endpoint accepts no parameters; the text filter, closing-date window, status and award filters and paging are applied by this program. Sorted by closing date descending, then project id. All dates are UTC (ISO 8601 `Z`).
- Instructions: Look up closed PennBid solicitations by keyword, closing window or public-award flag, for example to find awarded projects of an agency; pass `project_id` to `get_opportunity` for the detail.
- Cost: 5 credits per call
- Capability file: [List past opportunities](https://firecrawl.dev/alexandria/agents/providers/pennbid-bonfirehub-com/public-tenders/list_past_opportunities)

Accepted options:
- `awarded` (boolean): true keeps only projects with a public award (IsPublicAward), false only those without. Example: `false`
- `closed_from` (string): Keep opportunities that closed at or after this UTC instant. A date alone means the start of that day (00:00:00Z). Pattern: ^[0-9]{4}-[0-9]{2}-[0-9]{2}(T[0-9]{2}:[0-9]{2}:[0-9]{2}Z)?$. Example: `<closed_from>`
- `closed_to` (string): Keep opportunities that closed at or before this UTC instant. A date alone means the end of that day (23:59:59Z). Pattern: ^[0-9]{4}-[0-9]{2}-[0-9]{2}(T[0-9]{2}:[0-9]{2}:[0-9]{2}Z)?$. Example: `<closed_to>`
- `limit` (number): Page size applied locally (default 50). Example: `50`
- `offset` (number): Zero-based position in the filtered, sorted list; pass `next_offset` from the previous page. Example: `0`
- `q` (string): Case-insensitive substring matched against the project name and the reference (awarding agency / county) text. Example: `<q>`
- `status_id` (number): Keep only this Bonfire ProjectStatusID (3, 4 and 5 observed on past projects). Example: `10`

Response schema example:
```json
{
  "count": 1,
  "items": [
    {
      "date_close": "2026-10-09T14:00:00Z",
      "department_id": "8474",
      "is_public_award": false,
      "name": "Myra Avenue Sanitary Sewer Replacement",
      "private_project_id": "1adbb1d04515cb0eedf5269bec556103",
      "project_id": "252422",
      "reference": "Yeadon Borough, Delaware County",
      "status_id": 3,
      "sub_status_id": 1,
      "url": "https://pennbid.bonfirehub.com/opportunities/252422",
      "visibility_id": 1
    }
  ],
  "limit": 5,
  "matched": 1,
  "next_offset": null,
  "observed_at_ms": 1791621358463,
  "offset": 0,
  "total": 8031
}
```
