# DIBBS RFQ Scraper (`automation-lab/dibbs-rfq-scraper`) Actor

Extract public DLA DIBBS RFQs, NSNs, quantities, deadlines, set-asides, Fast Award flags, and solicitation document links.

- **URL**: https://apify.com/automation-lab/dibbs-rfq-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Business
- **Stats:** 1 total users, 0 monthly users, 36.4% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## DIBBS RFQ Scraper

Turn public US Defense Logistics Agency requests for quotation into structured, alert-ready procurement records.

DIBBS RFQ Scraper collects opportunities from the **DLA Internet Bid Board System (DIBBS)** and exports solicitation numbers, NSNs, descriptions, quantities, deadlines, set-asides, Fast Award flags, and document links.

Use it for daily supplier monitoring, part-number watchlists, bid-intelligence feeds, and CRM enrichment—without manually opening large DIBBS tables.

### What does DIBBS RFQ Scraper do?

The Actor:

- accepts the public Department of Defense warning for an anonymous session;
- discovers current RFQ posting dates from DIBBS;
- collects structured solicitation rows from selected dates;
- filters opportunities to your product and contracting criteria;
- removes duplicate solicitations;
- exports data to an Apify dataset;
- provides direct RFQ PDF and DIBBS package links when available.

It does not submit quotes, sign into vendor accounts, unlock restricted cFolders documents, or extract the body of RFQ PDFs.

### Who is this DIBBS procurement scraper for?

#### Government contractors

Monitor newly posted RFQs that match the products your company can supply.

#### Manufacturers

Watch NSNs and Federal Supply Classes connected to your catalog.

#### Distributors

Find time-sensitive resale and sourcing opportunities across recent DLA requests.

#### Bid-intelligence teams

Feed clean DIBBS records into scoring, enrichment, and alert pipelines.

#### Procurement software teams

Use the API output as a reliable first stage for internal dashboards and CRM workflows.

### Why automate DLA RFQ discovery?

DIBBS publishes valuable opportunities in large HTML tables.

Manual review is repetitive and makes it easy to miss a short deadline.

Scheduled extraction helps you:

- identify opportunities shortly after posting;
- focus on relevant FSCs or NSNs;
- prioritize set-asides and Fast Award candidates;
- retain a consistent historical export;
- notify sales or estimating teams automatically;
- reduce copy-and-paste errors.

### What DIBBS RFQ data can I extract?

| Field | Meaning |
|---|---|
| `solicitationNumber` | DLA solicitation identifier |
| `nsn` | National Stock Number |
| `fsc` | Four-digit Federal Supply Class derived from the NSN |
| `nomenclature` | DIBBS item description |
| `status` | Current displayed solicitation status |
| `purchaseRequestNumber` | Purchase request identifier |
| `quantity` | Requested quantity when shown |
| `issueDate` | RFQ issue date |
| `returnByDate` | Quote return deadline |
| `setAside` | DIBBS set-aside label |
| `isSetAside` | Normalized set-aside flag |
| `isFastAwardCandidate` | DIBBS Fast Award flag |
| `technicalDocuments` | Technical-document availability text |
| `hasTechnicalDocuments` | Normalized technical-document flag |
| `rfqPdfUrl` | Direct public RFQ PDF link |
| `packageUrl` | Public DIBBS package view |
| `nsnUrl` | Public DIBBS NSN view |
| `sourceUrl` | Dated source table |
| `scrapedAt` | UTC extraction timestamp |

### How to scrape recent DIBBS RFQs

1. Open the Actor input page.
2. Set **Recent posting days** to the window you want.
3. Add optional FSC, NSN, solicitation, or keyword filters.
4. Set a practical **Maximum RFQs** limit.
5. Click **Start**.
6. Review the Dataset tab.
7. Export JSON, CSV, Excel, XML, or another supported format.

A small first run can use one recent day and 25 RFQs.

### Input options

#### Date selection

- `recentDays`: newest posting dates to inspect, from 1 to 30.
- `exactDates`: exact DIBBS posting dates in `MM-DD-YYYY` format.
- `startDate`: inclusive start of a date range.
- `endDate`: inclusive end of a date range.

Exact dates take precedence over a date range.

A date range takes precedence over `recentDays`.

#### Opportunity filters

- `fscCodes`: exact four-digit FSC values.
- `nsns`: exact NSNs, with or without hyphens.
- `solicitationNumbers`: exact solicitations, with or without hyphens.
- `keywords`: terms that must appear in the solicitation, NSN, nomenclature, or PR.
- `statuses`: exact displayed statuses such as `Open`.

#### DIBBS flags

- `setAsideOnly`: keep only set-aside opportunities.
- `fastAwardOnly`: keep only Fast Award candidates.
- `technicalDocumentsOnly`: keep only records showing technical documents.

