Skip to content

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 | or OR for OR
  • Use , or AND for AND

Example: naics=541511|541512

Ordering

IDVs support ordering= with a strict allowlist:

  • award_date
  • obligated
  • total_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 limit to control page size.
  • Follow the next / previous URLs in responses.
  • If you’re constructing requests manually, you’ll typically pass a cursor parameter from the next URL.

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:

/api/idvs/?piid=<PIID>&shape=key,piid,gsa_elibrary(schedule,contract_number,sins,file_urls)

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);