Skip to content

Identifier Validation

Validate the format of federal procurement identifiers. This endpoint is useful for intake forms, data cleaning pipelines, or integrations that need to check identifiers before submission.

Endpoint: POST /api/validate/

Overview

Given an identifier type and value, the endpoint returns a result of "valid", "not_valid", or "low_confidence". No database lookups are performed — this is pure format validation.

Supported identifier types:

Type Description Rules
piid Procurement Instrument Identifier FAR 4.201: 13–17 alphanumeric chars, valid AAC + fiscal year + instrument type + serial
solicitation Solicitation number 5–30 chars, contains both letters and digits, matches known procurement ID patterns
uei Unique Entity Identifier Exactly 12 alphanumeric chars, must not contain letters I or O

Result values

Result Meaning
valid Matches a known format with high confidence
not_valid Does not match any recognized format
low_confidence Plausible identifier but doesn't match a named pattern (solicitations only)

The low_confidence result only applies to solicitation numbers. Solicitation formats vary widely across agencies — some pass basic structural checks (alphanumeric, right length, mixed letters and digits) but don't match any of the ~25 known patterns derived from FPDS data. PIIDs and UEIs have strict formats, so they are always valid or not_valid.

Access: Requires Pro tier (Micro+). See Plans & Data Access for tier definitions.

Rate limiting: Standard API rate limits apply.

Request

POST /api/validate/
Content-Type: application/json
X-API-KEY: <key>

{
  "type": "piid",
  "value": "ABCDEF24C1234"
}

Request body fields

Field Type Required Description
type string Yes Identifier type: "piid", "solicitation", or "uei".
value string Yes Identifier value to validate (must be non-blank).

Response

Valid identifier (HTTP 200)

{
  "result": "valid",
  "type": "piid",
  "value": "ABCDEF24C1234"
}

Invalid identifier (HTTP 200)

For PIIDs, the response includes an errors array with specific validation failures:

{
  "result": "not_valid",
  "type": "piid",
  "value": "ABC",
  "errors": [
    "PIID must be 13-17 characters, got 3"
  ]
}

For solicitation numbers and UEIs, the response has no errors array:

{
  "result": "not_valid",
  "type": "uei",
  "value": "A1B2C3D4E5I6"
}

Low confidence (HTTP 200, solicitations only)

{
  "result": "low_confidence",
  "type": "solicitation",
  "value": "W911NF21C000100000000000000005"
}

Validation errors (HTTP 400)

Missing or invalid type:

{
  "error": "type must be one of: piid, solicitation, uei",
  "code": "validation_error"
}

Missing or blank value:

{
  "error": "value is required and must not be blank",
  "code": "validation_error"
}

Examples

Validate a PIID

curl -X POST https://tango.makegov.com/api/validate/ \
  -H "X-API-KEY: your-api-key" \
  -H "Content-Type: application/json" \
  -d '{"type": "piid", "value": "W58RGZ25F1234"}'

Validate a solicitation number

curl -X POST https://tango.makegov.com/api/validate/ \
  -H "X-API-KEY: your-api-key" \
  -H "Content-Type: application/json" \
  -d '{"type": "solicitation", "value": "SPE7A619T4321"}'

Validate a UEI

curl -X POST https://tango.makegov.com/api/validate/ \
  -H "X-API-KEY: your-api-key" \
  -H "Content-Type: application/json" \
  -d '{"type": "uei", "value": "A1B2C3D4E5F6"}'