IDVs¶
IDVs (Indefinite Delivery Vehicles) are awards exposed at /api/idvs/.
If you’re trying to work at the “solicitation that produced many IDV awards” level, also see Vehicles. For field definitions, see the IDVs Data Dictionary.
IDV responses include a vehicle UUID when the IDV is grouped under a Tango Vehicle, which you can use to fetch vehicle details at GET /api/vehicles/{uuid}/.
Endpoints¶
GET /api/idvs/(list + filtering + search + ordering)GET /api/idvs/{key}/(detail)GET /api/idvs/{key}/transactions/(detail transactions)GET /api/idvs/{key}/awards/(child awards / task orders under an IDV; behaves like/api/contracts/)GET /api/idvs/{key}/idvs/(child IDVs under an IDV; behaves like/api/idvs/)
Deprecated (legacy solicitation grouping):
GET /api/idvs/{identifier}/summary/GET /api/idvs/{identifier}/summary/awards/
Filtering¶
Swagger is the canonical list of query parameters. These are the core filters most people use day-to-day.
Text / parties¶
| Param | What it does |
|---|---|
search | Full-text-ish search across IDV search vectors (good for keywords). |
recipient | Search by recipient/vendor name. |
uei | Filter by recipient UEI (exact). |
piid | Filter by PIID (case-insensitive). |
solicitation_identifier | Filter by solicitation identifier (exact). |
obligated | Filter by obligated amount (exact USD value). |
ordering | Sort results (allowlist: award_date, obligated, total_contract_value; prefix with - for descending). |
Agencies¶
| Param | What it does |
|---|---|
awarding_agency | Filter by awarding agency (code/name/abbrev; best-effort matching). |
funding_agency | Filter by funding agency (code/name/abbrev; best-effort matching). |
Codes / set-asides / types¶
| Param | What it does |
|---|---|
naics | Filter by NAICS. |
psc | Filter by PSC. |
set_aside | Filter by set-aside. |
idv_type | Filter by IDV type code. |
Dates / fiscal years¶
| Param | What it does |
|---|---|
award_date | Award date (exact). |
award_date_gte, award_date_lte | Award date range. |
fiscal_year | Fiscal year (exact). |
fiscal_year_gte, fiscal_year_lte | Fiscal year range. |
Period of performance / ordering window¶
IDVs differ from contracts:
- They do not have contract-style period-of-performance end dates.
- The ordering window is typically expressed via last-date-to-order fields.
| Param | What it does |
|---|---|
pop_start_date_gte, pop_start_date_lte | Period of performance start date range. |
last_date_to_order_gte, last_date_to_order_lte | Last date to order range (primary IDV “expiring” concept). |
expiring_gte, expiring_lte | Alias for last-date-to-order range filters. |
Filter value syntax (AND / OR)¶
Some filters support basic boolean syntax:
- Use
|orORfor OR - Use
,orANDfor AND
Example: naics=541511|541512
Ordering¶
IDVs support ordering= with a strict allowlist:
award_dateobligatedtotal_contract_value
You can also filter exact obligations with obligated.
Examples:
- Newest first:
GET /api/idvs/?ordering=-award_date - Largest obligations first:
GET /api/idvs/?ordering=-obligated
Pagination¶
High-volume award endpoints use cursor-based (keyset) pagination.
- Use
limitto control page size. - Follow the
next/previousURLs in responses. - If you’re constructing requests manually, you’ll typically pass a
cursorparameter from thenextURL.
GSA eLibrary enrichment¶
IDV list and detail responses include best-effort enrichment from GSA eLibrary under gsa_elibrary (or null when no matching eLibrary row exists).
You can use shaping to request only the subfields you care about:
You can also query persisted eLibrary rows directly via GET /api/gsa_elibrary_contracts/.
SDK examples¶
The official SDKs don’t yet expose a first-class list_idvs() / listIdvs() method. Until they do, you can still call the endpoint via the SDK’s internal HTTP helper.
import os
from tango import TangoClient
client = TangoClient(api_key=os.environ["TANGO_API_KEY"])
# Workaround until the SDK ships a first-class list_idvs()
data = client._get(
"/api/idvs/",
params={
"search": "SEWP",
"ordering": "-award_date",
"limit": 10,
},
)
print("count:", data.get("count"))
print("first key:", (data.get("results") or [{}])[0].get("key"))
import { TangoClient } from "@makegov/tango-node";
const client = new TangoClient({ apiKey: process.env.TANGO_API_KEY });
// Workaround until the SDK ships a first-class listIdvs()
const http = (client as any).http;
const data = await http.get("/api/idvs/", {
search: "SEWP",
ordering: "-award_date",
limit: 10,
});
console.log("count:", data.count);
console.log("first key:", data?.results?.[0]?.key);