All supplied filters are restrictive and fail closed.

### Example input

```json
{
  "recentDays": 7,
  "fscCodes": ["6505"],
  "statuses": ["Open"],
  "maxItems": 100
}
```

To monitor an exact part:

```json
{
  "recentDays": 15,
  "nsns": ["6505-00-153-8480"],
  "maxItems": 25
}
```

To prioritize small-business opportunities:

```json
{
  "recentDays": 15,
  "setAsideOnly": true,
  "fastAwardOnly": true,
  "maxItems": 250
}
```

### Example output

```json
{
  "solicitationNumber": "SPE2DP-26-T-4195",
  "nsn": "6505-00-153-8480",
  "fsc": "6505",
  "nomenclature": "HYDROGEN PEROXIDE TOPI",
  "status": "Open",
  "purchaseRequestNumber": "7017530471",
  "quantity": 1,
  "issueDate": "07-20-2026",
  "returnByDate": "07-27-2026",
  "isSetAside": false,
  "isFastAwardCandidate": true,
  "hasTechnicalDocuments": false,
  "rfqPdfUrl": "https://dibbs2.bsm.dla.mil/Downloads/RFQ/5/SPE2DP26T4195.PDF",
  "packageUrl": "https://www.dibbs.bsm.dla.mil/rfq/rfqrec.aspx?sn=SPE2DP26T4195"
}
```

Fields reflect what DIBBS displays at extraction time.

### How much does it cost to scrape DIBBS RFQs?

This Actor uses pay-per-event pricing:

- a small one-time Actor start charge;
- a per-RFQ result charge;
- automatic volume discounts by Apify subscription tier.

You pay for records actually saved, subject to your Apify plan and maximum total charge settings.

The exact live prices appear on the Actor pricing tab and in the run cost estimate.

Use `maxItems` to control volume.

### Scheduling a DIBBS RFQ monitor

A common workflow is:

1. create a task with one or more FSC codes;
2. set `recentDays` to 1 or 2;
3. schedule it every morning;
4. save results to a dataset;
5. send new solicitations to email, Slack, a webhook, or your CRM;
6. deduplicate downstream by `solicitationNumber`.

Separate tasks can represent separate product lines or capture teams.

### Integrations and workflow patterns

Connect the Actor with:

- **Google Sheets** for a shared opportunity tracker;
- **Make** for no-code routing and notifications;
- **Zapier** for sales and CRM automation;
- **Slack** for deadline alerts;
- **webhooks** for internal bid-scoring services;
- **Amazon S3** or cloud warehouses for procurement history;
- **Apify schedules** for daily monitoring.

A useful integration pattern is scrape → filter → enrich → score → alert.

### Use the DIBBS scraper with the Apify API

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/dibbs-rfq-scraper').call({
    recentDays: 3,
    fscCodes: ['6505'],
    maxItems: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient(token='YOUR_APIFY_TOKEN')
