# DLA DIBBS Defense RFQ & Solicitation Scraper (USA) (`scrapers_lat/dibbs-defense-rfq-scraper`) Actor

Scrape US Defense Logistics Agency DIBBS RFQs and solicitations: NSN, item, quantity, buyer, set-aside, issue and return-by dates. Filter by NSN, keyword or date. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/scrapers\_lat/dibbs-defense-rfq-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $14.18 / 1,000 rfq results

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/actors/running/actors-in-store.md#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

[![DLA DIBBS Defense RFQ & Solicitation Scraper (USA)](https://scrapers.lat/banners/dibbs-defense-rfq-scraper.png)](https://console.apify.com/actors/frjE1KP6vs0z2e7C1/input)

## DLA DIBBS Defense RFQ & Solicitation Scraper (USA)

Here is one real result, with every field the actor returns:

```json
{
  "solicitationNumber": "SPE1C126Q0446",
  "solicitationType": "Request for Quote",
  "nsn": "8455-01-654-2769",
  "niin": "016542769",
  "fsc": "8455",
  "nomenclature": "INSIGNIA, SHOULDER S",
  "quantity": 15000,
  "unitOfIssue": "EA",
  "purchaseRequest": "7017721136",
  "buyerOffice": "DAW02G1N000",
  "setAside": "Unrestricted/Not Set Aside",
  "status": "Open",
  "technicalDocuments": "Tech Docs",
  "technicalDocumentsFlag": true,
  "postedDate": "2026-08-19",
  "issueDate": "2026-08-19",
  "returnByDate": "2026-08-26",
  "daysUntilClose": 5,
  "isOpen": true,
  "rfqUrl": "https://www.dibbs.bsm.dla.mil/rfq/rfqrec.aspx?sn=SPE1C126Q0446",
  "pdfUrl": "https://dibbs2.bsm.dla.mil/Downloads/RFQ/6/SPE1C126Q0446.PDF",
  "pdfFileName": "SPE1C126Q0446.pdf",
  "aiPlainSummary": null,
  "aiLikelyBidders": null,
  "aiUrgency": null,
  "source": "dibbs.bsm.dla.mil",
  "observedAt": "2026-08-20T15:10:29.825Z",
  "error": null
}
```

The most complete DLA DIBBS RFQ scraper available. It returns every field the DIBBS bid board exposes for each Request for Quote (solicitation number, NSN, item nomenclature, quantity, unit of issue, purchase request, buyer office, set-aside, issue and return-by dates, technical documents), plus derived fields (FSC, NIIN, days until close, direct RFQ and PDF links) and optional AI enrichment, and gives you five filters to target exactly the defense procurement leads you need.

**📥 [Input](https://apify.com/scrapers_lat/dibbs-defense-rfq-scraper/input-schema) · 📤 [Output](https://apify.com/scrapers_lat/dibbs-defense-rfq-scraper/output-schema) · 💰 [Pricing](https://apify.com/scrapers_lat/dibbs-defense-rfq-scraper/pricing) · ▶️ [Examples](https://apify.com/scrapers_lat/dibbs-defense-rfq-scraper/examples)**

![Apify](https://img.shields.io/badge/Platform-Apify-1CE1CE?logo=apify\&logoColor=white)
![Coverage](https://img.shields.io/badge/Coverage-United%20States-blue)
![Output](https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel-orange)
![Billing](https://img.shields.io/badge/Billing-Pay%20per%20result-brightgreen)

### Table of contents

- [What it does](#what-it-does)
- [Quickstart](#quickstart)
- [Input reference](#input-reference)
- [Output reference](#output-reference)
- [Example output record](#example-output-record)
- [Run via API and CLI](#run-via-api-and-cli)
- [Fetch results](#fetch-results)
- [Billing and limits](#billing-and-limits)
- [FAQ and troubleshooting](#faq-and-troubleshooting)

### What it does

The actor collects Requests for Quote (RFQs) and solicitations posted to the US Defense Logistics Agency DIBBS bid board. It clears the site access notice for you, reads the published RFQ feed, and writes one normalized record per RFQ to the run dataset.

Two ways to pull data:

- Browse mode: leave the NSN empty to walk the most recently posted RFQs across every stock class. Filter by item keyword, posted-since date and quote deadline.
- NSN mode: pass a National Stock Number to return every RFQ tied to that item, each already carrying set-aside, RFQ status, technical documents flag, issue date and full item name.

On top of the source fields, the actor derives the Federal Supply Class (FSC), the NIIN, days until the quote closes, an open/closed flag, and direct links to the RFQ record and its solicitation PDF. Missing source values are returned as `null`, never invented.

### Quickstart

Open the actor, paste this into the input, and press Run. It returns the 10 most recently posted defense RFQs whose item name contains "cable".

```json
{
  "keyword": "cable",
  "maxResults": 10,
  "withDetails": true
}
```

Leave every field empty to pull the most recently posted RFQs with no filter. To pull all RFQs for a specific item, set `nsn` (for example `8455-01-654-2769`).

### Input reference

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `keyword` | string | no | (empty) | Keep only RFQs whose item nomenclature contains this word, for example `bearing`, `valve`, `glove`, `cable`. |
| `nsn` | string | no | (empty) | Return every RFQ for one National Stock Number, for example `8455-01-654-2769` (dashes optional). Uses the DIBBS RFQ search directly and includes set-aside, status, technical documents and issue date per solicitation. |
| `setAside` | string | no | (empty) | Keep only RFQs whose set-aside label contains this text, for example `small business`, `sdvosb`, `hubzone`, `unrestricted`. Requires per-record details (on by default for paid runs). |
| `postedSince` | string | no | last 30 posting days | In browse mode, include only RFQs posted on or after this date (`YYYY-MM-DD`). Ignored when an NSN is set. |
| `closeBefore` | string | no | (empty) | Keep only RFQs whose return-by (quote deadline) date is on or before this date (`YYYY-MM-DD`). |
| `maxResults` | integer | no | `10` | Maximum RFQ records to return. Free Apify plans are capped at 10 per run. |
| `withDetails` | boolean | no | `true` | On by default for paid runs. In browse mode, enriches each RFQ with set-aside, status, technical documents flag, issue date and full item name. Charged only when the details are found. |
| `withAiSummary` | boolean | no | `false` | Off by default. For paid runs, adds a plain-language summary, likely bidder type and urgency rating per RFQ. Charged only when the AI returns a usable result. |

### Output reference

One dataset item per RFQ. Types: `string`, `integer`, `boolean`, or `null` when the source value is absent.

| Field | Type | Description |
|---|---|---|
| `solicitationNumber` | string | DIBBS solicitation / RFQ number, for example `SPE1C126Q0446`. |
| `solicitationType` | string | Type derived from the number: Request for Quote, Automated Request for Quote or Request for Proposal. |
| `nsn` | string | National Stock Number, formatted 4-2-3-4. |
| `niin` | string | 9-digit National Item Identification Number. |
| `fsc` | string | 4-digit Federal Supply Class of the item. |
| `nomenclature` | string | Item name. Full text when details are enriched, otherwise the short index form. |
| `quantity` | integer | Quantity requested. |
| `unitOfIssue` | string | Unit of issue code, for example `EA`, `PR`, `BX`, `FT`. |
| `purchaseRequest` | string | Purchase request (PR) number backing the RFQ. |
| `buyerOffice` | string | DLA buying office / routing identifier code. |
| `setAside` | string | Set-aside label, for example `Unrestricted/Not Set Aside` or `Total Small Business Set-Aside`. |
| `status` | string | RFQ status: `Posted`, `Open`, `Removed` or `Awarded`. |
| `technicalDocuments` | string | Technical documents availability text (`None` when there are none). |
| `technicalDocumentsFlag` | boolean | `true` when the RFQ has associated technical documents. |
| `postedDate` | string | Date the RFQ was posted (`YYYY-MM-DD`). |
| `issueDate` | string | Issue date of the solicitation (`YYYY-MM-DD`). |
| `returnByDate` | string | Quote return-by / close date (`YYYY-MM-DD`). |
| `daysUntilClose` | integer | Whole days between now and the return-by date; negative when already closed. |
| `isOpen` | boolean | `true` when the return-by date is today or later. |
| `rfqUrl` | string | Direct link to the RFQ record on DIBBS. |
| `pdfUrl` | string | Link to the solicitation PDF package. |
| `pdfFileName` | string | Solicitation PDF file name. |
| `aiPlainSummary` | string | Optional AI one-line summary of the RFQ (add-on). |
| `aiLikelyBidders` | string | Optional AI description of the supplier type likely to bid (add-on). |
| `aiUrgency` | string | Optional AI urgency rating: high, medium or low (add-on). |
| `source` | string | Data source host. |
| `observedAt` | string | ISO 8601 timestamp of when the record was collected. |
| `error` | string | `null` on success. On a failed run, a single item with a populated `error` field is written instead. |

### Example output record

Real record from a live NSN run (input `{"nsn": "8455-00-408-5292", "withAiSummary": true}`), with the AI add-on on:

```json
{
  "solicitationNumber": "SPE1C126Q0382",
  "solicitationType": "Request for Quote",
  "nsn": "8455-00-408-5292",
  "niin": "004085292",
  "fsc": "8455",
  "nomenclature": "INSIGNIA, GRADE, ENLI",
  "quantity": 60,
  "unitOfIssue": null,
  "purchaseRequest": "7017430273",
  "buyerOffice": null,
  "setAside": "Unrestricted/Not Set Aside",
  "status": "Open",
  "technicalDocuments": "None",
  "technicalDocumentsFlag": false,
  "postedDate": "2026-07-22",
  "issueDate": "2026-07-22",
  "returnByDate": "2026-07-29",
  "daysUntilClose": -23,
  "isOpen": false,
  "rfqUrl": "https://www.dibbs.bsm.dla.mil/rfq/rfqrec.aspx?sn=SPE1C126Q0382",
  "pdfUrl": "https://dibbs2.bsm.dla.mil/Downloads/RFQ/2/SPE1C126Q0382.PDF",
  "pdfFileName": null,
  "aiPlainSummary": "The DLA is seeking bids for 60 units of insignia, grade, ENLI with NSN 8455-00-408-5292.",
  "aiLikelyBidders": "Suppliers of military insignia and apparel",
  "aiUrgency": "high",
  "source": "dibbs.bsm.dla.mil",
  "observedAt": "2026-08-20T15:11:19.754Z",
  "error": null
}
```

### Run via API and CLI

Start a run and wait for it to finish, then read the dataset. Replace `<TOKEN>` with your Apify API token.

Run synchronously and get dataset items in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~dibbs-defense-rfq-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"keyword":"cable","maxResults":25,"withDetails":true}'
```

Start a run asynchronously:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~dibbs-defense-rfq-scraper/runs?token=<TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"nsn":"8455-01-654-2769","withAiSummary":true}'
```

Apify CLI:

```bash
apify call scrapers_lat/dibbs-defense-rfq-scraper \
  --input '{"keyword":"valve","maxResults":50}'
```

### Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing `format`:

```bash
## JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"

## CSV
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"

## Paginate large datasets
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
```

`<DATASET_ID>` is returned as `defaultDatasetId` in the run object. Use `offset` and `limit` to page through large result sets.

### Billing and limits

- **Pay per result.** You are charged per RFQ returned (`result` event). See the [pricing tab](https://apify.com/scrapers_lat/dibbs-defense-rfq-scraper/pricing) for the current per-result price.
- **Optional add-ons.** `details` enrichment (set-aside, status, technical documents) is on by default for paid runs and charged only when the extra fields are found. `ai_rfq_summary` is off by default and charged only when the AI returns a usable summary. Both add-ons are disabled for free plans.
- **No charge on failure.** If a run errors or matches nothing, the actor does not charge for results. Empty runs cost nothing.
- **Spend cap respected.** Set `maxTotalChargeUsd` on the run; once reached, the actor stops emitting and charging further billable records.
- **Free Apify plans** are capped at 10 records per run. Upgrade for higher `maxResults`.

### FAQ and troubleshooting

**A run returned 0 records. Why?**
In browse mode the source posts new RFQs on business days only, so a very narrow `postedSince` window plus a rare keyword can match nothing. Widen the date window or loosen the keyword. In NSN mode, the item may simply have no open or recent RFQs. Zero-result runs are not charged.

**How do I find only small business opportunities?**
Set `setAside` to `small business` (or `sdvosb`, `hubzone`, `wosb`). Set-aside filtering uses the per-record details, which are on by default for paid runs.

**How do I find RFQs closing soon?**
Set `closeBefore` to a near date, for example the end of the month, and sort or filter the output on `daysUntilClose`.

**What is the difference between browse mode and NSN mode?**
With no NSN, the actor lists recently posted RFQs across all stock classes. With an NSN, it returns every RFQ tied to that exact item, already enriched with set-aside, status and technical documents.

**Why is `unitOfIssue` or `buyerOffice` null on some records?**
Those two fields come from the recently-posted RFQ feed used in browse mode. NSN-mode records are sourced from the RFQ search, which does not publish them, so they are returned as `null` rather than guessed.

**Is this an official DLA tool?**
No. This actor is independent and not affiliated with the Defense Logistics Agency or the US Department of Defense. It reads only data that is publicly available on the DIBBS bid board.

### Related scrapers

- [SAM.gov Opportunities Scraper](https://apify.com/scrapers_lat/sam-gov-opportunities-scraper): US federal contract opportunities and notices.
- [USAspending Federal Award Scraper](https://apify.com/scrapers_lat/usaspending-awards-scraper): US federal prime awards.
- [Grants.gov Opportunity Scraper](https://apify.com/scrapers_lat/grants-gov-scraper): US federal grant opportunities.
- [World Bank Procurement Scraper](https://apify.com/scrapers_lat/world-bank-procurement-scraper): World Bank contract awards and notices.
- [SEC EDGAR Company Filings Scraper](https://apify.com/scrapers_lat/sec-edgar-filings-scraper): SEC filings by ticker or CIK.

### More scrapers at scrapers.lat

Built and maintained by [scrapers.lat](https://scrapers.lat), where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at [scrapers.lat](https://scrapers.lat).

***

> Independent tool, not affiliated with the Defense Logistics Agency or the US Department of Defense. Accesses only publicly available DIBBS bid board data.

# Actor input Schema

## `keyword` (type: `string`):

Filter RFQs whose item nomenclature contains this word, for example bearing, valve, glove, cable. Leave empty to return all recently posted RFQs.

## `nsn` (type: `string`):

Return every RFQ for one National Stock Number, for example 8455-00-408-5292 (dashes optional). When set, results are pulled directly from the DIBBS RFQ search and include set-aside, status, technical documents and issue date for each solicitation.

## `setAside` (type: `string`):

Keep only RFQs whose set-aside contains this text, for example small business, sdvosb, hubzone, unrestricted. Matched against the DIBBS set-aside label (requires per-record details, which are on by default for paid runs).

## `postedSince` (type: `string`):

In browse mode (no NSN), only include RFQs posted on or after this date. Defaults to the last 30 posting days. Ignored when an NSN is provided.

## `closeBefore` (type: `string`):

Keep only RFQs whose return-by (quote deadline) date is on or before this date. Useful to find soon-closing opportunities.

## `maxResults` (type: `integer`):

Maximum number of RFQ records to return. Free Apify plans are capped at 10 per run.

## `withDetails` (type: `boolean`):

On by default for paid runs. In browse mode, looks up each RFQ in the DIBBS search to add set-aside, RFQ status, technical documents flag, issue date and full item name. Charged only when the details are found.

## `withAiSummary` (type: `boolean`):

Off by default. For paid runs, adds a plain-language summary, the likely type of bidder and an urgency rating for each RFQ. Charged only when the AI returns a usable result.

## Actor input object example

```json
{
  "keyword": "insignia",
  "nsn": "8455-00-408-5292",
  "setAside": "small business",
  "postedSince": "2026-08-01",
  "closeBefore": "2026-09-30",
  "maxResults": 10,
  "withDetails": true,
  "withAiSummary": false
}
```

# Actor output Schema

## `results` (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 = {
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/dibbs-defense-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 = { "maxResults": 10 }

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

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

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

```

## CLI example

```bash
echo '{
  "maxResults": 10
}' |
apify call scrapers_lat/dibbs-defense-rfq-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapers_lat/dibbs-defense-rfq-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/frjE1KP6vs0z2e7C1/builds/RZWK8xLrkmgefNCwf/openapi.json