run = client.actor('automation-lab/dibbs-rfq-scraper').call(run_input={
    'recentDays': 3,
    'fastAwardOnly': True,
    'maxItems': 100,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~dibbs-rfq-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"recentDays":1,"maxItems":25}'
```

Never commit an Apify token to source control.

### Use DIBBS RFQ Scraper through MCP

Apify MCP lets AI assistants run this Actor as a tool.

#### Claude Code setup

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/dibbs-rfq-scraper"
```

#### Claude Desktop setup

Add this server to the `mcpServers` object in Claude Desktop’s configuration.

#### Cursor setup

Add the same `mcpServers` entry in Cursor’s MCP settings.

#### VS Code setup

Add the server under `mcpServers` in your VS Code MCP configuration.

```json
{
  "mcpServers": {
    "apify-dibbs": {
      "url": "https://mcp.apify.com?tools=automation-lab/dibbs-rfq-scraper"
    }
  }
}
```

Authenticate with your Apify account when the MCP client requests it.

Example prompts:

- “Find recent open DIBBS RFQs in FSC 6505.”
- “Monitor Fast Award set-asides from the last week.”
- “Export solicitation numbers and return-by dates for these NSNs.”
- “Summarize the newest matching opportunities for our sales team.”

### Data quality and deduplication

The Actor deduplicates records by solicitation number within each run.

NSNs and solicitation numbers are normalized before exact matching.

Quantities are returned as numbers when DIBBS displays a parseable quantity.

Missing optional links are returned as `null` rather than invented URLs.

Date values retain DIBBS display format.

For cross-run deduplication, use `solicitationNumber` as the primary key.

### Tips for better RFQ results

- Start with one recent day while validating a workflow.
- Use FSC codes for broad product-category monitoring.
- Use NSNs for exact catalog matching.
- Keep keywords short and specific.
- Use status `Open` for active quote opportunities.
- Review the `returnByDate` before routing an alert.
- Store both the RFQ PDF and package URL for analyst review.
- Increase `maxItems` only when you need a larger export.

### Limitations

DIBBS controls data availability, labels, and uptime.

The public recent-date index covers a bounded current window.

This Actor does not bypass authentication or restricted technical-document access.

It does not submit a bid or determine whether your company is eligible.

It does not interpret solicitation clauses or replace legal review.

A source layout change can require parser maintenance.

Filters apply to the structured list row, not to the body of the linked PDF.

### Is scraping DIBBS legal?

DIBBS RFQ listings used by this Actor are publicly viewable after accepting the standard DoD warning.

Public availability does not remove your obligations.

You are responsible for:

- following DIBBS terms and applicable laws;
- using the data for a legitimate purpose;
- protecting any exported business information;
- validating eligibility and solicitation requirements;
- respecting controlled or restricted document access.

This Actor does not provide legal advice.

### Troubleshooting

#### Why did my filtered run return zero records?

The selected dates may contain RFQs, but none matched every supplied filter. Remove filters one at a time or widen the date window.

#### Why is an exact date rejected?

Use `MM-DD-YYYY`, for example `07-20-2026`. The date must also exist in the current public DIBBS recent-date index.

#### Why is a PDF link missing?

DIBBS does not expose the same links on every record. Optional URLs remain `null` when absent.

#### Why did a run fail before saving data?

DIBBS may be temporarily unavailable or may have changed its warning/session flow. Retry later and check the run log.

### Frequently asked questions

#### Can I search by part number?

Use an exact NSN for deterministic matching or a keyword from the nomenclature. Approved manufacturer part-number search is not part of v1.

#### Can I scrape closed RFQs?

The actor collects records exposed on selected recent posting dates and can filter by the displayed status. Long-term historical search is not promised.

#### Does it download RFQ PDFs?

It exports the public PDF URL. It does not store or parse the PDF body.

#### Does it require a DIBBS login?

No. The supported listing scope uses an anonymous public consent session.

#### Can I run it every day?

Yes. Daily scheduled monitoring is a primary use case.

#### What counts as one result?

One saved, structured RFQ solicitation counts as one result event.

### Related scrapers

Explore other public-data and procurement automation tools from [automation-lab](https://apify.com/automation-lab/).

Combine this Actor with your preferred enrichment, company-research, contact, or document-processing Actors from the automation-lab portfolio.

Keep the DIBBS Actor focused on solicitation discovery, then route the exported records into the specialized downstream tool your workflow needs.

### Support

If a run behaves unexpectedly, share the run URL and a concise description through the Actor’s Issues tab.

Include the input mode, expected date or solicitation, and whether the source record was visible on DIBBS.

Do not include private credentials, quote details, or controlled documents.

# Actor input Schema

## `recentDays` (type: `integer`):

Use the newest DIBBS posting dates when no exact date or date range is supplied.

## `exactDates` (type: `array`):

Optional DIBBS posting dates in MM-DD-YYYY format.

## `startDate` (type: `string`):

Optional inclusive start date in MM-DD-YYYY format.

## `endDate` (type: `string`):

Optional inclusive end date in MM-DD-YYYY format.

## `fscCodes` (type: `array`):

Keep RFQs whose NSN begins with one of these four-digit Federal Supply Class codes, such as 6505.

## `nsns` (type: `array`):

Keep exact National Stock Numbers. Hyphens are optional.

## `solicitationNumbers` (type: `array`):

Keep exact DIBBS solicitation numbers. Hyphens are optional.

## `keywords` (type: `array`):

All supplied terms must appear across the solicitation, NSN, nomenclature, or PR fields.

## `statuses` (type: `array`):

Optional exact status values, for example Open.

## `setAsideOnly` (type: `boolean`):

Keep only opportunities marked as a set-aside.

## `fastAwardOnly` (type: `boolean`):

Keep only DIBBS Fast Award candidates.

## `technicalDocumentsOnly` (type: `boolean`):

Keep only RFQs whose record indicates technical documents are available.

## `maxItems` (type: `integer`):

Stop after this many matching RFQ records have been saved.

## Actor input object example

```json
{
  "recentDays": 1,
  "exactDates": [],
  "fscCodes": [],
  "nsns": [],
  "solicitationNumbers": [],
  "keywords": [],
  "statuses": [],
  "setAsideOnly": false,
  "fastAwardOnly": false,
  "technicalDocumentsOnly": false,
  "maxItems": 20
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "recentDays": 1,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/dibbs-rfq-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "recentDays": 1,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/dibbs-rfq-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "recentDays": 1,
  "maxItems": 20
}' |
apify call automation-lab/dibbs-rfq-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=automation-lab/dibbs-rfq-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/GaFqPLDyEJn4IeuVD/builds/WcbzuyVONGmdONCDt/openapi.json
