Allowances API

Allowances API gives AI agents structured access to U.S. government per diem, travel and overseas allowance rates, through one remote MCP server covering GSA, DTMO and State Department (DSSR) data. Most per diem servers stop at GSA rates for the continental U.S. This one also covers Department of Defense OCONUS rates and State Department overseas allowances, so an agent can answer questions about domestic and foreign travel in one place. Coverage: - GSA: CONUS per diem by state, city, ZIP or destination, plus M&IE breakdowns, mileage rates, city-pair airfares and fleet vehicle rates - DTMO: DoD per diem for OCONUS locations (foreign countries, Alaska, Hawaii and U.S. territories) and CONUS - DSSR: State Department per diem, COLA, hardship, danger pay, LQA, TQSA and education allowances - FEMA: Hotel and Motel National Master List lookups for fire-safety-compliant lodging - OPM: General Schedule pay and locality data The server also includes trip per diem, mileage reimbursement and COLA calculators.

Hosted MCP Server

npx add-mcp 'https://mcp.allowancesapi.com'

Installs into Claude Code, Codex, Cursor and more

Documentation

API Reference

Government travel rates and overseas allowances.
One API, consistent responses.

Allowances API provides normalized, versioned access to U.S. Government travel per diem and overseas allowance rates from:

  • GSA (General Service Administration) CONUS per diem rates
  • DTMO (Defense Travel Management Office / Department of War) CONUS/OCONUS per diem rates for military personnel and contractors
  • DSSR (Department of State) OCONUS per diem rates and foreign allowances (e.g., COLA, hardship, LQA, danger pay, education) for foreign service personnel and contractors

Authentication

You need to include the X-API-Key:<your api key> header in requests to protected endpoints.
If you don´t, the API endpoint will return a 401 Unauthorized error. The public /v1/health liveness check requires no API key and does not count toward your quota.

MCP server

AI agents and MCP clients can call every /v1/ endpoint as a tool through the Streamable HTTP MCP server at https://mcp.allowancesapi.com/mcp. Initialization and tool discovery need no credentials; tool calls need the same X-API-Key header. The tool catalogue is listed under MCP below.

Dates and effective rates

Many endpoints accept a date query parameter to return the rate effective for a specific day. Accepted formats: YYYY-MM-DD or YYYYMMDD.

Verification URL

You can pass the include=verification_url query parameter to return an URL pointing to the official source for a given perdiem or allowance rate. The verification URL will dynamically include the country and location filter.

Example:

http://api.localhost/v1/dssr/perdiem/AU/location/10244?include=verification_url

Will include the following in the response:

"verification_url": "https://allowances.state.gov/Web920/search_action.asp?PostCode=10244&MenuHide=1&PerdiemBox=1&EffectiveDate=20260419",

Response shape

Responses are returned as JSON with consistent field names across sources whenever possible.

Errors and request IDs

Errors use a standardized JSON format and include a request_id. Every response includes an X-Request-ID header generated by the server.

Usage metering and quotas

Each plan has a monthly request quota enforced per account (not per API key).

The Make integration requires a paid plan; requests sent by the Make app from a Sandbox account are rejected with 403.

  • What counts: every /v1/ request that reaches a rate endpoint: GET lookups that are not served from cache, GET requests sent with X-Bypass-Cache: true or Cache-Control: no-cache, and all POST requests (calculators). One request is one unit regardless of the size of the result (a 366-day trip calculation is still one unit).
  • What does not count: responses served from the API cache (X-API-Cache: HIT), /v1/me, /v1/health, and requests rejected with 401/403 before the quota check.
  • Billing window: usage resets to zero at the end of your billing period. Paid plans follow their Stripe billing cycle, including while cancellation is scheduled. Sandbox accounts use consecutive calendar-month windows anchored on sign-up; after paid subscription termination, a fresh Sandbox window starts at the effective end. Anonymous Google Sheets add-on sessions use consecutive 30-day windows from the first session.
  • Checking usage: GET /v1/me returns monthly_queries_limit, used_queries, renewal_date (YYYY/MM/DD), period_start and period_end (ISO-8601, UTC). The window reported there is the one requests are counted against.
  • Over quota: requests return 429 Too Many Requests with X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Reset (seconds until the period ends) and X-RateLimit-Period-End (Unix timestamp).

Not affiliated with any government agency. Data is sourced from official public tables.

DSSR - OCONUS locations

GET /v1/dssr/allowances/{country_iso_code}

DSSR allowances by country

Parameters 4

country_iso_code stringrequired

path parameter

Example "BE"

type string[]

query parameter

Filter returned allowances. Unknown values are ignored.
If not specified, all allowances are returned.
Canonical values: cola, hardship, lqa, danger_pay, education, perdiem.
Aliases accepted: cost_of_living, cost-of-living, danger, danger-pay, livingquarters.

Example "cola"

verification_url boolean

query parameter

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

Example false

date string | null

query parameter

Specific date in YYYY-MM-DD format

Response schema 200

effective_date stringrequired

Biweekly publication date of the DSSR rates.

verification_url string | null

Optional. The official U.S. Department of State URL where this data can be verified. Add include=verification_url to your query to include it.

verification_url (anyOf 1) string

verification_url (anyOf 2) null

results object[]required

results[] object

results[].country stringrequired

The full, official name of the country recognized by the US Government.

results[].iso_code stringrequired

The 2-letter ISO 3166-1 alpha-2 country code.

results[].location stringrequired

The specific city, region, or installation name recognized by the DSSR.

results[].postcode string | null

The official DSSR Post Code identifier for this specific location.

results[].postcode (anyOf 1) string

results[].postcode (anyOf 2) null

results[].cola object | null

results[].cola (anyOf 1) object

results[].cola (anyOf 1).effective_date stringrequired

Biweekly publication date of the DSSR rates.

results[].cola (anyOf 1).post_allowance integerrequired

The Cost of Living Allowance rate, in percentage of base compensation.

results[].cola (anyOf 2) null

results[].hardship object | null

results[].hardship (anyOf 1) object

results[].hardship (anyOf 1).rate integerrequired

Post hardship differential rate, in percentage of base compensation.

results[].hardship (anyOf 1).effective_date stringrequired

Biweekly publication date of the DSSR rates.

results[].hardship (anyOf 2) null

results[].lqa object | null

results[].lqa (anyOf 1) object

results[].lqa (anyOf 1).with_family_group_2 integerrequired

results[].lqa (anyOf 1).with_family_group_3 integerrequired

results[].lqa (anyOf 1).with_family_group_4 integerrequired

results[].lqa (anyOf 1).without_family_group_2 integerrequired

results[].lqa (anyOf 1).without_family_group_3 integerrequired

results[].lqa (anyOf 1).without_family_group_4 integerrequired

results[].lqa (anyOf 1).effective_date stringrequired

Biweekly publication date of the DSSR rates.

results[].lqa (anyOf 2) null

results[].danger_pay object | null

results[].danger_pay (anyOf 1) object

results[].danger_pay (anyOf 2) null

results[].education object[] | null

results[].education (anyOf 1) object[]

results[].education (anyOf 1)[] object

results[].education (anyOf 2) null

results[].perdiem object[] | null

results[].perdiem (anyOf 1) object[]

results[].perdiem (anyOf 1)[] object

results[].perdiem (anyOf 1)[].lodging integerrequired

The maximum lodging allowance in USD per day.

results[].perdiem (anyOf 1)[].meals_incidental integerrequired

The maximum meals and incidental expenses (M&IE) allowance in USD per day.

results[].perdiem (anyOf 1)[].maximum_perdiem integerrequired

The maximum total per diem rate, calculated as the sum of lodging + meals and incidental

results[].perdiem (anyOf 1)[].season string

The season number in format 'S1'/'S2'

results[].perdiem (anyOf 1)[].season_begin stringrequired

The starting month and day for this seasonal rate.

results[].perdiem (anyOf 1)[].season_end stringrequired

results[].perdiem (anyOf 1)[].publish_date stringrequired

The latest publication date for this rate

results[].perdiem (anyOf 1)[].effective_date stringrequired

The date of the last update for this rate. A rate can be published for months or years (publish_date) without changing (effective_date stays the same).

results[].perdiem (anyOf 1)[].footnote_reference string | null

results[].perdiem (anyOf 1)[].footnote_reference (anyOf 1) string

results[].perdiem (anyOf 1)[].footnote_reference (anyOf 2) null

results[].perdiem (anyOf 2) null

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET 'https://api.allowancesapi.com/v1/dssr/allowances/LU?date=2026-07-11&type=cola&verification_url=true' \
  -H "X-API-Key: YOUR_KEY"

Response to GET /v1/dssr/allowances/LU?date=2026-07-11&type=cola&verification_url=true. Post allowance is a percentage.

{
  "effective_date": "2026-06-28",
  "verification_url": "https://allowances.state.gov/Web920/search_action.asp?PostCode=11063&MenuHide=1&COLABox=1&EffectiveDate=20260628",
  "results": [
    {
      "country": "Luxembourg",
      "iso_code": "LU",
      "location": "Luxembourg",
      "postcode": "11063",
      "cola": {
        "effective_date": "2026-06-28",
        "post_allowance": 50
      },
      "hardship": null,
      "lqa": null,
      "danger_pay": null,
      "education": null,
      "perdiem": null
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/dssr/allowances/{country_iso_code}/location/{location}

DSSR allowances by location name

Parameters 5

location stringrequired

path parameter

Example "LOCATION"

country_iso_code stringrequired

path parameter

Example "BE"

type string[]

query parameter

Filter returned allowances. Unknown values are ignored.
If not specified, all allowances are returned.
Canonical values: cola, hardship, lqa, danger_pay, education, perdiem.
Aliases accepted: cost_of_living, cost-of-living, danger, danger-pay, livingquarters.

Example "cola"

verification_url boolean

query parameter

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

Example false

date string | null

query parameter

Specific date in YYYY-MM-DD format

Response schema 200

effective_date stringrequired

Biweekly publication date of the DSSR rates.

verification_url string | null

Optional. The official U.S. Department of State URL where this data can be verified. Add include=verification_url to your query to include it.

verification_url (anyOf 1) string

verification_url (anyOf 2) null

results object[]required

results[] object

results[].country stringrequired

The full, official name of the country recognized by the US Government.

results[].iso_code stringrequired

The 2-letter ISO 3166-1 alpha-2 country code.

results[].location stringrequired

The specific city, region, or installation name recognized by the DSSR.

results[].postcode string | null

The official DSSR Post Code identifier for this specific location.

results[].postcode (anyOf 1) string

results[].postcode (anyOf 2) null

results[].cola object | null

results[].cola (anyOf 1) object

results[].cola (anyOf 1).effective_date stringrequired

Biweekly publication date of the DSSR rates.

results[].cola (anyOf 1).post_allowance integerrequired

The Cost of Living Allowance rate, in percentage of base compensation.

results[].cola (anyOf 2) null

results[].hardship object | null

results[].hardship (anyOf 1) object

results[].hardship (anyOf 1).rate integerrequired

Post hardship differential rate, in percentage of base compensation.

results[].hardship (anyOf 1).effective_date stringrequired

Biweekly publication date of the DSSR rates.

results[].hardship (anyOf 2) null

results[].lqa object | null

results[].lqa (anyOf 1) object

results[].lqa (anyOf 1).with_family_group_2 integerrequired

results[].lqa (anyOf 1).with_family_group_3 integerrequired

results[].lqa (anyOf 1).with_family_group_4 integerrequired

results[].lqa (anyOf 1).without_family_group_2 integerrequired

results[].lqa (anyOf 1).without_family_group_3 integerrequired

results[].lqa (anyOf 1).without_family_group_4 integerrequired

results[].lqa (anyOf 1).effective_date stringrequired

Biweekly publication date of the DSSR rates.

results[].lqa (anyOf 2) null

results[].danger_pay object | null

results[].danger_pay (anyOf 1) object

results[].danger_pay (anyOf 2) null

results[].education object[] | null

results[].education (anyOf 1) object[]

results[].education (anyOf 1)[] object

results[].education (anyOf 2) null

results[].perdiem object[] | null

results[].perdiem (anyOf 1) object[]

results[].perdiem (anyOf 1)[] object

results[].perdiem (anyOf 1)[].lodging integerrequired

The maximum lodging allowance in USD per day.

results[].perdiem (anyOf 1)[].meals_incidental integerrequired

The maximum meals and incidental expenses (M&IE) allowance in USD per day.

results[].perdiem (anyOf 1)[].maximum_perdiem integerrequired

The maximum total per diem rate, calculated as the sum of lodging + meals and incidental

results[].perdiem (anyOf 1)[].season string

The season number in format 'S1'/'S2'

results[].perdiem (anyOf 1)[].season_begin stringrequired

The starting month and day for this seasonal rate.

results[].perdiem (anyOf 1)[].season_end stringrequired

results[].perdiem (anyOf 1)[].publish_date stringrequired

The latest publication date for this rate

results[].perdiem (anyOf 1)[].effective_date stringrequired

The date of the last update for this rate. A rate can be published for months or years (publish_date) without changing (effective_date stays the same).

results[].perdiem (anyOf 1)[].footnote_reference string | null

results[].perdiem (anyOf 1)[].footnote_reference (anyOf 1) string

results[].perdiem (anyOf 1)[].footnote_reference (anyOf 2) null

results[].perdiem (anyOf 2) null

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET 'https://api.allowancesapi.com/v1/dssr/allowances/LU/location/Luxembourg?date=2026-07-11&type=cola&verification_url=true' \
  -H "X-API-Key: YOUR_KEY"

Response to GET /v1/dssr/allowances/LU/location/Luxembourg?date=2026-07-11&type=cola&verification_url=true. Post allowance is a percentage.

{
  "effective_date": "2026-06-28",
  "verification_url": "https://allowances.state.gov/Web920/search_action.asp?PostCode=11063&MenuHide=1&COLABox=1&EffectiveDate=20260628",
  "results": [
    {
      "country": "Luxembourg",
      "iso_code": "LU",
      "location": "Luxembourg",
      "postcode": "11063",
      "cola": {
        "effective_date": "2026-06-28",
        "post_allowance": 50
      },
      "hardship": null,
      "lqa": null,
      "danger_pay": null,
      "education": null,
      "perdiem": null
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/dssr/allowances/{country_iso_code}/postcode/{postcode}

DSSR allowances by location post code

Parameters 5

postcode integerrequired

path parameter

5-digit DSSR post code (no zero-padding)

Example 12345

country_iso_code stringrequired

path parameter

Example "BE"

type string[]

query parameter

Filter returned allowances. Unknown values are ignored.
If not specified, all allowances are returned.
Canonical values: cola, hardship, lqa, danger_pay, education, perdiem.
Aliases accepted: cost_of_living, cost-of-living, danger, danger-pay, livingquarters.

Example "cola"

verification_url boolean

query parameter

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

Example false

date string | null

query parameter

Specific date in YYYY-MM-DD format

Response schema 200

effective_date stringrequired

Biweekly publication date of the DSSR rates.

verification_url string | null

Optional. The official U.S. Department of State URL where this data can be verified. Add include=verification_url to your query to include it.

verification_url (anyOf 1) string

verification_url (anyOf 2) null

results object[]required

results[] object

results[].country stringrequired

The full, official name of the country recognized by the US Government.

results[].iso_code stringrequired

The 2-letter ISO 3166-1 alpha-2 country code.

results[].location stringrequired

The specific city, region, or installation name recognized by the DSSR.

results[].postcode string | null

The official DSSR Post Code identifier for this specific location.

results[].postcode (anyOf 1) string

results[].postcode (anyOf 2) null

results[].cola object | null

results[].cola (anyOf 1) object

results[].cola (anyOf 1).effective_date stringrequired

Biweekly publication date of the DSSR rates.

results[].cola (anyOf 1).post_allowance integerrequired

The Cost of Living Allowance rate, in percentage of base compensation.

results[].cola (anyOf 2) null

results[].hardship object | null

results[].hardship (anyOf 1) object

results[].hardship (anyOf 1).rate integerrequired

Post hardship differential rate, in percentage of base compensation.

results[].hardship (anyOf 1).effective_date stringrequired

Biweekly publication date of the DSSR rates.

results[].hardship (anyOf 2) null

results[].lqa object | null

results[].lqa (anyOf 1) object

results[].lqa (anyOf 1).with_family_group_2 integerrequired

results[].lqa (anyOf 1).with_family_group_3 integerrequired

results[].lqa (anyOf 1).with_family_group_4 integerrequired

results[].lqa (anyOf 1).without_family_group_2 integerrequired

results[].lqa (anyOf 1).without_family_group_3 integerrequired

results[].lqa (anyOf 1).without_family_group_4 integerrequired

results[].lqa (anyOf 1).effective_date stringrequired

Biweekly publication date of the DSSR rates.

results[].lqa (anyOf 2) null

results[].danger_pay object | null

results[].danger_pay (anyOf 1) object

results[].danger_pay (anyOf 2) null

results[].education object[] | null

results[].education (anyOf 1) object[]

results[].education (anyOf 1)[] object

results[].education (anyOf 2) null

results[].perdiem object[] | null

results[].perdiem (anyOf 1) object[]

results[].perdiem (anyOf 1)[] object

results[].perdiem (anyOf 1)[].lodging integerrequired

The maximum lodging allowance in USD per day.

results[].perdiem (anyOf 1)[].meals_incidental integerrequired

The maximum meals and incidental expenses (M&IE) allowance in USD per day.

results[].perdiem (anyOf 1)[].maximum_perdiem integerrequired

The maximum total per diem rate, calculated as the sum of lodging + meals and incidental

results[].perdiem (anyOf 1)[].season string

The season number in format 'S1'/'S2'

results[].perdiem (anyOf 1)[].season_begin stringrequired

The starting month and day for this seasonal rate.

results[].perdiem (anyOf 1)[].season_end stringrequired

results[].perdiem (anyOf 1)[].publish_date stringrequired

The latest publication date for this rate

results[].perdiem (anyOf 1)[].effective_date stringrequired

The date of the last update for this rate. A rate can be published for months or years (publish_date) without changing (effective_date stays the same).

results[].perdiem (anyOf 1)[].footnote_reference string | null

results[].perdiem (anyOf 1)[].footnote_reference (anyOf 1) string

results[].perdiem (anyOf 1)[].footnote_reference (anyOf 2) null

results[].perdiem (anyOf 2) null

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET 'https://api.allowancesapi.com/v1/dssr/allowances/LU/postcode/11063?date=2026-07-11&type=cola&verification_url=true' \
  -H "X-API-Key: YOUR_KEY"

Response to GET /v1/dssr/allowances/LU/postcode/11063?date=2026-07-11&type=cola&verification_url=true. Post allowance is a percentage.

{
  "effective_date": "2026-06-28",
  "verification_url": "https://allowances.state.gov/Web920/search_action.asp?PostCode=11063&MenuHide=1&COLABox=1&EffectiveDate=20260628",
  "results": [
    {
      "country": "Luxembourg",
      "iso_code": "LU",
      "location": "Luxembourg",
      "postcode": "11063",
      "cola": {
        "effective_date": "2026-06-28",
        "post_allowance": 50
      },
      "hardship": null,
      "lqa": null,
      "danger_pay": null,
      "education": null,
      "perdiem": null
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/dssr/perdiem/search

Search DSSR Per Diem by country/location name

Search globally by case-insensitive substring of a location or country name.

The date selects effective and seasonal rates and defaults to today. The response effective_date is the first day of the selected month. Missing, blank, or fewer than three characters after trimming returns HTTP 422. A valid search with no matching rates returns HTTP 404.

Parameters 2

q stringrequired

query parameter

Required case-insensitive substring of a location or country name; at least three characters after trimming.

Example "Q"

date string | null

query parameter

Specific date in YYYY-MM-DD format

Response schema 200

effective_date stringrequired

Biweekly publication date of the DSSR rates.

verification_url string | null

Optional. The official U.S. Department of State URL where this data can be verified. Add include=verification_url to your query to include it.

verification_url (anyOf 1) string

verification_url (anyOf 2) null

results object[]required

results[] object

results[].country stringrequired

The full, official name of the country recognized by the US Government.

results[].iso_code stringrequired

The 2-letter ISO 3166-1 alpha-2 country code.

results[].location stringrequired

The specific city, region, or installation name recognized by the DSSR.

results[].postcode string | null

The official DSSR Post Code identifier for this specific location.

results[].postcode (anyOf 1) string

results[].postcode (anyOf 2) null

results[].perdiem object[] | null

results[].perdiem (anyOf 1) object[]

results[].perdiem (anyOf 1)[] object

results[].perdiem (anyOf 1)[].lodging integerrequired

The maximum lodging allowance in USD per day.

results[].perdiem (anyOf 1)[].meals_incidental integerrequired

The maximum meals and incidental expenses (M&IE) allowance in USD per day.

results[].perdiem (anyOf 1)[].maximum_perdiem integerrequired

The maximum total per diem rate, calculated as the sum of lodging + meals and incidental

results[].perdiem (anyOf 1)[].season string

The season number in format 'S1'/'S2'

results[].perdiem (anyOf 1)[].season_begin stringrequired

The starting month and day for this seasonal rate.

results[].perdiem (anyOf 1)[].season_end stringrequired

results[].perdiem (anyOf 1)[].publish_date stringrequired

The latest publication date for this rate

results[].perdiem (anyOf 1)[].effective_date stringrequired

The date of the last update for this rate. A rate can be published for months or years (publish_date) without changing (effective_date stays the same).

results[].perdiem (anyOf 1)[].footnote_reference string | null

results[].perdiem (anyOf 1)[].footnote_reference (anyOf 1) string

results[].perdiem (anyOf 1)[].footnote_reference (anyOf 2) null

results[].perdiem (anyOf 2) null

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET 'https://api.allowancesapi.com/v1/dssr/perdiem/search?q=Luxembourg&date=2026-07-11' \
  -H "X-API-Key: YOUR_KEY"

Response to GET /v1/dssr/perdiem/search?q=Luxembourg&date=2026-07-11. Amounts are in USD per day.

{
  "effective_date": "2026-07-01",
  "verification_url": null,
  "results": [
    {
      "country": "Luxembourg",
      "iso_code": "LU",
      "location": "Luxembourg",
      "postcode": "11063",
      "perdiem": [
        {
          "lodging": 366,
          "meals_incidental": 138,
          "maximum_perdiem": 504,
          "season": "S1",
          "season_begin": "01/01",
          "season_end": "12/31",
          "publish_date": "2026-07-01",
          "effective_date": "2025-08-01",
          "footnote_reference": null
        }
      ]
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/dssr/perdiem/{country_iso_code}

DSSR per diem by country

Parameters 3

country_iso_code stringrequired

path parameter

Example "BE"

verification_url boolean

query parameter

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

Example false

date string | null

query parameter

Specific date in YYYY-MM-DD format

Response schema 200

effective_date stringrequired

Biweekly publication date of the DSSR rates.

verification_url string | null

Optional. The official U.S. Department of State URL where this data can be verified. Add include=verification_url to your query to include it.

verification_url (anyOf 1) string

verification_url (anyOf 2) null

results object[]required

results[] object

results[].country stringrequired

The full, official name of the country recognized by the US Government.

results[].iso_code stringrequired

The 2-letter ISO 3166-1 alpha-2 country code.

results[].location stringrequired

The specific city, region, or installation name recognized by the DSSR.

results[].postcode string | null

The official DSSR Post Code identifier for this specific location.

results[].postcode (anyOf 1) string

results[].postcode (anyOf 2) null

results[].perdiem object[] | null

results[].perdiem (anyOf 1) object[]

results[].perdiem (anyOf 1)[] object

results[].perdiem (anyOf 1)[].lodging integerrequired

The maximum lodging allowance in USD per day.

results[].perdiem (anyOf 1)[].meals_incidental integerrequired

The maximum meals and incidental expenses (M&IE) allowance in USD per day.

results[].perdiem (anyOf 1)[].maximum_perdiem integerrequired

The maximum total per diem rate, calculated as the sum of lodging + meals and incidental

results[].perdiem (anyOf 1)[].season string

The season number in format 'S1'/'S2'

results[].perdiem (anyOf 1)[].season_begin stringrequired

The starting month and day for this seasonal rate.

results[].perdiem (anyOf 1)[].season_end stringrequired

results[].perdiem (anyOf 1)[].publish_date stringrequired

The latest publication date for this rate

results[].perdiem (anyOf 1)[].effective_date stringrequired

The date of the last update for this rate. A rate can be published for months or years (publish_date) without changing (effective_date stays the same).

results[].perdiem (anyOf 1)[].footnote_reference string | null

results[].perdiem (anyOf 1)[].footnote_reference (anyOf 1) string

results[].perdiem (anyOf 1)[].footnote_reference (anyOf 2) null

results[].perdiem (anyOf 2) null

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET 'https://api.allowancesapi.com/v1/dssr/perdiem/LU?date=2026-07-11&verification_url=true' \
  -H "X-API-Key: YOUR_KEY"

Response to GET /v1/dssr/perdiem/LU?date=2026-07-11&verification_url=true. Amounts are in USD per day.

{
  "effective_date": "2026-07-01",
  "verification_url": "https://allowances.state.gov/Web920/search_action.asp?PostCode=11063&MenuHide=1&PerdiemBox=1&EffectiveDate=20260701",
  "results": [
    {
      "country": "Luxembourg",
      "iso_code": "LU",
      "location": "Luxembourg",
      "postcode": "11063",
      "perdiem": [
        {
          "lodging": 366,
          "meals_incidental": 138,
          "maximum_perdiem": 504,
          "season": "S1",
          "season_begin": "01/01",
          "season_end": "12/31",
          "publish_date": "2026-07-01",
          "effective_date": "2025-08-01",
          "footnote_reference": null
        }
      ]
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/dssr/perdiem/{country_iso_code}/location/{location}

DSSR per diem by location name

Parameters 4

location stringrequired

path parameter

Example "LOCATION"

country_iso_code stringrequired

path parameter

Example "BE"

verification_url boolean

query parameter

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

Example false

date string | null

query parameter

Specific date in YYYY-MM-DD format

Response schema 200

effective_date stringrequired

Biweekly publication date of the DSSR rates.

verification_url string | null

Optional. The official U.S. Department of State URL where this data can be verified. Add include=verification_url to your query to include it.

verification_url (anyOf 1) string

verification_url (anyOf 2) null

results object[]required

results[] object

results[].country stringrequired

The full, official name of the country recognized by the US Government.

results[].iso_code stringrequired

The 2-letter ISO 3166-1 alpha-2 country code.

results[].location stringrequired

The specific city, region, or installation name recognized by the DSSR.

results[].postcode string | null

The official DSSR Post Code identifier for this specific location.

results[].postcode (anyOf 1) string

results[].postcode (anyOf 2) null

results[].perdiem object[] | null

results[].perdiem (anyOf 1) object[]

results[].perdiem (anyOf 1)[] object

results[].perdiem (anyOf 1)[].lodging integerrequired

The maximum lodging allowance in USD per day.

results[].perdiem (anyOf 1)[].meals_incidental integerrequired

The maximum meals and incidental expenses (M&IE) allowance in USD per day.

results[].perdiem (anyOf 1)[].maximum_perdiem integerrequired

The maximum total per diem rate, calculated as the sum of lodging + meals and incidental

results[].perdiem (anyOf 1)[].season string

The season number in format 'S1'/'S2'

results[].perdiem (anyOf 1)[].season_begin stringrequired

The starting month and day for this seasonal rate.

results[].perdiem (anyOf 1)[].season_end stringrequired

results[].perdiem (anyOf 1)[].publish_date stringrequired

The latest publication date for this rate

results[].perdiem (anyOf 1)[].effective_date stringrequired

The date of the last update for this rate. A rate can be published for months or years (publish_date) without changing (effective_date stays the same).

results[].perdiem (anyOf 1)[].footnote_reference string | null

results[].perdiem (anyOf 1)[].footnote_reference (anyOf 1) string

results[].perdiem (anyOf 1)[].footnote_reference (anyOf 2) null

results[].perdiem (anyOf 2) null

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET 'https://api.allowancesapi.com/v1/dssr/perdiem/LU/location/Luxembourg?date=2026-07-11&verification_url=true' \
  -H "X-API-Key: YOUR_KEY"

Response to GET /v1/dssr/perdiem/LU/location/Luxembourg?date=2026-07-11&verification_url=true. Amounts are in USD per day.

{
  "effective_date": "2026-07-01",
  "verification_url": "https://allowances.state.gov/Web920/search_action.asp?PostCode=11063&MenuHide=1&PerdiemBox=1&EffectiveDate=20260701",
  "results": [
    {
      "country": "Luxembourg",
      "iso_code": "LU",
      "location": "Luxembourg",
      "postcode": "11063",
      "perdiem": [
        {
          "lodging": 366,
          "meals_incidental": 138,
          "maximum_perdiem": 504,
          "season": "S1",
          "season_begin": "01/01",
          "season_end": "12/31",
          "publish_date": "2026-07-01",
          "effective_date": "2025-08-01",
          "footnote_reference": null
        }
      ]
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/dssr/perdiem/{country_iso_code}/postcode/{postcode}

DSSR per diem by location post code

Parameters 4

postcode integerrequired

path parameter

5-digit DSSR post code (no zero-padding)

Example 12345

country_iso_code stringrequired

path parameter

Example "BE"

verification_url boolean

query parameter

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

Example false

date string | null

query parameter

Specific date in YYYY-MM-DD format

Response schema 200

effective_date stringrequired

Biweekly publication date of the DSSR rates.

verification_url string | null

Optional. The official U.S. Department of State URL where this data can be verified. Add include=verification_url to your query to include it.

verification_url (anyOf 1) string

verification_url (anyOf 2) null

results object[]required

results[] object

results[].country stringrequired

The full, official name of the country recognized by the US Government.

results[].iso_code stringrequired

The 2-letter ISO 3166-1 alpha-2 country code.

results[].location stringrequired

The specific city, region, or installation name recognized by the DSSR.

results[].postcode string | null

The official DSSR Post Code identifier for this specific location.

results[].postcode (anyOf 1) string

results[].postcode (anyOf 2) null

results[].perdiem object[] | null

results[].perdiem (anyOf 1) object[]

results[].perdiem (anyOf 1)[] object

results[].perdiem (anyOf 1)[].lodging integerrequired

The maximum lodging allowance in USD per day.

results[].perdiem (anyOf 1)[].meals_incidental integerrequired

The maximum meals and incidental expenses (M&IE) allowance in USD per day.

results[].perdiem (anyOf 1)[].maximum_perdiem integerrequired

The maximum total per diem rate, calculated as the sum of lodging + meals and incidental

results[].perdiem (anyOf 1)[].season string

The season number in format 'S1'/'S2'

results[].perdiem (anyOf 1)[].season_begin stringrequired

The starting month and day for this seasonal rate.

results[].perdiem (anyOf 1)[].season_end stringrequired

results[].perdiem (anyOf 1)[].publish_date stringrequired

The latest publication date for this rate

results[].perdiem (anyOf 1)[].effective_date stringrequired

The date of the last update for this rate. A rate can be published for months or years (publish_date) without changing (effective_date stays the same).

results[].perdiem (anyOf 1)[].footnote_reference string | null

results[].perdiem (anyOf 1)[].footnote_reference (anyOf 1) string

results[].perdiem (anyOf 1)[].footnote_reference (anyOf 2) null

results[].perdiem (anyOf 2) null

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET 'https://api.allowancesapi.com/v1/dssr/perdiem/LU/postcode/11063?date=2026-07-11&verification_url=true' \
  -H "X-API-Key: YOUR_KEY"

Response to GET /v1/dssr/perdiem/LU/postcode/11063?date=2026-07-11&verification_url=true. Amounts are in USD per day.

{
  "effective_date": "2026-07-01",
  "verification_url": "https://allowances.state.gov/Web920/search_action.asp?PostCode=11063&MenuHide=1&PerdiemBox=1&EffectiveDate=20260701",
  "results": [
    {
      "country": "Luxembourg",
      "iso_code": "LU",
      "location": "Luxembourg",
      "postcode": "11063",
      "perdiem": [
        {
          "lodging": 366,
          "meals_incidental": 138,
          "maximum_perdiem": 504,
          "season": "S1",
          "season_begin": "01/01",
          "season_end": "12/31",
          "publish_date": "2026-07-01",
          "effective_date": "2025-08-01",
          "footnote_reference": null
        }
      ]
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/dssr/locations

List DSSR locations

Return DSSR locations, optionally filtered by q=.

The response is paginated and includes the total number of matching locations (ignoring pagination) along with the offset and limit that were applied.

Parameters 3

q string | null

query parameter

Search by name

Example "Q"

offset integer

query parameter

Example 0

limit integer

query parameter

Example 10

Response schema 200

total integerrequired

Total number of locations matching the query, ignoring pagination.

offset integerrequired

The offset that was applied to this result set.

limit integerrequired

The maximum number of items returned in this result set.

items object[]required

items[] object

items[].country stringrequired

The full, official name of the country recognized by the US Government.

items[].iso_code stringrequired

The 2-letter ISO 3166-1 alpha-2 country code.

items[].name stringrequired

The specific city, region, or installation name recognized by the DSSR.

items[].source stringrequired

The authoritative government source of this location and rate data.

Allowed values: ["DSSR", "DTMO", "GSA", "dssr", "dtmo", "gsa"]

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET 'https://api.allowancesapi.com/v1/dssr/locations?q=Brussels&offset=0&limit=1' \
  -H "X-API-Key: YOUR_KEY"

Response to GET /v1/dssr/locations?q=Brussels&offset=0&limit=1.

{
  "total": 1,
  "offset": 0,
  "limit": 1,
  "items": [
    {
      "country": "Belgium",
      "iso_code": "BE",
      "name": "Brussels",
      "source": "dssr"
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/dssr/countries

Resolve a country name to its ISO code and list its posts

Parameters 3

q string | null

query parameter

Search by country name

Example "Q"

offset integer

query parameter

Example 0

limit integer

query parameter

Example 20

Response schema 200

(body) object[]

[] object

[].name stringrequired

The full, official name of the country recognized by the US Government.

[].iso_code stringrequired

The 2-letter ISO 3166-1 alpha-2 country code.

[].locations string[]required

[].locations[] string

The specific city, region, or installation name recognized by the DSSR.

[].notes string[]required

Any special considerations regarding the country are listed in the notes.

[].notes[] string

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET 'https://api.allowancesapi.com/v1/dssr/countries?q=Luxembourg&limit=1&offset=0' \
  -H "X-API-Key: YOUR_KEY"

Response to GET /v1/dssr/countries?q=Luxembourg&limit=1&offset=0.

[
  {
    "name": "Luxembourg",
    "iso_code": "LU",
    "locations": [
      "Luxembourg"
    ],
    "notes": []
  }
]

Example response. Rates and dates are illustrative.

GET /v1/dssr/country/{country_iso_code}

Get country by ISO code

Parameters 1

country_iso_code stringrequired

path parameter

Example "BE"

Response schema 200

name stringrequired

The full, official name of the country recognized by the US Government.

iso_code stringrequired

The 2-letter ISO 3166-1 alpha-2 country code.

locations string[]required

locations[] string

The specific city, region, or installation name recognized by the DSSR.

notes string[]required

Any special considerations regarding the country are listed in the notes.

notes[] string

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET https://api.allowancesapi.com/v1/dssr/country/LU \
  -H "X-API-Key: YOUR_KEY"

Response to GET /v1/dssr/country/LU.

{
  "name": "Luxembourg",
  "iso_code": "LU",
  "locations": [
    "Luxembourg"
  ],
  "notes": []
}

Example response. Rates and dates are illustrative.

GET /v1/dssr/country/{country_iso_code}/locations

List DSSR locations by country

Return all DSSR locations for a specific country using its ISO alpha-2 code (e.g., 'AF', 'DE')

Parameters 1

country_iso_code stringrequired

path parameter

Example "BE"

Response schema 200

name stringrequired

The full, official name of the country recognized by the US Government.

iso_code stringrequired

The 2-letter ISO 3166-1 alpha-2 country code.

locations object[]

locations[] object

locations[].name stringrequired

The specific city, region, or installation name recognized by the DSSR.

locations[].external_id stringrequired

The unique postcode id assigned by DSSR for the locations. Format is a 5 digits number passed as string. Some specials cases may have a different external_id.

locations[].source stringrequired

The authoritative government source of this location and rate data.

Allowed values: ["DSSR", "DTMO", "GSA", "dssr", "dtmo", "gsa"]

notes string[]required

Any special considerations regarding the country are listed in the notes.

notes[] string

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET https://api.allowancesapi.com/v1/dssr/country/LU/locations \
  -H "X-API-Key: YOUR_KEY"

Response to GET /v1/dssr/country/LU/locations.

{
  "name": "Luxembourg",
  "iso_code": "LU",
  "locations": [
    {
      "name": "Luxembourg",
      "external_id": "11063",
      "source": "dssr"
    }
  ],
  "notes": []
}

Example response. Rates and dates are illustrative.

GET /v1/dssr/cola-calculator/postcode/{postcode}

DSSR COLA calculator by postcode

Returns the rate in percentage, the annual and the biweekly amounts of cost of living allowance (COLA) for a given DSSR postcode. Use this endpoint to automate your COLA calculations and replace the official excel file.

Parameters 4

postcode integerrequired

path parameter

5-digit DSSR post code (no zero-padding)

Example 12345

family_size integerrequired

query parameter

The number of family members, including the FS/DoS employee/contractor

Example 1

base_salary integerrequired

query parameter

Basic annual salary, excluding U.S. locality pay; including Overseas Comparability Pay.

Example 1

date string | null

query parameter

Specific date in YYYY-MM-DD format

Response schema 200

effective_date stringrequired

Biweekly publication date of the DSSR rates.

base_salary integerrequired

family_size integerrequired

cola_rate integerrequired

annual_cola integerrequired

biweekly_cola integerrequired

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET 'https://api.allowancesapi.com/v1/dssr/cola-calculator/postcode/11063?date=2026-07-11&family_size=2&base_salary=100000' \
  -H "X-API-Key: YOUR_KEY"

Response to GET /v1/dssr/cola-calculator/postcode/11063?date=2026-07-11&family_size=2&base_salary=100000. Salary and allowance amounts are in USD; cola_rate is a percentage.

{
  "effective_date": "2026-06-28",
  "base_salary": 100000,
  "family_size": 2,
  "cola_rate": 50,
  "annual_cola": 20900,
  "biweekly_cola": 802
}

Example response. Rates and dates are illustrative.

DTMO - Mil. CONUS/OCONUS

GET /v1/dtmo/perdiem/conus/{state_iso}

Get perdiem CONUS

Department of Defense per diem for the continental U.S. by state code (e.g. 'TX'); Alaska, Hawaii and the territories are served by the OCONUS endpoint. Returns lodging, local and proportional meal rates, incidentals and the maximum per diem (lodging + meals + incidentals) per season. q filters by location name. date selects the rates in force on that day, year a fiscal year (Oct 1 to Sep 30); omit both for the current fiscal year.

Parameters 7

state_iso stringrequired

path parameter

Example "US-AL"

year integer

query parameter

Example 1

verification_url boolean

query parameter

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

Example false

q string | null

query parameter

Search by location name or state/country name

Example "Q"

offset integer

query parameter

Example 0

limit integer

query parameter

Example 50

date string | null

query parameter

Specific date in YYYY-MM-DD format

Response schema 200

effective_date stringrequired

verification_url string | null

verification_url (anyOf 1) string

verification_url (anyOf 2) null

results object[]required

results[] object

results[].iso_code stringrequired

results[].state_country stringrequired

results[].location stringrequired

results[].county string | null

US county of the location, to tell apart same-named cities in one state (e.g. the two Burbanks in California). CONUS locations only, null for OCONUS.

results[].county (anyOf 1) string

results[].county (anyOf 2) null

results[].season_begin stringrequired

results[].season_end stringrequired

results[].lodging integerrequired

results[].local_meal_rate integerrequired

results[].proportional_meal_rate integerrequired

results[].local_incidental integerrequired

results[].footnote_number string | nullrequired

results[].footnote_number (anyOf 1) stringrequired

results[].footnote_number (anyOf 2) nullrequired

results[].footnote_rate integer | nullrequired

results[].footnote_rate (anyOf 1) integerrequired

results[].footnote_rate (anyOf 2) nullrequired

results[].maximum_perdiem integerrequired

results[].effective_date stringrequired

results[].fiscal_year integerrequired

A fiscal year starts Oct 1st, ends Sep 30th

results[].source string

The authoritative government source of this location and rate data.

Allowed values: ["DSSR", "DTMO", "GSA", "dssr", "dtmo", "gsa"]

results[].publish_date stringrequired

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET 'https://api.allowancesapi.com/v1/dtmo/perdiem/conus/US-DC?date=2026-07-11&q=Washington&offset=0&limit=1&verification_url=true' \
  -H "X-API-Key: YOUR_KEY"

Response to GET /v1/dtmo/perdiem/conus/US-DC?date=2026-07-11&q=Washington&offset=0&limit=1&verification_url=true. Amounts are in USD per day.

{
  "effective_date": "2025-10-01",
  "verification_url": "https://www.defensetravel.dod.mil/neorates/report/index.php?report=conus&state=DISTRICT OF COLUMBIA&year=None&elocs=YES&military=YES",
  "results": [
    {
      "iso_code": "US-DC",
      "state_country": "District of Columbia",
      "location": "Washington",
      "county": "District of Columbia",
      "season_begin": "07/01",
      "season_end": "08/31",
      "lodging": 183,
      "local_meal_rate": 87,
      "proportional_meal_rate": 53,
      "local_incidental": 5,
      "footnote_number": "None",
      "footnote_rate": 0,
      "maximum_perdiem": 275,
      "effective_date": "2025-10-01",
      "fiscal_year": 2026,
      "source": "dtmo",
      "publish_date": "2025-11-01"
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/dtmo/perdiem/oconus/{oconus_iso_code}

Get perdiem OCONUS

Department of Defense per diem outside the continental U.S.: foreign countries by ISO alpha-2 code (e.g. 'PG'), and Alaska, Hawaii and U.S. territories by 'US-XX' code. Returns lodging, local and proportional meal rates, incidentals and the maximum per diem (lodging + meals + incidentals) per season. q filters by location name. date selects the rates in force on that day, year a fiscal year (Oct 1 to Sep 30); omit both for the current fiscal year.

Parameters 7

oconus_iso_code stringrequired

path parameter

Example "US-AK"

year integer

query parameter

Example 1

verification_url boolean

query parameter

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

Example false

q string | null

query parameter

Search by location name or state/country name

Example "Q"

offset integer

query parameter

Example 0

limit integer

query parameter

Example 50

date string | null

query parameter

Specific date in YYYY-MM-DD format

Response schema 200

effective_date stringrequired

verification_url string | null

verification_url (anyOf 1) string

verification_url (anyOf 2) null

results object[]required

results[] object

results[].iso_code stringrequired

results[].state_country stringrequired

results[].location stringrequired

results[].county string | null

US county of the location, to tell apart same-named cities in one state (e.g. the two Burbanks in California). CONUS locations only, null for OCONUS.

results[].county (anyOf 1) string

results[].county (anyOf 2) null

results[].season_begin stringrequired

results[].season_end stringrequired

results[].lodging integerrequired

results[].local_meal_rate integerrequired

results[].proportional_meal_rate integerrequired

results[].local_incidental integerrequired

results[].footnote_number string | nullrequired

results[].footnote_number (anyOf 1) stringrequired

results[].footnote_number (anyOf 2) nullrequired

results[].footnote_rate integer | nullrequired

results[].footnote_rate (anyOf 1) integerrequired

results[].footnote_rate (anyOf 2) nullrequired

results[].maximum_perdiem integerrequired

results[].effective_date stringrequired

results[].fiscal_year integerrequired

A fiscal year starts Oct 1st, ends Sep 30th

results[].source string

The authoritative government source of this location and rate data.

Allowed values: ["DSSR", "DTMO", "GSA", "dssr", "dtmo", "gsa"]

results[].publish_date stringrequired

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET 'https://api.allowancesapi.com/v1/dtmo/perdiem/oconus/LU?date=2026-07-11&q=Luxembourg&offset=0&limit=1&verification_url=true' \
  -H "X-API-Key: YOUR_KEY"

Response to GET /v1/dtmo/perdiem/oconus/LU?date=2026-07-11&q=Luxembourg&offset=0&limit=1&verification_url=true. Amounts are in USD per day.

{
  "effective_date": "2025-08-01",
  "verification_url": "https://www.defensetravel.dod.mil/neorates/report/index.php?report=oconus&country=LUXEMBOURG&date=2026-07-11&military=YES",
  "results": [
    {
      "iso_code": "LU-LU",
      "state_country": "Luxembourg",
      "location": "Luxembourg",
      "county": "",
      "season_begin": "01/01",
      "season_end": "12/31",
      "lodging": 366,
      "local_meal_rate": 111,
      "proportional_meal_rate": 65,
      "local_incidental": 27,
      "footnote_number": "None",
      "footnote_rate": 0,
      "maximum_perdiem": 504,
      "effective_date": "2025-08-01",
      "fiscal_year": 2026,
      "source": "dtmo",
      "publish_date": "2026-07-01"
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/dtmo/perdiem/search

Search by location name

Department of Defense per diem by location name (e.g. 'Kabul') or country/state name (e.g. 'Afghanistan'), across CONUS and OCONUS. date selects the rates in force on that day, year a fiscal year (Oct 1 to Sep 30); omit both for the current fiscal year.

Parameters 4

q string | null

query parameter

Search by location name or state/country name

Example "Q"

year integer

query parameter

Example 1

verification_url boolean

query parameter

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

Example false

date string | null

query parameter

Specific date in YYYY-MM-DD format

Response schema 200

effective_date stringrequired

verification_url string | null

verification_url (anyOf 1) string

verification_url (anyOf 2) null

results object[]required

results[] object

results[].iso_code stringrequired

results[].state_country stringrequired

results[].location stringrequired

results[].county string | null

US county of the location, to tell apart same-named cities in one state (e.g. the two Burbanks in California). CONUS locations only, null for OCONUS.

results[].county (anyOf 1) string

results[].county (anyOf 2) null

results[].season_begin stringrequired

results[].season_end stringrequired

results[].lodging integerrequired

results[].local_meal_rate integerrequired

results[].proportional_meal_rate integerrequired

results[].local_incidental integerrequired

results[].footnote_number string | nullrequired

results[].footnote_number (anyOf 1) stringrequired

results[].footnote_number (anyOf 2) nullrequired

results[].footnote_rate integer | nullrequired

results[].footnote_rate (anyOf 1) integerrequired

results[].footnote_rate (anyOf 2) nullrequired

results[].maximum_perdiem integerrequired

results[].effective_date stringrequired

results[].fiscal_year integerrequired

A fiscal year starts Oct 1st, ends Sep 30th

results[].source string

The authoritative government source of this location and rate data.

Allowed values: ["DSSR", "DTMO", "GSA", "dssr", "dtmo", "gsa"]

results[].publish_date stringrequired

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET 'https://api.allowancesapi.com/v1/dtmo/perdiem/search?q=Luxembourg&date=2026-07-11&verification_url=true' \
  -H "X-API-Key: YOUR_KEY"

Response to GET /v1/dtmo/perdiem/search?q=Luxembourg&date=2026-07-11&verification_url=true. Amounts are in USD per day.

{
  "effective_date": "2025-08-01",
  "verification_url": "https://www.defensetravel.dod.mil/neorates/report/index.php?report=oconus&country=LUXEMBOURG&date=2026-07-11&military=YES",
  "results": [
    {
      "iso_code": "LU-LU",
      "state_country": "Luxembourg",
      "location": "Luxembourg",
      "county": "",
      "season_begin": "01/01",
      "season_end": "12/31",
      "lodging": 366,
      "local_meal_rate": 111,
      "proportional_meal_rate": 65,
      "local_incidental": 27,
      "footnote_number": "None",
      "footnote_rate": 0,
      "maximum_perdiem": 504,
      "effective_date": "2025-08-01",
      "fiscal_year": 2026,
      "source": "dtmo",
      "publish_date": "2026-07-01"
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/dtmo/locations/conus/{state_iso}

Get DTMO CONUS locations

todo add filter by location

Return all DTMO locations for a specific state using its US State Code (e.g., 'US-CA')

Parameters 1

state_iso stringrequired

path parameter

Example "US-AL"

Response schema 200

(body) object[]

[] object

[].state stringrequired

US State Name.

[].state_iso stringrequired

The 4-letter ISO 3166-2:US state code. The first part is US, the ISO 3166-1 alpha-2 code of the United States. The second part is two letters, which is the postal abbreviation of the state, district, or outlying area.

[].county stringrequired

[].name stringrequired

The specific city, region, or installation name recognized by the DSSR.

[].source stringrequired

The authoritative government source of this location and rate data.

Allowed values: ["DSSR", "DTMO", "GSA", "dssr", "dtmo", "gsa"]

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET https://api.allowancesapi.com/v1/dtmo/locations/conus/US-DC \
  -H "X-API-Key: YOUR_KEY"

Response to GET /v1/dtmo/locations/conus/US-DC.

[
  {
    "state": "District of Columbia",
    "state_iso": "US-DC",
    "county": "District of Columbia",
    "name": "Anacostia Ns",
    "source": "DTMO"
  },
  {
    "state": "District of Columbia",
    "state_iso": "US-DC",
    "county": "District of Columbia",
    "name": "Bolling AFB",
    "source": "DTMO"
  },
  {
    "state": "District of Columbia",
    "state_iso": "US-DC",
    "county": "District of Columbia",
    "name": "District of Columbia",
    "source": "DTMO"
  },
  {
    "state": "District of Columbia",
    "state_iso": "US-DC",
    "county": "District of Columbia",
    "name": "Ft. Mcnair",
    "source": "DTMO"
  },
  {
    "state": "District of Columbia",
    "state_iso": "US-DC",
    "county": "District of Columbia",
    "name": "JB Anacostia-Bolling",
    "source": "DTMO"
  },
  {
    "state": "District of Columbia",
    "state_iso": "US-DC",
    "county": "District of Columbia",
    "name": "Marine Barracks",
    "source": "DTMO"
  },
  {
    "state": "District of Columbia",
    "state_iso": "US-DC",
    "county": "District of Columbia",
    "name": "Naval Medical Command",
    "source": "DTMO"
  },
  {
    "state": "District of Columbia",
    "state_iso": "US-DC",
    "county": "District of Columbia",
    "name": "Naval Research Laboratory",
    "source": "DTMO"
  },
  {
    "state": "District of Columbia",
    "state_iso": "US-DC",
    "county": "District of Columbia",
    "name": "Naval Security Station",
    "source": "DTMO"
  },
  {
    "state": "District of Columbia",
    "state_iso": "US-DC",
    "county": "District of Columbia",
    "name": "U.S. Naval Observatory",
    "source": "DTMO"
  },
  {
    "state": "District of Columbia",
    "state_iso": "US-DC",
    "county": "District of Columbia",
    "name": "U.S. Soldier's & Airmen's Home",
    "source": "DTMO"
  },
  {
    "state": "District of Columbia",
    "state_iso": "US-DC",
    "county": "District of Columbia",
    "name": "Walter Reed Army Medical CTR",
    "source": "DTMO"
  },
  {
    "state": "District of Columbia",
    "state_iso": "US-DC",
    "county": "District of Columbia",
    "name": "Washington",
    "source": "DTMO"
  },
  {
    "state": "District of Columbia",
    "state_iso": "US-DC",
    "county": "District of Columbia",
    "name": "Washington Naval District",
    "source": "DTMO"
  }
]

Example response. Rates and dates are illustrative.

GET /v1/dtmo/locations/oconus/{country_iso_code}

Get DTMO OCONUS locations

Return DTMO locations for a specific country using its ISO Code (e.g., 'AU', 'BE').

The optional location filter performs case-insensitive substring matching. Omitted or empty filters return all locations in the country. Nonempty input is literal, including spaces and wildcard characters. No matches returns [].

Parameters 2

country_iso_code stringrequired

path parameter

Example "BE"

location string | null

query parameter

Filter by location name

Example "Austin"

Response schema 200

(body) object[]

[] object

[].country stringrequired

The full, official name of the country recognized by the US Government.

[].country_iso_code stringrequired

The 2-letter ISO 3166-1 alpha-2 country code.

[].name stringrequired

The specific city, region, or installation name recognized by the DSSR.

[].source stringrequired

The authoritative government source of this location and rate data.

Allowed values: ["DSSR", "DTMO", "GSA", "dssr", "dtmo", "gsa"]

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET 'https://api.allowancesapi.com/v1/dtmo/locations/oconus/LU?location=Luxembourg' \
  -H "X-API-Key: YOUR_KEY"

Response to GET /v1/dtmo/locations/oconus/LU?location=Luxembourg.

[
  {
    "country": "Luxembourg",
    "country_iso_code": "LU",
    "name": "Luxembourg",
    "source": "DTMO"
  }
]

Example response. Rates and dates are illustrative.

FEMA - Fire-safe lodging

GET /v1/fema/hotels/search

Search FEMA-listed properties by name and town

Return the properties whose name or city contains every word of q, case-insensitively, as a plain substring: courtyard dallas matches Courtyard properties in Dallas, mint house alexandria the Mint House in Alexandria. There is no fuzzy matching, so hampton inn does not find "Hampton by Hilton". Words of one character are ignored. state narrows the search to one state or territory (404 for a code FEMA does not list). Results are ordered by name then city and paginated with offset and limit (50 by default, 200 at most); total counts every match. No match returns an empty results list.

The Hotel and Motel Fire Safety Act of 1990 requires federal travelers to stay at a property on FEMA's Hotel and Motel National Master List to be reimbursed for lodging. Each property on the list has a FEMA ID. FEMA publishes the current list only; as_of is the date of the snapshot the results come from. This endpoint returns no rates: combine it with the GSA per diem lookups for the lodging ceiling.

Parameters 4

q stringrequired

query parameter

Words to find in the property name or city, all required, case-insensitive.

Example "mint house alexandria"

state string | null

query parameter

Restrict the search to one state or territory.

Example "AL"

offset integer

query parameter

Number of properties to skip.

Example 0

limit integer

query parameter

Properties per page, 200 at most.

Example 50

Response schema 200

as_of stringrequired

Date of the FEMA list snapshot the results come from. FEMA publishes the current list only; there is no history.

results object[]required

results[] object

results[].fema_id stringrequired

FEMA ID printed on the National Master List; the identifier travelers quote on vouchers.

results[].name stringrequired

results[].street string | nullrequired

Street address; null when FEMA lists only a P.O. box.

results[].street (anyOf 1) stringrequired

results[].street (anyOf 2) nullrequired

results[].city stringrequired

results[].state stringrequired

Two-letter state or territory code.

results[].zipcode string | nullrequired

Five-digit ZIP code.

results[].zipcode (anyOf 1) stringrequired

results[].zipcode (anyOf 2) nullrequired

results[].phone string | nullrequired

results[].phone (anyOf 1) stringrequired

results[].phone (anyOf 2) nullrequired

results[].property_type string | nullrequired

FEMA category: Hotel/Motel, Apartment/Condo, Bed & Breakfast, Short Term Rental, College/University or Military.

results[].property_type (anyOf 1) stringrequired

results[].property_type (anyOf 2) nullrequired

results[].stories integerrequired

Number of floors as registered with FEMA.

results[].sprinklers booleanrequired

True when FEMA records an automatic sprinkler system.

total integerrequired

Number of properties matching the query, ignoring pagination.

offset integerrequired

Offset applied to this page.

limit integerrequired

Maximum number of properties in this page.

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

The state code is not one FEMA lists.

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET 'https://api.allowancesapi.com/v1/fema/hotels/search?q=mint+house+alexandria' \
  -H "X-API-Key: YOUR_KEY"
{
  "as_of": "2026-10-24",
  "total": 1,
  "offset": 0,
  "limit": 50,
  "results": [
    {
      "fema_id": "VA6026",
      "name": "Mint House Alexandria - Old Town",
      "street": "750 Thornton Way",
      "city": "Alexandria",
      "state": "VA",
      "zipcode": "22314",
      "phone": "855-972-9090",
      "property_type": "Apartment/Condo",
      "stories": 5,
      "sprinklers": true
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/fema/hotels/{fema_id}

FEMA-listed property by FEMA ID

Return the property registered under a FEMA ID, or 404 when the ID is not on the list.

The Hotel and Motel Fire Safety Act of 1990 requires federal travelers to stay at a property on FEMA's Hotel and Motel National Master List to be reimbursed for lodging. Each property on the list has a FEMA ID. FEMA publishes the current list only; as_of is the date of the snapshot the results come from. This endpoint returns no rates: combine it with the GSA per diem lookups for the lodging ceiling.

Parameters 1

fema_id stringrequired

path parameter

Example "VA6026"

Response schema 200

as_of stringrequired

Date of the FEMA list snapshot the results come from. FEMA publishes the current list only; there is no history.

results object[]required

results[] object

results[].fema_id stringrequired

FEMA ID printed on the National Master List; the identifier travelers quote on vouchers.

results[].name stringrequired

results[].street string | nullrequired

Street address; null when FEMA lists only a P.O. box.

results[].street (anyOf 1) stringrequired

results[].street (anyOf 2) nullrequired

results[].city stringrequired

results[].state stringrequired

Two-letter state or territory code.

results[].zipcode string | nullrequired

Five-digit ZIP code.

results[].zipcode (anyOf 1) stringrequired

results[].zipcode (anyOf 2) nullrequired

results[].phone string | nullrequired

results[].phone (anyOf 1) stringrequired

results[].phone (anyOf 2) nullrequired

results[].property_type string | nullrequired

FEMA category: Hotel/Motel, Apartment/Condo, Bed & Breakfast, Short Term Rental, College/University or Military.

results[].property_type (anyOf 1) stringrequired

results[].property_type (anyOf 2) nullrequired

results[].stories integerrequired

Number of floors as registered with FEMA.

results[].sprinklers booleanrequired

True when FEMA records an automatic sprinkler system.

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

The FEMA ID is not on the list.

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET https://api.allowancesapi.com/v1/fema/hotels/VA6026 \
  -H "X-API-Key: YOUR_KEY"
{
  "as_of": "2026-10-24",
  "results": [
    {
      "fema_id": "VA6026",
      "name": "Mint House Alexandria - Old Town",
      "street": "750 Thornton Way",
      "city": "Alexandria",
      "state": "VA",
      "zipcode": "22314",
      "phone": "855-972-9090",
      "property_type": "Apartment/Condo",
      "stories": 5,
      "sprinklers": true
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/fema/hotels/zipcode/{zipcode}

FEMA-listed properties by ZIP code

Return every property on the list in a US ZIP code, ordered by name. The path accepts a five-digit ZIP or ZIP+4, normalized to the first five digits. A known ZIP with no listed property returns an empty results list; an unknown ZIP returns 404.

The Hotel and Motel Fire Safety Act of 1990 requires federal travelers to stay at a property on FEMA's Hotel and Motel National Master List to be reimbursed for lodging. Each property on the list has a FEMA ID. FEMA publishes the current list only; as_of is the date of the snapshot the results come from. This endpoint returns no rates: combine it with the GSA per diem lookups for the lodging ceiling.

Parameters 1

zipcode stringrequired

path parameter

Example "ZIPCODE"

Response schema 200

as_of stringrequired

Date of the FEMA list snapshot the results come from. FEMA publishes the current list only; there is no history.

results object[]required

results[] object

results[].fema_id stringrequired

FEMA ID printed on the National Master List; the identifier travelers quote on vouchers.

results[].name stringrequired

results[].street string | nullrequired

Street address; null when FEMA lists only a P.O. box.

results[].street (anyOf 1) stringrequired

results[].street (anyOf 2) nullrequired

results[].city stringrequired

results[].state stringrequired

Two-letter state or territory code.

results[].zipcode string | nullrequired

Five-digit ZIP code.

results[].zipcode (anyOf 1) stringrequired

results[].zipcode (anyOf 2) nullrequired

results[].phone string | nullrequired

results[].phone (anyOf 1) stringrequired

results[].phone (anyOf 2) nullrequired

results[].property_type string | nullrequired

FEMA category: Hotel/Motel, Apartment/Condo, Bed & Breakfast, Short Term Rental, College/University or Military.

results[].property_type (anyOf 1) stringrequired

results[].property_type (anyOf 2) nullrequired

results[].stories integerrequired

Number of floors as registered with FEMA.

results[].sprinklers booleanrequired

True when FEMA records an automatic sprinkler system.

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

The ZIP code is unknown.

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET https://api.allowancesapi.com/v1/fema/hotels/zipcode/ZIPCODE \
  -H "X-API-Key: YOUR_KEY"
{
  "as_of": "2026-10-24",
  "results": [
    {
      "fema_id": "VA6026",
      "name": "Mint House Alexandria - Old Town",
      "street": "750 Thornton Way",
      "city": "Alexandria",
      "state": "VA",
      "zipcode": "22314",
      "phone": "855-972-9090",
      "property_type": "Apartment/Condo",
      "stories": 5,
      "sprinklers": true
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/fema/hotels/state/{state_iso}

FEMA-listed properties by state, optionally filtered by city

Return the properties on the list in a state, ordered by city then name and paginated with offset and limit (50 by default, 200 at most); total is the number of matches across all pages. The optional city is matched case-insensitively as a partial name, so york matches New York and Yorktown. The state path accepts the 50 states, DC and the territories FEMA lists (AS, GU, MP, PR, PW, VI); other codes return 404. A city that matches nothing returns an empty results list.

The Hotel and Motel Fire Safety Act of 1990 requires federal travelers to stay at a property on FEMA's Hotel and Motel National Master List to be reimbursed for lodging. Each property on the list has a FEMA ID. FEMA publishes the current list only; as_of is the date of the snapshot the results come from. This endpoint returns no rates: combine it with the GSA per diem lookups for the lodging ceiling.

Parameters 4

state_iso stringrequired

path parameter

Example "AL"

city string | null

query parameter

Case-insensitive partial match on the city name.

Example "Alexandria"

offset integer

query parameter

Number of properties to skip.

Example 0

limit integer

query parameter

Properties per page, 200 at most.

Example 50

Response schema 200

as_of stringrequired

Date of the FEMA list snapshot the results come from. FEMA publishes the current list only; there is no history.

results object[]required

results[] object

results[].fema_id stringrequired

FEMA ID printed on the National Master List; the identifier travelers quote on vouchers.

results[].name stringrequired

results[].street string | nullrequired

Street address; null when FEMA lists only a P.O. box.

results[].street (anyOf 1) stringrequired

results[].street (anyOf 2) nullrequired

results[].city stringrequired

results[].state stringrequired

Two-letter state or territory code.

results[].zipcode string | nullrequired

Five-digit ZIP code.

results[].zipcode (anyOf 1) stringrequired

results[].zipcode (anyOf 2) nullrequired

results[].phone string | nullrequired

results[].phone (anyOf 1) stringrequired

results[].phone (anyOf 2) nullrequired

results[].property_type string | nullrequired

FEMA category: Hotel/Motel, Apartment/Condo, Bed & Breakfast, Short Term Rental, College/University or Military.

results[].property_type (anyOf 1) stringrequired

results[].property_type (anyOf 2) nullrequired

results[].stories integerrequired

Number of floors as registered with FEMA.

results[].sprinklers booleanrequired

True when FEMA records an automatic sprinkler system.

total integerrequired

Number of properties matching the query, ignoring pagination.

offset integerrequired

Offset applied to this page.

limit integerrequired

Maximum number of properties in this page.

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

The state code is not one FEMA lists.

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET https://api.allowancesapi.com/v1/fema/hotels/state/AL \
  -H "X-API-Key: YOUR_KEY"
{
  "as_of": "2026-10-24",
  "total": 1,
  "offset": 0,
  "limit": 50,
  "results": [
    {
      "fema_id": "VA6026",
      "name": "Mint House Alexandria - Old Town",
      "street": "750 Thornton Way",
      "city": "Alexandria",
      "state": "VA",
      "zipcode": "22314",
      "phone": "855-972-9090",
      "property_type": "Apartment/Condo",
      "stories": 5,
      "sprinklers": true
    }
  ]
}

Example response. Rates and dates are illustrative.

GSA - per diem, mileage, fleet and airfare

GET /v1/gsa/perdiem/destination/{destination_id}

GSA per diem rate by destination

Return the GSA per diem rate in effect for a specific GSA destination on a given date. A destination is a rate area defined by GSA and may represent a city, metropolitan area, county, or the Standard CONUS area. It is not necessarily a single municipality.

destination_id is the numeric identifier assigned to that GSA rate area in the source data. Use GET /v1/gsa/destinations to browse the available destinations and find the ID for the location you need. Destination ID 0 represents the Standard CONUS rate.

The response contains the seasonal lodging rate applicable on the requested date and the daily meals and incidental expenses (M&IE) rate. When date is omitted, today's rate is returned. Set verification_url=true to include the corresponding official GSA lookup URL.

Parameters 3

destination_id integerrequired

path parameter

GSA's numeric identifier for a rate area. Retrieve valid IDs from GET /v1/gsa/destinations; ID 0 is the Standard CONUS rate.

Example 75

verification_url boolean

query parameter

Include the official GSA per diem lookup URL in the response when true.

Example false

date string | null

query parameter

Specific date in YYYY-MM-DD format

Response schema 200

effective_date stringrequired

verification_url string | null

verification_url (anyOf 1) string

verification_url (anyOf 2) null

results object[]required

results[] object

results[].state stringrequired

results[].iso_code stringrequired

results[].destination_id integerrequired

results[].destination stringrequired

results[].county stringrequired

results[].season_begin stringrequired

results[].season_end stringrequired

results[].lodging integerrequired

results[].meals_incidental integerrequired

results[].effective_date stringrequired

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

The destination does not exist, or it has no rate for the requested date.

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET https://api.allowancesapi.com/v1/gsa/perdiem/destination/75 \
  -H "X-API-Key: YOUR_KEY"
{
  "effective_date": "2025-10-01",
  "verification_url": "https://www.gsa.gov/travel/plan-book/per-diem-rates/per-diem-rates-results?action=perdiems_report&fiscal_year=2026&state=DC&city=&zip=",
  "results": [
    {
      "state": "District of Columbia",
      "iso_code": "US-DC",
      "destination_id": 75,
      "destination": "Washington",
      "county": "District of Columbia",
      "season_begin": "03/01",
      "season_end": "06/30",
      "lodging": 276,
      "meals_incidental": 92,
      "effective_date": "2025-10-01"
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/gsa/perdiem/state/{state_iso}

GSA per diem rates by state and date

Return every GSA destination rate in a state that applies on a specific date. Each result contains the seasonal lodging rate in effect on that date and the daily meals and incidental expenses (M&IE) rate. When date is omitted, today's rates are returned.

Use the optional location parameter to filter by a GSA destination or location-defined name. Matching is case-insensitive and accepts partial names. If the state has no non-standard destination rate, the Standard CONUS rate is returned. This endpoint covers GSA CONUS rates; unsupported or unknown state codes return 404.

Set verification_url=true to include the corresponding official GSA state lookup URL.

Parameters 4

state_iso stringrequired

path parameter

Two-letter US postal abbreviation for the state or District of Columbia.

Example "DC"

location string | null

query parameter

Optional case-insensitive partial match against the GSA destination name or location-defined name.

Example "Washington"

verification_url boolean

query parameter

Include the official GSA state lookup URL in the response when true.

Example false

date string | null

query parameter

Specific date in YYYY-MM-DD format

Response schema 200

effective_date stringrequired

verification_url string | null

verification_url (anyOf 1) string

verification_url (anyOf 2) null

results object[]required

results[] object

results[].state stringrequired

results[].iso_code stringrequired

results[].destination_id integerrequired

results[].destination stringrequired

results[].county stringrequired

results[].season_begin stringrequired

results[].season_end stringrequired

results[].lodging integerrequired

results[].meals_incidental integerrequired

results[].effective_date stringrequired

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

The state is unsupported or unknown, or no rate matches the location and date.

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET https://api.allowancesapi.com/v1/gsa/perdiem/state/DC \
  -H "X-API-Key: YOUR_KEY"
{
  "effective_date": "2025-10-01",
  "verification_url": "https://www.gsa.gov/travel/plan-book/per-diem-rates/per-diem-rates-results?action=perdiems_report&fiscal_year=2026&state=DC&city=&zip=",
  "results": [
    {
      "state": "District of Columbia",
      "iso_code": "US-DC",
      "destination_id": 75,
      "destination": "Washington",
      "county": "District of Columbia",
      "season_begin": "03/01",
      "season_end": "06/30",
      "lodging": 276,
      "meals_incidental": 92,
      "effective_date": "2025-10-01"
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/gsa/perdiem/state/{state_iso}/year/{year}

GSA per diem rates by state and fiscal year

Return every GSA destination rate in a state for a US fiscal year. Each result contains the lodging rate for every month and the daily meals and incidental expenses (M&IE) rate. A US fiscal year begins October 1 of the preceding calendar year and ends September 30.

Use the optional location parameter to filter destinations by their GSA destination or location-defined name. Matching is case-insensitive and accepts partial names. Set verification_url=true to include the corresponding official GSA state lookup URL.

Parameters 4

state_iso stringrequired

path parameter

Two-letter US postal abbreviation for the state or District of Columbia.

Example "DC"

year integerrequired

path parameter

Four-digit US fiscal year. Fiscal year 2026 runs from 2025-10-01 through 2026-09-30.

Example 2026

location string | null

query parameter

Optional case-insensitive partial match against the GSA destination name or location-defined name.

Example "Washington"

verification_url boolean

query parameter

Include the official GSA state lookup URL in the response when true.

Example false

Response schema 200

effective_date stringrequired

verification_url string | null

verification_url (anyOf 1) string

verification_url (anyOf 2) null

results object[]required

results[] object

results[].state stringrequired

results[].iso_code stringrequired

results[].destination_id integerrequired

results[].destination stringrequired

results[].county stringrequired

results[].lodging objectrequired

results[].lodging.oct integerrequired

results[].lodging.nov integerrequired

results[].lodging.dec integerrequired

results[].lodging.jan integerrequired

results[].lodging.feb integerrequired

results[].lodging.mar integerrequired

results[].lodging.apr integerrequired

results[].lodging.may integerrequired

results[].lodging.jun integerrequired

results[].lodging.jul integerrequired

results[].lodging.aug integerrequired

results[].lodging.sep integerrequired

results[].meals_incidental integerrequired

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

No per diem rates match the requested state, fiscal year, and optional location.

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET https://api.allowancesapi.com/v1/gsa/perdiem/state/DC/year/2026 \
  -H "X-API-Key: YOUR_KEY"
{
  "effective_date": "2025-10-01",
  "verification_url": "https://www.gsa.gov/travel/plan-book/per-diem-rates/per-diem-rates-results?action=perdiems_report&fiscal_year=2026&city=&state=DC",
  "results": [
    {
      "state": "District of Columbia",
      "iso_code": "US-DC",
      "destination_id": 75,
      "destination": "Washington",
      "county": "District of Columbia",
      "lodging": {
        "oct": 275,
        "nov": 196,
        "dec": 196,
        "jan": 196,
        "feb": 196,
        "mar": 276,
        "apr": 276,
        "may": 276,
        "jun": 276,
        "jul": 183,
        "aug": 183,
        "sep": 275
      },
      "meals_incidental": 92
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/gsa/perdiem/zipcode/{zipcode}

GSA per diem rates by ZIP code and date

Return every GSA destination rate associated with a US ZIP code that applies on a specific date. Each result contains the seasonal lodging rate in effect on that date and the daily meals and incidental expenses (M&IE) rate. When date is omitted, today's rates are returned.

A ZIP code can map to more than one GSA destination. When that happens, results contains every applicable rate, and the API does not choose one automatically. Use the returned county or a geocoder to determine which destination applies to the travel location. If a known ZIP code has no non-standard destination, the Standard CONUS rate is returned.

The path accepts either a five-digit ZIP code or ZIP+4. ZIP+4 values are normalized to their first five digits. Set verification_url=true to include the corresponding official GSA lookup URL.

Parameters 3

zipcode stringrequired

path parameter

Five-digit US ZIP code, or ZIP+4. ZIP+4 values are normalized to the first five digits.

Example "01366"

verification_url boolean

query parameter

Include the official GSA per diem lookup URL in the response when true.

Example false

date string | null

query parameter

Specific date in YYYY-MM-DD format

Response schema 200

effective_date stringrequired

verification_url string | null

verification_url (anyOf 1) string

verification_url (anyOf 2) null

results object[]required

results[] object

results[].state stringrequired

results[].iso_code stringrequired

results[].destination_id integerrequired

results[].destination stringrequired

results[].county stringrequired

results[].season_begin stringrequired

results[].season_end stringrequired

results[].lodging integerrequired

results[].meals_incidental integerrequired

results[].effective_date stringrequired

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

The ZIP code is unknown, or no per diem rate is available for the requested date.

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET https://api.allowancesapi.com/v1/gsa/perdiem/zipcode/01366 \
  -H "X-API-Key: YOUR_KEY"
{
  "effective_date": "2025-10-01",
  "verification_url": "https://www.gsa.gov/travel/plan-book/per-diem-rates/per-diem-rates-results?action=perdiems_report&fiscal_year=2026&state=US&city=&zip=",
  "results": [
    {
      "state": "US Standard",
      "iso_code": "US-US",
      "destination_id": 0,
      "destination": "Standard Rate",
      "county": "CONUS",
      "season_begin": "10/01",
      "season_end": "09/30",
      "lodging": 110,
      "meals_incidental": 68,
      "effective_date": "2025-10-01"
    },
    {
      "state": "Massachusetts",
      "iso_code": "US-MA",
      "destination_id": 160,
      "destination": "Worcester",
      "county": "Worcester",
      "season_begin": "10/01",
      "season_end": "09/30",
      "lodging": 135,
      "meals_incidental": 80,
      "effective_date": "2025-10-01"
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/gsa/perdiem/zipcode/{zipcode}/year/{year}

GSA per diem rates by ZIP code and fiscal year

Return the GSA lodging rates for every month of a US fiscal year and the daily meals and incidental expenses (M&IE) rate associated with a ZIP code. A US fiscal year begins October 1 of the preceding calendar year and ends September 30.

A ZIP code can map to more than one GSA destination. When that happens, results contains every applicable rate. The API does not choose a destination automatically; use the returned county or a geocoder to determine which rate applies. ZIP codes without a non-standard destination return the Standard CONUS rate.

ZIP+4 input is accepted and normalized to its first five digits. Set verification_url=true to include the corresponding official GSA lookup URL.

Parameters 3

zipcode stringrequired

path parameter

Five-digit US ZIP code, or ZIP+4. ZIP+4 values are normalized to the first five digits.

Example "01366"

year integerrequired

path parameter

Four-digit US fiscal year. Fiscal year 2026 runs from 2025-10-01 through 2026-09-30.

Example 2026

verification_url boolean

query parameter

Include the official GSA ZIP-code lookup URL in the response when true.

Example false

Response schema 200

effective_date stringrequired

verification_url string | null

verification_url (anyOf 1) string

verification_url (anyOf 2) null

results object[]required

results[] object

results[].state stringrequired

results[].iso_code stringrequired

results[].destination_id integerrequired

results[].destination stringrequired

results[].county stringrequired

results[].lodging objectrequired

results[].lodging.oct integerrequired

results[].lodging.nov integerrequired

results[].lodging.dec integerrequired

results[].lodging.jan integerrequired

results[].lodging.feb integerrequired

results[].lodging.mar integerrequired

results[].lodging.apr integerrequired

results[].lodging.may integerrequired

results[].lodging.jun integerrequired

results[].lodging.jul integerrequired

results[].lodging.aug integerrequired

results[].lodging.sep integerrequired

results[].meals_incidental integerrequired

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

The ZIP code does not exist in the database.

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET https://api.allowancesapi.com/v1/gsa/perdiem/zipcode/01366/year/2026 \
  -H "X-API-Key: YOUR_KEY"
{
  "effective_date": "2025-10-01",
  "verification_url": "https://www.gsa.gov/travel/plan-book/per-diem-rates/per-diem-rates-results?action=perdiems_report&fiscal_year=2026&city=&zip=01366",
  "results": [
    {
      "state": "US Standard",
      "iso_code": "US-US",
      "destination_id": 0,
      "destination": "Standard Rate",
      "county": "CONUS",
      "lodging": {
        "oct": 110,
        "nov": 110,
        "dec": 110,
        "jan": 110,
        "feb": 110,
        "mar": 110,
        "apr": 110,
        "may": 110,
        "jun": 110,
        "jul": 110,
        "aug": 110,
        "sep": 110
      },
      "meals_incidental": 68
    },
    {
      "state": "Massachusetts",
      "iso_code": "US-MA",
      "destination_id": 160,
      "destination": "Worcester",
      "county": "Worcester",
      "lodging": {
        "oct": 135,
        "nov": 135,
        "dec": 135,
        "jan": 135,
        "feb": 135,
        "mar": 135,
        "apr": 135,
        "may": 135,
        "jun": 135,
        "jul": 135,
        "aug": 135,
        "sep": 135
      },
      "meals_incidental": 80
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/gsa/zipcode/{zipcode}

Get ZIP code metadata

Look up every state associated with a US ZIP code. Most ZIP codes belong to one state, but some cross state boundaries. In that case, states contains every matching state; the API does not choose one on the caller's behalf. This is a geographic metadata endpoint; it does not return GSA per diem rates. Use /v1/gsa/perdiem/zipcode/{zipcode} for rates.

The path accepts either a five-digit ZIP code or ZIP+4. ZIP+4 values are normalized to their first five digits before lookup, and the normalized five-digit ZIP is returned in the response. Leading zeroes are significant, so ZIP codes must be sent as strings.

Parameters 1

zipcode stringrequired

path parameter

Example "ZIPCODE"

Response schema 200

zipcode stringrequired

The normalized five-digit US ZIP code.

states string[]required

All states associated with the ZIP code, ordered alphabetically.

states[] string

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

The normalized ZIP code does not exist in the database.

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET https://api.allowancesapi.com/v1/gsa/zipcode/ZIPCODE \
  -H "X-API-Key: YOUR_KEY"

Leading zeroes are preserved in the response.

{
  "zipcode": "00501",
  "states": [
    "New York"
  ]
}

Example response. Rates and dates are illustrative.

A request for 12084-1234 is looked up and returned as 12084.

{
  "zipcode": "12084",
  "states": [
    "New York"
  ]
}

Example response. Rates and dates are illustrative.

Every state relationship is returned; no state is selected automatically.

{
  "zipcode": "10506",
  "states": [
    "Connecticut",
    "New York"
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/gsa/destination/{destination_id}

Get GSA destination metadata by ID

Return the geographic metadata for one GSA destination rate area. A destination may represent a city, metropolitan area, county, group of jurisdictions, or the Standard CONUS area rather than a single municipality. name is GSA's short display name, while defined_name describes the geographic scope of the rate area.

destination_id is GSA's numeric identifier for that rate area. Use GET /v1/gsa/destinations to browse available destinations and find an ID. ID 0 identifies the Standard CONUS rate area.

This endpoint returns destination metadata only. Use GET /v1/gsa/perdiem/destination/{destination_id} to retrieve the per diem rate in effect for a particular date.

Parameters 1

destination_id integerrequired

path parameter

GSA's numeric identifier for a destination rate area. Retrieve valid IDs from GET /v1/gsa/destinations; ID 0 is Standard CONUS.

Example 75

Response schema 200

destination_id integerrequired

GSA's numeric identifier for the rate area. ID 0 is the Standard CONUS rate.

name stringrequired

Display name GSA uses for the destination rate area.

defined_name stringrequired

Geographic area GSA uses to define the destination, commonly a county or locality.

county stringrequired

County associated with the destination rate area.

state stringrequired

US State Name.

state_iso stringrequired

The 4-letter ISO 3166-2:US state code. The first part is US, the ISO 3166-1 alpha-2 code of the United States. The second part is two letters, which is the postal abbreviation of the state, district, or outlying area.

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

No GSA destination exists with the requested destination ID.

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET https://api.allowancesapi.com/v1/gsa/destination/75 \
  -H "X-API-Key: YOUR_KEY"
{
  "destination_id": 75,
  "name": "Washington",
  "defined_name": "Washington DC (Also the Cities of Alexandria, Falls Church and Fairfax, and the Counties of Arlington and Fairfax, in Virginia; and the Counties of Montgomery and Prince George's in Maryland)",
  "county": "District of Columbia",
  "state": "District of Columbia",
  "state_iso": "US-DC"
}

Example response. Rates and dates are illustrative.

GET /v1/gsa/destinations

List GSA destinations

Return the paginated list of GSA destination rate areas and their numeric IDs. A destination is an area for which GSA publishes a per diem rate; it may represent a city, metropolitan area, county, locality, or the Standard CONUS area rather than a single municipality.

Use destination_id with GET /v1/gsa/perdiem/destination/{destination_id} to retrieve the rate in effect for that destination. ID 0 identifies the Standard CONUS rate. name is GSA's display name, while defined_name, county, and state fields provide the geographic context needed to select the correct rate area.

Results are ordered by destination_id. Use offset and limit to page through the list. An offset beyond the available records returns an empty list, not a 404 response.

Parameters 2

offset integer

query parameter

Number of destination records to skip before returning results.

Example 0

limit integer

query parameter

Maximum number of destinations to return. The maximum is 200.

Example 100

Response schema 200

(body) object[]

[] object

[].destination_id integerrequired

GSA's numeric identifier for the rate area. ID 0 is the Standard CONUS rate.

[].name stringrequired

Display name GSA uses for the destination rate area.

[].defined_name stringrequired

Geographic area GSA uses to define the destination, commonly a county or locality.

[].county stringrequired

County associated with the destination rate area.

[].state stringrequired

US State Name.

[].state_iso stringrequired

The 4-letter ISO 3166-2:US state code. The first part is US, the ISO 3166-1 alpha-2 code of the United States. The second part is two letters, which is the postal abbreviation of the state, district, or outlying area.

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET https://api.allowancesapi.com/v1/gsa/destinations \
  -H "X-API-Key: YOUR_KEY"
[
  {
    "destination_id": 0,
    "name": "Standard Rate",
    "defined_name": "Standard CONUS Rate",
    "county": "CONUS",
    "state": "US Standard",
    "state_iso": "US-US"
  },
  {
    "destination_id": 1,
    "name": "Birmingham",
    "defined_name": "Jefferson",
    "county": "Jefferson",
    "state": "Alabama",
    "state_iso": "US-AL"
  },
  {
    "destination_id": 2,
    "name": "Gulf Shores",
    "defined_name": "Baldwin",
    "county": "Baldwin",
    "state": "Alabama",
    "state_iso": "US-AL"
  }
]

Example response. Rates and dates are illustrative.

GET /v1/gsa/city-pairs/locations

City Pair airport and city codes

List or search the three-letter codes used by GSA City Pair awards for the fiscal year of date (today by default), with GSA's own city, state and country labels. Awards use IATA airport codes (DCA, IAD, BWI) for most domestic pairs and metropolitan city codes (WAS, NYC, LON) for others; only GSA decides which, so resolve the code here before calling the fare lookup. Several codes can share one city label. Without q, every code of the fiscal year is returned, ordered by code. With q (3+ characters), a code matches exactly and city/country names match by substring, case-insensitively. Plan/date rules are those of the fare lookup: Sandbox and Google add-on today only; Pro the current US fiscal year; Business (including Enterprise accounts) any loaded fiscal year.

Example:

curl --get 'https://api.allowancesapi.com/v1/gsa/city-pairs/locations' -H 'X-API-Key: YOUR_KEY' --data-urlencode 'q=washington'

Labels mirror the latest imported awards table and change with it.

Parameters 2

q string | null

query parameter

Match a code exactly or a city/country name by substring; case-insensitive. Omit to list every code of the fiscal year.

Example "washington"

date string | null

query parameter

Specific date in YYYY-MM-DD format

Response schema 200

(body) object[]

[] object

[].code stringrequired

GSA airport or metropolitan city code as used in City Pair awards.

[].city_name stringrequired

[].state string | null

US state abbreviation; null outside the United States.

[].state (anyOf 1) string

[].state (anyOf 2) null

[].country stringrequired

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

The plan does not permit the requested date.

404

No code matches, or the requested fiscal year is not loaded.

422

Search term shorter than 3 characters or invalid date.

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET https://api.allowancesapi.com/v1/gsa/city-pairs/locations \
  -H "X-API-Key: YOUR_KEY"
[
  {
    "code": "DCA",
    "city_name": "WASHINGTON",
    "state": "DC",
    "country": "UNITED STATES"
  },
  {
    "code": "WAS",
    "city_name": "WASHINGTON",
    "state": "DC",
    "country": "UNITED STATES"
  }
]

Example response. Rates and dates are illustrative.

GET /v1/gsa/city-pairs/{origin}/{destination}

City Pair contract airfares

Return every GSA contract award matching the airport/city code pair and date (today by default). Codes are returned in alphabetical order; fares are one-way USD and valid in either direction. Source start/end dates are inclusive; overlapping amendments are both returned. No fallback to other fiscal years or dates. Null fare categories are unavailable. Sandbox and Google add-on: today only. Pro: current US fiscal year. Business (including Enterprise accounts): any loaded fiscal year, including published future awards. Data reflects the latest imported table, not past publication snapshots. These are eligible government travelers' contract prices, not live seat availability or booking offers. Domestic fares exclude passenger facility, segment and security fees; international fares exclude taxes/fees but include fuel surcharges. Book through the agency's authorized system. Official CPP rules and price caveats; fare definitions.

Example (fixed date; use Business access for dates outside the current fiscal year):

curl --get 'https://api.allowancesapi.com/v1/gsa/city-pairs/ABE/ATL' -H 'X-API-Key: YOUR_KEY' -H 'X-Bypass-Cache: 1' --data-urlencode 'date=2026-10-28' --data-urlencode 'verification_url=true'

See the 200 response example for all result fields. Importing does not invalidate existing cached responses; use X-Bypass-Cache: 1 to verify newly imported data.

Parameters 4

origin stringrequired

path parameter

Three-letter airport or international city code; case-insensitive. No city-name expansion.

Example "ABE"

destination stringrequired

path parameter

Three-letter airport or international city code; case-insensitive. No city-name expansion.

Example "ABE"

verification_url boolean

query parameter

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

Example false

date string | null

query parameter

Specific date in YYYY-MM-DD format

Response schema 200

effective_date stringrequired

verification_url string | null

verification_url (anyOf 1) string

verification_url (anyOf 2) null

results object[]required

results[] object

results[].fiscal_year integerrequired

results[].origin_code stringrequired

results[].destination_code stringrequired

results[].airline_code stringrequired

results[].service stringrequired

N = non-stop; C = connecting.

Allowed values: ["N", "C"]

results[].effective_date stringrequired

results[].expiration_date stringrequired

results[].yca_fare number | null

One-way USD last-seat coach fare; null when unavailable.

results[].yca_fare (anyOf 1) number

results[].yca_fare (anyOf 2) null

results[].ca_fare number | null

One-way USD capacity-controlled coach fare; null when unavailable.

results[].ca_fare (anyOf 1) number

results[].ca_fare (anyOf 2) null

results[].business_fare number | null

One-way USD business (_CB) fare; null when unavailable.

results[].business_fare (anyOf 1) number

results[].business_fare (anyOf 2) null

results[].cp_fare number | null

One-way USD premium economy (_CP) fare; null when unavailable.

results[].cp_fare (anyOf 1) number

results[].cp_fare (anyOf 2) null

results[].cn_fare number | null

One-way USD non-refundable capacity-controlled fare; null when unavailable.

results[].cn_fare (anyOf 1) number

results[].cn_fare (anyOf 2) null

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

The plan does not permit the requested date.

404

No award for this route/date, or the requested fiscal year is not loaded.

422

Invalid airport/city code or date.

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET https://api.allowancesapi.com/v1/gsa/city-pairs/ABE/ABE \
  -H "X-API-Key: YOUR_KEY"
{
  "effective_date": "2026-10-01",
  "verification_url": "https://www.gsa.gov/travel/plan-a-trip/transportation-airfare-rates-pov-rates/airfare-rates-city-pair-program",
  "results": [
    {
      "fiscal_year": 2027,
      "origin_code": "ABE",
      "destination_code": "ATL",
      "airline_code": "DL",
      "service": "N",
      "effective_date": "2026-10-01",
      "expiration_date": "2027-09-30",
      "yca_fare": 710,
      "ca_fare": 355,
      "business_fare": null,
      "cp_fare": null,
      "cn_fare": null
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/gsa/mileage

POV mileage reimbursement rates

Return the privately owned vehicle (POV) mileage reimbursement rates in effect on the given date. If date is not specified, today's rates will be returned.

Parameters 3

type string | null

query parameter

Filter by mileage type

Example "airplane"

verification_url boolean

query parameter

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

Example false

date string | null

query parameter

Specific date in YYYY-MM-DD format

Response schema 200

effective_date stringrequired

verification_url string | null

verification_url (anyOf 1) string

verification_url (anyOf 2) null

results object[]required

results[] object

results[].mileage_type stringrequired

Allowed values: ["airplane", "automobile", "government_furnished_automobile", "motorcycle", "moving"]

results[].effective_date stringrequired

results[].rate_per_mile numberrequired

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET 'https://api.allowancesapi.com/v1/gsa/mileage?date=2026-07-11&verification_url=true' \
  -H "X-API-Key: YOUR_KEY"

Response to GET /v1/gsa/mileage?date=2026-07-11&verification_url=true. Rates are in USD per mile. Omit type to return all mileage types.

{
  "effective_date": "2026-01-01",
  "verification_url": "https://www.gsa.gov/travel/plan-a-trip/transportation-airfare-rates-pov-rates/privately-owned-vehicle-pov-mileage-reimbursement",
  "results": [
    {
      "mileage_type": "airplane",
      "effective_date": "2026-01-01",
      "rate_per_mile": 1.78
    },
    {
      "mileage_type": "automobile",
      "effective_date": "2026-01-01",
      "rate_per_mile": 0.725
    },
    {
      "mileage_type": "government_furnished_automobile",
      "effective_date": "2026-01-01",
      "rate_per_mile": 0.205
    },
    {
      "mileage_type": "motorcycle",
      "effective_date": "2026-01-01",
      "rate_per_mile": 0.705
    },
    {
      "mileage_type": "moving",
      "effective_date": "2026-01-01",
      "rate_per_mile": 0.205
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/gsa/mie-breakdowns

M&IE meal breakdowns

Return how daily M&IE totals break down into breakfast, lunch, dinner and incidental expenses, as in effect on the given date. The CONUS table breaks down the five standard CONUS M&IE tiers and is returned by default. Set region=oconus for the generic DTMO/DSSR M&IE total table. If date is not specified, today's breakdowns will be returned.

Parameters 4

region string

query parameter

Breakdown table to return; defaults to CONUS

Example "conus"

total integer | null

query parameter

Filter by daily M&IE total in USD

Example 1

verification_url boolean

query parameter

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

Example false

date string | null

query parameter

Specific date in YYYY-MM-DD format

Response schema 200

effective_date stringrequired

verification_url string | null

verification_url (anyOf 1) string

verification_url (anyOf 2) null

results object[]required

results[] object

results[].region stringrequired

Breakdown table the row belongs to: 'conus' covers the standard CONUS M&IE tiers, 'oconus' covers the M&IE totals set by DTMO/DSSR for OCONUS locations.

Allowed values: ["conus", "oconus"]

results[].effective_date stringrequired

Date this breakdown took effect (the 'Last updated' date published by GSA).

results[].mie_total integerrequired

Daily M&IE total in USD the breakdown applies to

results[].breakfast integerrequired

Breakfast portion of the M&IE total, in USD per day.

results[].lunch integerrequired

Lunch portion of the M&IE total, in USD per day.

results[].dinner integerrequired

Dinner portion of the M&IE total, in USD per day.

results[].incidentals integerrequired

Incidental expenses portion of the M&IE total, in USD per day.

results[].first_last_day number | null

First and last day of travel rate (75% of the M&IE total) in USD. CONUS only.

results[].first_last_day (anyOf 1) number

results[].first_last_day (anyOf 2) null

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET 'https://api.allowancesapi.com/v1/gsa/mie-breakdowns?date=2026-07-11&region=conus&total=68&verification_url=true' \
  -H "X-API-Key: YOUR_KEY"

Response to GET /v1/gsa/mie-breakdowns?date=2026-07-11&region=conus&total=68&verification_url=true. Amounts are in USD per day.

{
  "effective_date": "2026-06-23",
  "verification_url": "https://www.gsa.gov/travel/plan-a-trip/per-diem-rates/mie-breakdowns",
  "results": [
    {
      "region": "conus",
      "effective_date": "2026-06-23",
      "mie_total": 68,
      "breakfast": 16,
      "lunch": 19,
      "dinner": 28,
      "incidentals": 5,
      "first_last_day": 51.0
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/gsa/vehicle-rates/{rate_type}/{sin}

GSA Fleet vehicle leasing rates by SIN

Return the GSA Fleet vehicle leasing rates (monthly lease rate and rate per mile) for the vehicle type identified by its Standard Item Number (SIN), from the standard (US) or europe rate schedule. If year is not specified, the current fiscal year's rates will be returned. Rates are available from fiscal year 2022.

Parameters 4

rate_type stringrequired

path parameter

The GSA Fleet rate schedule: 'standard' covers vehicles leased in the United States, 'europe' covers vehicles leased in Europe.

Example "standard"

sin stringrequired

path parameter

Standard Item Number (SIN) identifying a GSA Fleet leased vehicle type, case insensitive.

Example "10B"

verification_url boolean

query parameter

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

Example false

year integer | null

query parameter

Example 1

Response schema 200

sin stringrequired

Standard Item Number of the vehicle type

vehicle_description stringrequired

rate_type stringrequired

Allowed values: ["standard", "europe"]

results object[]required

results[] object

results[].fiscal_year integerrequired

US fiscal year the rates apply to (starts Oct 1st, ends Sep 30th)

results[].monthly_rate integer | null

Monthly lease rate in USD. Null when the vehicle has no fixed monthly rate, see monthly_rate_type.

results[].monthly_rate (anyOf 1) integer

results[].monthly_rate (anyOf 2) null

results[].monthly_rate_type stringrequired

'fixed' when monthly_rate holds the amount. 'see_fsr', 'unique_rate' and 'unique_rate_use_rate_module' mean the monthly rate is set per vehicle by GSA Fleet and monthly_rate is null.

Allowed values: ["fixed", "see_fsr", "unique_rate_use_rate_module", "unique_rate"]

results[].mileage_rate number | null

Rate per mile in USD

results[].mileage_rate (anyOf 1) number

results[].mileage_rate (anyOf 2) null

verification_url string | null

verification_url (anyOf 1) string

verification_url (anyOf 2) null

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET 'https://api.allowancesapi.com/v1/gsa/vehicle-rates/standard/10B?year=2026&verification_url=true' \
  -H "X-API-Key: YOUR_KEY"

Response to GET /v1/gsa/vehicle-rates/standard/10B?year=2026&verification_url=true. Monthly rates are in USD per month; mileage rates are in USD per mile.

{
  "sin": "10B",
  "vehicle_description": "Sedan, Midsize",
  "rate_type": "standard",
  "results": [
    {
      "fiscal_year": 2026,
      "monthly_rate": 421,
      "monthly_rate_type": "fixed",
      "mileage_rate": 0.21
    }
  ],
  "verification_url": "https://www.gsa.gov/buy-through-us/products-and-services/transportation-and-logistics-services/fleet-management/vehicle-leasing/vehicle-rates"
}

Example response. Rates and dates are illustrative.

POST /v1/gsa/calc/mileage

Calculate POV mileage reimbursement

Calculate mileage reimbursement using the official GSA rate in effect on the travel date. Provide a distance in miles and select automobile, airplane, motorcycle, or moving mileage. For automobile travel, indicate whether a government-furnished automobile was authorized and available; this determines whether the standard or reduced rate applies. If no travel date is supplied, today's date is used. The response identifies the selected rate category, rate and effective date, and the reimbursement amount rounded to the nearest cent.

Request body application/json

distance numberrequired

One-way or total travel distance in miles, from 0.001 through 100,000.

vehicle_type stringrequired

Vehicle or travel category used to select the applicable GSA mileage rate.

Allowed values: ["automobile", "airplane", "motorcycle", "moving"]

government_vehicle_available boolean

Optional for automobile calculations and defaults to false. Use true when a government-furnished automobile is authorized and available; false selects the standard privately owned automobile rate.

date string | null

Travel date used to select the effective rate. Accepts YYYY-MM-DD or YYYYMMDD; defaults to today.

date (anyOf 1) string

date (anyOf 2) null

Response schema 200

distance stringrequired

Travel distance in miles used in the calculation.

distance_unit string

The distance unit in miles.

vehicle_type stringrequired

Vehicle category supplied by the caller.

Allowed values: ["automobile", "airplane", "motorcycle", "moving"]

government_vehicle_available boolean | null

Automobile availability choice used to select the rate; omitted for other vehicles.

government_vehicle_available (anyOf 1) boolean

government_vehicle_available (anyOf 2) null

mileage_type stringrequired

Stored GSA mileage-rate category selected by the calculator.

Allowed values: ["airplane", "automobile", "government_furnished_automobile", "motorcycle", "moving"]

travel_date stringrequired

Travel date used for the effective-rate lookup.

rate_effective_date stringrequired

Effective date of the GSA rate used in the calculation.

rate_per_mile stringrequired

Exact official GSA rate per mile; serialized as a decimal string.

amount stringrequired

Calculated reimbursement rounded to cents; serialized with two decimals.

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X POST https://api.allowancesapi.com/v1/gsa/calc/mileage \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  --data '{"date": "2026-07-11", "distance": 125.5, "government_vehicle_available": false, "vehicle_type": "automobile"}'

POST /v1/gsa/calc/perdiem/trip

Calculate a GSA CONUS trip per diem entitlement

Calculate estimated lodging and meals and incidental expenses (M&IE) reimbursement for a trip within the continental United States. The response provides a daily breakdown and trip totals.

Describe the trip

  • Add each temporary-duty stop in travel order, with inclusive arrival and departure dates.
  • Identify each stop with a GSA destination ID or ZIP code. A stop represents the temporary-duty locality, which may differ from the hotel location.
  • Optionally provide the actual nightly lodging cost and any meals that must be deducted.
  • When one stop ends on the same date another begins, the arriving stop applies to that date.

Calculation rules

  • The calculator selects the GSA rate in effect for each day, including seasonal and fiscal-year changes.
  • First and last travel days receive 75% of the M&IE rate; intermediate days receive 100%.
  • Submitted meal deductions use the official GSA meal values while preserving the required incidental expense amount.
  • Lodging reimbursement is limited to the nightly GSA cap. Any amount above the cap is reported as overage and is not included in the payable total.

Important notes

  • Submit only meals that you have determined must be deducted under FTR 301-11.21.
  • Single-day reimbursement applies only when the traveler is in eligible travel status for more than 12 hours.
  • If a lodging cost is omitted, the response still shows the nightly cap, but lodging and overall payable totals are null.
  • The response includes the calculation version and a source fingerprint to support auditing.

Request body application/json

stops object[]required

Ordered, contiguous TDY-locality stops for the trip.

stops[] object

stops[].location objectrequired

TDY locality for the stop; not merely the hotel location.

stops[].location.zipcode string | null

Five-digit US ZIP or ZIP+4. ZIP+4 is normalized to five digits.

stops[].location.zipcode (anyOf 1) string

stops[].location.zipcode (anyOf 2) null

stops[].location.destination_id integer | null

GSA destination identifier. Destination 0 is Standard CONUS.

stops[].location.destination_id (anyOf 1) integer

stops[].location.destination_id (anyOf 2) null

stops[].arrival_date stringrequired

First calendar date owned by this stop.

stops[].departure_date stringrequired

Shared boundary/return date; the arriving next stop owns a transition date.

stops[].lodging_cost_per_night number | string | null

Optional actual room cost applied to every lodging night in this stop. Must be a JSON number with no more than two decimal places.

stops[].lodging_cost_per_night (anyOf 1) number

stops[].lodging_cost_per_night (anyOf 2) string

stops[].lodging_cost_per_night (anyOf 3) null

deductible_meals object[]

Sparse caller-determined meal deductions, keyed by trip date.

deductible_meals[] object

deductible_meals[].date stringrequired

Inclusive trip date on which meals are deducted.

deductible_meals[].meals string[]required

Non-empty unique breakfast/lunch/dinner deductions for the date.

deductible_meals[].meals[] string

Allowed values: ["breakfast", "lunch", "dinner"]

verification_url boolean

Include deduplicated official GSA verification URLs when true.

Response schema 200

trip objectrequired

Inclusive trip date and day/night counts.

trip.start_date stringrequired

First inclusive trip date.

trip.end_date stringrequired

Final inclusive return date.

trip.days integerrequired

Number of M&IE calendar days.

trip.nights integerrequired

Number of lodging nights.

totals objectrequired

Reconciled totals built from rounded daily components.

totals.lodging_payable string | nullrequired

Sum of payable lodging, or null if any actual is missing.

totals.lodging_payable (anyOf 1) stringrequired

USD amount serialized as a fixed two-decimal string.

totals.lodging_payable (anyOf 2) nullrequired

totals.mie_payable stringrequired

Sum of all rounded daily payable M&IE amounts.

totals.total_payable string | nullrequired

Lodging plus M&IE, or null if any lodging actual is missing.

totals.total_payable (anyOf 1) stringrequired

USD amount serialized as a fixed two-decimal string.

totals.total_payable (anyOf 2) nullrequired

totals.lodging_overage string | nullrequired

Non-payable actual lodging above caps, or null if incomplete.

totals.lodging_overage (anyOf 1) stringrequired

USD amount serialized as a fixed two-decimal string.

totals.lodging_overage (anyOf 2) nullrequired

totals.lodging_actuals_complete booleanrequired

True when every lodging night has an actual cost.

days object[]required

Self-contained daily entitlement audit records.

days[] object

days[].date stringrequired

Calendar date represented by this audit record.

days[].locality objectrequired

TDY locality supplying the date's GSA rate.

days[].locality.destination_id integerrequired

GSA destination ID supplying this date's rate.

days[].locality.name stringrequired

GSA destination display name.

days[].locality.county stringrequired

County or CONUS area associated with the destination.

days[].rate_source string

Government rate source used by this calculator.

days[].fiscal_year integerrequired

GSA fiscal year of the selected per diem row.

days[].per_diem_effective_date stringrequired

Effective date of the selected GSA per diem source row.

days[].mie_breakdown_effective_date stringrequired

Effective date of the selected M&IE breakdown source row.

days[].day_type stringrequired

Day classification controlling M&IE proration.

Allowed values: ["first", "full", "last", "single_day"]

days[].mie objectrequired

M&IE calculation for this date.

days[].mie.full_rate stringrequired

Full daily GSA M&IE rate.

days[].mie.proration_factor numberrequired

0.75 on first/last/single days and 1.0 on full days.

days[].mie.prorated_rate stringrequired

Full rate multiplied by the applicable proration factor.

days[].mie.deducted_meals string[]required

Normalized caller-supplied meals deducted on this date.

days[].mie.deducted_meals[] string

Allowed values: ["breakfast", "lunch", "dinner"]

days[].mie.meal_deductions stringrequired

Sum of the full meal-specific deduction amounts.

days[].mie.payable stringrequired

M&IE payable after deductions and the incidental floor.

days[].mie.breakdown objectrequired

Official meal-specific breakdown used for deductions.

days[].mie.breakdown.breakfast stringrequired

Full breakfast deduction amount.

days[].mie.breakdown.lunch stringrequired

Full lunch deduction amount.

days[].mie.breakdown.dinner stringrequired

Full dinner deduction amount.

days[].mie.breakdown.incidentals stringrequired

Retained incidental-expense amount and payable floor.

days[].lodging objectrequired

Lodging calculation for the night beginning on this date.

days[].lodging.night booleanrequired

Whether an overnight stay begins on this date.

days[].lodging.cap string | null

Applicable GSA room-rate cap for this night.

days[].lodging.cap (anyOf 1) string

USD amount serialized as a fixed two-decimal string.

days[].lodging.cap (anyOf 2) null

days[].lodging.actual string | null

Caller-supplied actual room cost, if available.

days[].lodging.actual (anyOf 1) string

USD amount serialized as a fixed two-decimal string.

days[].lodging.actual (anyOf 2) null

days[].lodging.payable string | null

Actual room cost payable up to the cap.

days[].lodging.payable (anyOf 1) string

USD amount serialized as a fixed two-decimal string.

days[].lodging.payable (anyOf 2) null

days[].lodging.overage string | null

Actual nightly room cost above the GSA lodging cap. This amount is not included in lodging_payable or total_payable.

days[].lodging.overage (anyOf 1) string

USD amount serialized as a fixed two-decimal string.

days[].lodging.overage (anyOf 2) null

notes string[]required

Calculation-specific qualifications; empty for ordinary trips.

notes[] string

verification_urls object[] | null

Deduplicated official URLs, omitted unless requested.

verification_urls (anyOf 1) object[]

verification_urls (anyOf 1)[] object

verification_urls (anyOf 1)[].type stringrequired

Source page represented by the URL.

Allowed values: ["per_diem", "mie_breakdown"]

verification_urls (anyOf 1)[].url stringrequired

Official GSA source URL.

verification_urls (anyOf 1)[].destination_id integer | null

Destination represented by a per-diem URL.

verification_urls (anyOf 1)[].destination_id (anyOf 1) integer

verification_urls (anyOf 1)[].destination_id (anyOf 2) null

verification_urls (anyOf 1)[].fiscal_year integer | null

Fiscal year represented by a per-diem URL.

verification_urls (anyOf 1)[].fiscal_year (anyOf 1) integer

verification_urls (anyOf 1)[].fiscal_year (anyOf 2) null

verification_urls (anyOf 2) null

calculation_version stringrequired

Version identifier for result-affecting calculator rules.

source_fingerprint stringrequired

SHA-256 fingerprint of distinct source values used; not a snapshot ID.

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X POST https://api.allowancesapi.com/v1/gsa/calc/perdiem/trip \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  --data '{"ambiguous_zip": {"summary": "Ambiguous ZIP returns candidates", "value": {"stops": [{"arrival_date": "2026-07-10", "departure_date": "2026-07-12", "location": {"zipcode": "01366"}}]}}, "basic_complete_trip": {"summary": "Basic trip with complete lodging actuals", "value": {"stops": [{"arrival_date": "2026-10-01", "departure_date": "2026-10-03", "location": {"zipcode": "20001"}, "lodging_cost_per_night": 250}], "verification_url": true}}, "destination_retry": {"summary": "Retry an ambiguous ZIP with the selected destination", "value": {"stops": [{"arrival_date": "2026-07-10", "departure_date": "2026-07-12", "location": {"destination_id": 160, "zipcode": "01366"}}]}}, "incidental_floor": {"summary": "All meal deductions trigger the incidental floor", "value": {"deductible_meals": [{"date": "2026-07-10", "meals": ["breakfast", "lunch", "dinner"]}], "stops": [{"arrival_date": "2026-07-10", "departure_date": "2026-07-10", "location": {"destination_id": 75}}]}}, "lodging_caps_only": {"summary": "Omitted lodging actuals return caps and null lodging totals", "value": {"stops": [{"arrival_date": "2026-07-10", "departure_date": "2026-07-12", "location": {"destination_id": 75}}]}}, "multi_stop_transition": {"summary": "The arriving stop owns the shared transition date", "value": {"stops": [{"arrival_date": "2026-07-10", "departure_date": "2026-07-11", "location": {"destination_id": 75}, "lodging_cost_per_night": 200}, {"arrival_date": "2026-07-11", "departure_date": "2026-07-12", "location": {"destination_id": 160}, "lodging_cost_per_night": 150}]}}, "single_day": {"summary": "Conditional single-day subsistence calculation", "value": {"stops": [{"arrival_date": "2026-07-10", "departure_date": "2026-07-10", "location": {"destination_id": 75}}]}}}'

OPM - General Schedule pay

GET /v1/opm/localities

GS locality pay areas, optionally by county or city

List the locality pay areas of the latest pay year, with the code to use on the pay endpoints. The optional location keeps the areas whose name contains every word, and the areas of the counties and cities with that name. state narrows location to one state and has no effect without it.

County and city names must match exactly, ignoring case; a trailing county is optional. A place outside every listed area returns Rest of U.S. (RUS). Area names keep matching on any word they contain. matched_places lists the counties and cities behind each result. A place name can return several areas: the same name can exist in several states, which state narrows, and a city can span several areas, in which case all of them are returned and the official duty station decides. City data is not published by OPM, so for payroll use /v1/opm/localities/county/{fips}. An empty result does not mean Rest of U.S.: the name may be misspelled, and U.S. territories are not covered.

Parameters 2

location string | null

query parameter

County, city or locality area name.

Example "evanston"

state string | null

query parameter

Restrict location to one state.

Example "AL"

Response schema 200

year integerrequired

Pay year of the results, the latest one loaded.

results object[]required

results[] object

results[].locality_code stringrequired

OPM locality pay area code. It can look like a state code: AL is Albany.

results[].locality_name string | nullrequired

Locality pay area name as published for this pay year; null for the base table GS.

results[].locality_name (anyOf 1) stringrequired

results[].locality_name (anyOf 2) nullrequired

results[].locality_pct number | nullrequired

Locality payment in percent; null for the base table GS.

results[].locality_pct (anyOf 1) numberrequired

results[].locality_pct (anyOf 2) nullrequired

results[].matched_places string[]required

Counties and cities named by location that fall under this area; empty when none did.

results[].matched_places[] string

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET https://api.allowancesapi.com/v1/opm/localities \
  -H "X-API-Key: YOUR_KEY"
{
  "year": 2026,
  "results": [
    {
      "locality_code": "CHI",
      "locality_name": "Chicago-Naperville, IL-IN-WI",
      "locality_pct": 30.86,
      "matched_places": [
        "Evanston, IL (city)"
      ]
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/opm/localities/county/{fips}

GS locality pay area of a county

Return the locality pay area of a county for the latest pay year, using OPM's own definitions. A county that OPM doesn't list under an area falls under Rest of U.S. (RUS), and every county in Alaska or Hawaii returns that state's area. Returns 404 for an unknown code and for a Connecticut planning region, as OPM defines Connecticut by its eight legacy counties. U.S. territories fall under Rest of U.S. in OPM's definitions, but their county codes are not available here and return 404. Burlington County, NJ (34005) returns the Philadelphia area, while three military sites inside it (Fort Dix, Joint Base McGuire-Dix-Lakehurst and McGuire Air Force Base) belong to the New York area.

Parameters 1

fips stringrequired

path parameter

Example "17031"

Response schema 200

year integerrequired

Pay year of the results, the latest one loaded.

results object[]required

results[] object

results[].locality_code stringrequired

OPM locality pay area code. It can look like a state code: AL is Albany.

results[].locality_name string | nullrequired

Locality pay area name as published for this pay year; null for the base table GS.

results[].locality_name (anyOf 1) stringrequired

results[].locality_name (anyOf 2) nullrequired

results[].locality_pct number | nullrequired

Locality payment in percent; null for the base table GS.

results[].locality_pct (anyOf 1) numberrequired

results[].locality_pct (anyOf 2) nullrequired

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET https://api.allowancesapi.com/v1/opm/localities/county/17031 \
  -H "X-API-Key: YOUR_KEY"
{
  "year": 2026,
  "results": [
    {
      "locality_code": "CHI",
      "locality_name": "Chicago-Naperville, IL-IN-WI",
      "locality_pct": 30.86
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/opm/pay/search

Search GS pay by locality area

Return the latest pay tables whose locality area matches every word of q: each word must be contained in the area name, case-insensitively, or equal its code. grade and step narrow the rates. No match returns an empty results list.

Matching only looks at OPM's locality area names, not at the counties and towns each area covers: naperville finds Chicago because the name contains it, while a town missing from the names returns nothing. No match does not mean the place falls under Rest of U.S.

Parameters 3

q stringrequired

query parameter

Words to find in the locality area name or code, all required, case-insensitive.

Example "chicago"

grade integer | null

query parameter

Return only this GS grade, 1 to 15.

Example 1

step integer | null

query parameter

Return only this step, 1 to 10.

Example 1

Response schema 200

year integerrequired

Pay year of the results, the latest one loaded.

results object[]required

results[] object

results[].locality_code stringrequired

OPM locality pay area code. It can look like a state code: AL is Albany.

results[].locality_name string | nullrequired

Locality pay area name as published for this pay year; null for the base table GS.

results[].locality_name (anyOf 1) stringrequired

results[].locality_name (anyOf 2) nullrequired

results[].locality_pct number | nullrequired

Locality payment in percent; null for the base table GS.

results[].locality_pct (anyOf 1) numberrequired

results[].locality_pct (anyOf 2) nullrequired

results[].rates object[]required

results[].rates[] object

results[].rates[].grade integerrequired

GS grade, 1 to 15.

results[].rates[].step integerrequired

Step within the grade, 1 to 10.

results[].rates[].annual integerrequired

Annual rate in USD.

results[].rates[].hourly numberrequired

Hourly rate in USD.

results[].rates[].overtime numberrequired

Overtime hourly rate in USD.

results[].rates[].capped booleanrequired

True when the rate is limited by the statutory pay cap.

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET 'https://api.allowancesapi.com/v1/opm/pay/search?q=chicago' \
  -H "X-API-Key: YOUR_KEY"
{
  "year": 2026,
  "results": [
    {
      "locality_code": "CHI",
      "locality_name": "Chicago-Naperville, IL-IN-WI",
      "locality_pct": 30.86,
      "rates": [
        {
          "grade": 9,
          "step": 1,
          "annual": 68999,
          "hourly": 33.06,
          "overtime": 49.59,
          "capped": false
        }
      ]
    }
  ]
}

Example response. Rates and dates are illustrative.

GET /v1/opm/pay/{locality_code}

GS pay by locality code

Return the latest pay table of a locality pay area, ordered by grade and step, or 404 for an unknown code. grade and step narrow the rates. Use GS for the base table without locality pay, and RUS for Rest of U.S.

Parameters 3

locality_code stringrequired

path parameter

Example "CHI"

grade integer | null

query parameter

Return only this GS grade, 1 to 15.

Example 1

step integer | null

query parameter

Return only this step, 1 to 10.

Example 1

Response schema 200

year integerrequired

Pay year of the results, the latest one loaded.

results object[]required

results[] object

results[].locality_code stringrequired

OPM locality pay area code. It can look like a state code: AL is Albany.

results[].locality_name string | nullrequired

Locality pay area name as published for this pay year; null for the base table GS.

results[].locality_name (anyOf 1) stringrequired

results[].locality_name (anyOf 2) nullrequired

results[].locality_pct number | nullrequired

Locality payment in percent; null for the base table GS.

results[].locality_pct (anyOf 1) numberrequired

results[].locality_pct (anyOf 2) nullrequired

results[].rates object[]required

results[].rates[] object

results[].rates[].grade integerrequired

GS grade, 1 to 15.

results[].rates[].step integerrequired

Step within the grade, 1 to 10.

results[].rates[].annual integerrequired

Annual rate in USD.

results[].rates[].hourly numberrequired

Hourly rate in USD.

results[].rates[].overtime numberrequired

Overtime hourly rate in USD.

results[].rates[].capped booleanrequired

True when the rate is limited by the statutory pay cap.

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET https://api.allowancesapi.com/v1/opm/pay/CHI \
  -H "X-API-Key: YOUR_KEY"
{
  "year": 2026,
  "results": [
    {
      "locality_code": "CHI",
      "locality_name": "Chicago-Naperville, IL-IN-WI",
      "locality_pct": 30.86,
      "rates": [
        {
          "grade": 9,
          "step": 1,
          "annual": 68999,
          "hourly": 33.06,
          "overtime": 49.59,
          "capped": false
        }
      ]
    }
  ]
}

Example response. Rates and dates are illustrative.

Metadata

GET /v1/meta/latest

Latest data publications

Response schema 200

dssr objectrequired

dssr.allowances objectrequired

dssr.allowances.published_date string | null

dssr.allowances.published_date (anyOf 1) string

dssr.allowances.published_date (anyOf 2) null

dssr.allowances.fiscal_year integer | null

dssr.allowances.fiscal_year (anyOf 1) integer

dssr.allowances.fiscal_year (anyOf 2) null

dssr.perdiem objectrequired

dssr.perdiem.published_date string | null

dssr.perdiem.published_date (anyOf 1) string

dssr.perdiem.published_date (anyOf 2) null

dssr.perdiem.fiscal_year integer | null

dssr.perdiem.fiscal_year (anyOf 1) integer

dssr.perdiem.fiscal_year (anyOf 2) null

dtmo objectrequired

dtmo.oconus_perdiem objectrequired

dtmo.oconus_perdiem.published_date string | null

dtmo.oconus_perdiem.published_date (anyOf 1) string

dtmo.oconus_perdiem.published_date (anyOf 2) null

dtmo.oconus_perdiem.fiscal_year integer | null

dtmo.oconus_perdiem.fiscal_year (anyOf 1) integer

dtmo.oconus_perdiem.fiscal_year (anyOf 2) null

dtmo.conus_perdiem objectrequired

dtmo.conus_perdiem.published_date string | null

dtmo.conus_perdiem.published_date (anyOf 1) string

dtmo.conus_perdiem.published_date (anyOf 2) null

dtmo.conus_perdiem.fiscal_year integer | null

dtmo.conus_perdiem.fiscal_year (anyOf 1) integer

dtmo.conus_perdiem.fiscal_year (anyOf 2) null

gsa objectrequired

gsa.conus_perdiem objectrequired

gsa.conus_perdiem.published_date string | null

gsa.conus_perdiem.published_date (anyOf 1) string

gsa.conus_perdiem.published_date (anyOf 2) null

gsa.conus_perdiem.fiscal_year integer | null

gsa.conus_perdiem.fiscal_year (anyOf 1) integer

gsa.conus_perdiem.fiscal_year (anyOf 2) null

gsa.mileage objectrequired

gsa.mileage.published_date string | null

gsa.mileage.published_date (anyOf 1) string

gsa.mileage.published_date (anyOf 2) null

gsa.mileage.fiscal_year integer | null

gsa.mileage.fiscal_year (anyOf 1) integer

gsa.mileage.fiscal_year (anyOf 2) null

gsa.vehicle_rates objectrequired

gsa.vehicle_rates.published_date string | null

gsa.vehicle_rates.published_date (anyOf 1) string

gsa.vehicle_rates.published_date (anyOf 2) null

gsa.vehicle_rates.fiscal_year integer | null

gsa.vehicle_rates.fiscal_year (anyOf 1) integer

gsa.vehicle_rates.fiscal_year (anyOf 2) null

gsa.mie_breakdown objectrequired

gsa.mie_breakdown.published_date string | null

gsa.mie_breakdown.published_date (anyOf 1) string

gsa.mie_breakdown.published_date (anyOf 2) null

gsa.mie_breakdown.fiscal_year integer | null

gsa.mie_breakdown.fiscal_year (anyOf 1) integer

gsa.mie_breakdown.fiscal_year (anyOf 2) null

fema objectrequired

fema.hotels objectrequired

fema.hotels.published_date string | null

fema.hotels.published_date (anyOf 1) string

fema.hotels.published_date (anyOf 2) null

fema.hotels.fiscal_year integer | null

fema.hotels.fiscal_year (anyOf 1) integer

fema.hotels.fiscal_year (anyOf 2) null

opm objectrequired

opm.pay_tables objectrequired

opm.pay_tables.published_date string | null

opm.pay_tables.published_date (anyOf 1) string

opm.pay_tables.published_date (anyOf 2) null

opm.pay_tables.fiscal_year integer | null

opm.pay_tables.fiscal_year (anyOf 1) integer

opm.pay_tables.fiscal_year (anyOf 2) null

Other responses

400

Bad Request

401

Unauthorized — Missing or invalid API key.

403

Forbidden — Insufficient permissions.

404

Not Found

422

Validation Error

429

Too Many Requests — Rate limit exceeded.

500

Internal Server Error

curl -X GET https://api.allowancesapi.com/v1/meta/latest \
  -H "X-API-Key: YOUR_KEY"

User

GET /v1/me

Get User

Response schema 200

(body) object

curl -X GET https://api.allowancesapi.com/v1/me \
  -H "X-API-Key: YOUR_KEY"

Response to GET /v1/me with a Pro account's X-API-Key. The request does not consume the account's query quota. monthly_queries_limit is returned as a string when configured through the environment.

{
  "user_id": 123,
  "user_email": "developer@example.com",
  "active_plan": "pro",
  "renewal_date": "2026/11/01",
  "period_start": "2026-10-01T00:00:00+00:00",
  "period_end": "2026-11-01T00:00:00+00:00",
  "monthly_queries_limit": "5000",
  "used_queries": 127,
  "status": "ok"
}

Example response. Rates and dates are illustrative.

MCP server & tools

AI agents and MCP clients can call every /v1/ endpoint of this API as a tool through the Streamable HTTP MCP server at https://mcp.allowancesapi.com/mcp. Initialization and tool discovery need no credentials. Tool calls need the X-API-Key header on the MCP connection; keys are never passed as tool arguments and OAuth login is not provided. Each tool call follows the authentication, date, plan and quota rules of the endpoint it wraps. The tool catalogue is published in the x-mcp extension of this OpenAPI document and listed below, grouped like the endpoints.

U.S. government travel per diem and overseas allowances from the official GSA, DTMO and State Department (DSSR) tables, in USD per day.

Choosing a source. GSA tools: per diem inside the continental U.S. for civilian federal travel, by state and city or ZIP. DTMO tools: Department of Defense rates; OCONUS covers foreign countries plus Alaska, Hawaii and U.S. territories, CONUS covers the states. Use DTMO for military, DoD and defense-contractor travel. DSSR tools: State Department rates for civilian U.S. government employees abroad: per diem, COLA, hardship, danger pay, LQA, TQSA, education. If the traveller's agency is unknown, use GSA for CONUS and DSSR abroad, and say which source you used. DTMO and DSSR usually agree on lodging and M&IE for a foreign post. FEMA tools answer a different question: whether a lodging property is on FEMA's Hotel and Motel National Master List (Fire Safety Act compliance, a requirement for reimbursed federal travel), by FEMA ID, ZIP, state and city, or a free-text search on the property name and town. They return no rates.

Finding a location. search_perdiem (DSSR) and search_dtmo_perdiem (DTMO) take a city or country name of at least three characters. Other tools need an ISO alpha-2 country code or a US-XX state code; get_countries and the locations tools resolve names.

Dates. Omit date for today's rates. A date returns the rates in force on that day; DTMO also accepts a fiscal year (Oct 1 to Sep 30). Each result row carries its own effective_date and season; the top-level effective_date is the publication period. Historical dates depend on the plan; a 403 states the restriction. Plan and quota errors are final: relay them, do not retry.

maximum_perdiem is lodging plus meals and incidentals. Pass verification_url=true for a link to the official government table.

Tool calls need an API key in the X-API-Key header; free Sandbox keys: https://www.allowancesapi.com/register

https://mcp.allowancesapi.com/mcp ↗

MCP - DSSR - OCONUS locations

TOOL get_allowances

get_allowances

DSSR allowances by country

Input schema

country_iso_code stringrequired

ISO 3166-1 alpha-2 country code, e.g. PG for Papua New Guinea; ZZ stands for 'Other Foreign Localities', not a country. Resolve a country name to its code with get_countries (q=name).

type string[]

Filter returned allowances. Unknown values are ignored.
If not specified, all allowances are returned.
Canonical values: cola, hardship, lqa, danger_pay, education, perdiem.
Aliases accepted: cost_of_living, cost-of-living, danger, danger-pay, livingquarters.

Allowed values: ["cola", "hardship", "lqa", "danger_pay", "education"]

type[] string

verification_url boolean

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

date string | null

Specific date in YYYY-MM-DD format

date (anyOf 1) string

date (anyOf 2) null

{
  "type": "object",
  "properties": {
    "country_iso_code": {
      "type": "string",
      "description": "ISO 3166-1 alpha-2 country code, e.g. PG for Papua New Guinea; ZZ stands for 'Other Foreign Localities', not a country. Resolve a country name to its code with get_countries (q=name).",
      "examples": [
        "BE",
        "JP",
        "KE"
      ],
      "title": "Country Iso Code"
    },
    "type": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "title": "Allowance type",
      "description": "Filter returned allowances. Unknown values are ignored.<br/>If not specified, all allowances are returned.<br/>Canonical values: cola, hardship, lqa, danger_pay, education, perdiem.<br/>Aliases accepted: cost_of_living, cost-of-living, danger, danger-pay, livingquarters.",
      "enum": [
        "cola",
        "hardship",
        "lqa",
        "danger_pay",
        "education"
      ]
    },
    "verification_url": {
      "type": "boolean",
      "title": "Verification URL",
      "description": "If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.",
      "default": false
    },
    "date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ],
      "description": "Specific date in YYYY-MM-DD format",
      "title": "Date"
    }
  },
  "required": [
    "country_iso_code"
  ]
}

TOOL get_allowances_by_location

get_allowances_by_location

DSSR allowances by location name

Input schema

location stringrequired

Location name, case insensitive

country_iso_code stringrequired

ISO 3166-1 alpha-2 country code, e.g. PG for Papua New Guinea; ZZ stands for 'Other Foreign Localities', not a country. Resolve a country name to its code with get_countries (q=name).

type string[]

Filter returned allowances. Unknown values are ignored.
If not specified, all allowances are returned.
Canonical values: cola, hardship, lqa, danger_pay, education, perdiem.
Aliases accepted: cost_of_living, cost-of-living, danger, danger-pay, livingquarters.

Allowed values: ["cola", "hardship", "lqa", "danger_pay", "education"]

type[] string

verification_url boolean

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

date string | null

Specific date in YYYY-MM-DD format

date (anyOf 1) string

date (anyOf 2) null

{
  "type": "object",
  "properties": {
    "location": {
      "type": "string",
      "description": "Location name, case insensitive",
      "openapi_examples": {
        "adelaide": {
          "summary": "Adelaide, Australia",
          "value": "Adelaide"
        },
        "tokyo": {
          "summary": "Tokyo, Japan (lowercase)",
          "value": "tokyo"
        },
        "partial": {
          "summary": "Tokyo, Japan (partial)",
          "value": "toky"
        }
      },
      "title": "Location"
    },
    "country_iso_code": {
      "type": "string",
      "description": "ISO 3166-1 alpha-2 country code, e.g. PG for Papua New Guinea; ZZ stands for 'Other Foreign Localities', not a country. Resolve a country name to its code with get_countries (q=name).",
      "examples": [
        "BE",
        "JP",
        "KE"
      ],
      "title": "Country Iso Code"
    },
    "type": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "title": "Allowance type",
      "description": "Filter returned allowances. Unknown values are ignored.<br/>If not specified, all allowances are returned.<br/>Canonical values: cola, hardship, lqa, danger_pay, education, perdiem.<br/>Aliases accepted: cost_of_living, cost-of-living, danger, danger-pay, livingquarters.",
      "enum": [
        "cola",
        "hardship",
        "lqa",
        "danger_pay",
        "education"
      ]
    },
    "verification_url": {
      "type": "boolean",
      "title": "Verification URL",
      "description": "If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.",
      "default": false
    },
    "date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ],
      "description": "Specific date in YYYY-MM-DD format",
      "title": "Date"
    }
  },
  "required": [
    "location",
    "country_iso_code"
  ]
}

TOOL get_allowances_by_postcode

get_allowances_by_postcode

DSSR allowances by location post code

Input schema

postcode integerrequired

5-digit DSSR post code (no zero-padding)

country_iso_code stringrequired

ISO 3166-1 alpha-2 country code, e.g. PG for Papua New Guinea; ZZ stands for 'Other Foreign Localities', not a country. Resolve a country name to its code with get_countries (q=name).

type string[]

Filter returned allowances. Unknown values are ignored.
If not specified, all allowances are returned.
Canonical values: cola, hardship, lqa, danger_pay, education, perdiem.
Aliases accepted: cost_of_living, cost-of-living, danger, danger-pay, livingquarters.

Allowed values: ["cola", "hardship", "lqa", "danger_pay", "education"]

type[] string

verification_url boolean

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

date string | null

Specific date in YYYY-MM-DD format

date (anyOf 1) string

date (anyOf 2) null

{
  "type": "object",
  "properties": {
    "postcode": {
      "type": "integer",
      "maximum": 99999,
      "minimum": 10000,
      "title": "DSSR post code",
      "description": "5-digit DSSR post code (no zero-padding)"
    },
    "country_iso_code": {
      "type": "string",
      "description": "ISO 3166-1 alpha-2 country code, e.g. PG for Papua New Guinea; ZZ stands for 'Other Foreign Localities', not a country. Resolve a country name to its code with get_countries (q=name).",
      "examples": [
        "BE",
        "JP",
        "KE"
      ],
      "title": "Country Iso Code"
    },
    "type": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "title": "Allowance type",
      "description": "Filter returned allowances. Unknown values are ignored.<br/>If not specified, all allowances are returned.<br/>Canonical values: cola, hardship, lqa, danger_pay, education, perdiem.<br/>Aliases accepted: cost_of_living, cost-of-living, danger, danger-pay, livingquarters.",
      "enum": [
        "cola",
        "hardship",
        "lqa",
        "danger_pay",
        "education"
      ]
    },
    "verification_url": {
      "type": "boolean",
      "title": "Verification URL",
      "description": "If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.",
      "default": false
    },
    "date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ],
      "description": "Specific date in YYYY-MM-DD format",
      "title": "Date"
    }
  },
  "required": [
    "postcode",
    "country_iso_code"
  ]
}

TOOL search_perdiem

search_perdiem

Search DSSR Per Diem by country/location name

Search globally by case-insensitive substring of a location or country name.

The date selects effective and seasonal rates and defaults to today. The response effective_date is the first day of the selected month. Missing, blank, or fewer than three characters after trimming returns HTTP 422. A valid search with no matching rates returns HTTP 404.

Input schema

q stringrequired

Required case-insensitive substring of a location or country name; at least three characters after trimming.

date string | null

Specific date in YYYY-MM-DD format

date (anyOf 1) string

date (anyOf 2) null

{
  "type": "object",
  "properties": {
    "q": {
      "type": "string",
      "minLength": 3,
      "description": "Required case-insensitive substring of a location or country name; at least three characters after trimming.",
      "title": "Q"
    },
    "date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ],
      "description": "Specific date in YYYY-MM-DD format",
      "title": "Date"
    }
  },
  "required": [
    "q"
  ]
}

TOOL get_perdiem_allowance

get_perdiem_allowance

DSSR per diem by country

Input schema

country_iso_code stringrequired

ISO 3166-1 alpha-2 country code, e.g. PG for Papua New Guinea; ZZ stands for 'Other Foreign Localities', not a country. Resolve a country name to its code with get_countries (q=name).

verification_url boolean

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

date string | null

Specific date in YYYY-MM-DD format

date (anyOf 1) string

date (anyOf 2) null

{
  "type": "object",
  "properties": {
    "country_iso_code": {
      "type": "string",
      "description": "ISO 3166-1 alpha-2 country code, e.g. PG for Papua New Guinea; ZZ stands for 'Other Foreign Localities', not a country. Resolve a country name to its code with get_countries (q=name).",
      "examples": [
        "BE",
        "JP",
        "KE"
      ],
      "title": "Country Iso Code"
    },
    "verification_url": {
      "type": "boolean",
      "title": "Verification URL",
      "description": "If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.",
      "default": false
    },
    "date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ],
      "description": "Specific date in YYYY-MM-DD format",
      "title": "Date"
    }
  },
  "required": [
    "country_iso_code"
  ]
}

TOOL get_perdiem_allowance_by_location

get_perdiem_allowance_by_location

DSSR per diem by location name

Input schema

location stringrequired

Location name, case insensitive

country_iso_code stringrequired

ISO 3166-1 alpha-2 country code, e.g. PG for Papua New Guinea; ZZ stands for 'Other Foreign Localities', not a country. Resolve a country name to its code with get_countries (q=name).

verification_url boolean

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

date string | null

Specific date in YYYY-MM-DD format

date (anyOf 1) string

date (anyOf 2) null

{
  "type": "object",
  "properties": {
    "location": {
      "type": "string",
      "description": "Location name, case insensitive",
      "openapi_examples": {
        "adelaide": {
          "summary": "Adelaide, Australia",
          "value": "Adelaide"
        },
        "tokyo": {
          "summary": "Tokyo, Japan (lowercase)",
          "value": "tokyo"
        },
        "partial": {
          "summary": "Tokyo, Japan (partial)",
          "value": "toky"
        }
      },
      "title": "Location"
    },
    "country_iso_code": {
      "type": "string",
      "description": "ISO 3166-1 alpha-2 country code, e.g. PG for Papua New Guinea; ZZ stands for 'Other Foreign Localities', not a country. Resolve a country name to its code with get_countries (q=name).",
      "examples": [
        "BE",
        "JP",
        "KE"
      ],
      "title": "Country Iso Code"
    },
    "verification_url": {
      "type": "boolean",
      "title": "Verification URL",
      "description": "If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.",
      "default": false
    },
    "date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ],
      "description": "Specific date in YYYY-MM-DD format",
      "title": "Date"
    }
  },
  "required": [
    "location",
    "country_iso_code"
  ]
}

TOOL get_perdiem_allowance_by_postcode

get_perdiem_allowance_by_postcode

DSSR per diem by location post code

Input schema

postcode integerrequired

5-digit DSSR post code (no zero-padding)

country_iso_code stringrequired

ISO 3166-1 alpha-2 country code, e.g. PG for Papua New Guinea; ZZ stands for 'Other Foreign Localities', not a country. Resolve a country name to its code with get_countries (q=name).

verification_url boolean

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

date string | null

Specific date in YYYY-MM-DD format

date (anyOf 1) string

date (anyOf 2) null

{
  "type": "object",
  "properties": {
    "postcode": {
      "type": "integer",
      "maximum": 99999,
      "minimum": 10000,
      "title": "DSSR post code",
      "description": "5-digit DSSR post code (no zero-padding)"
    },
    "country_iso_code": {
      "type": "string",
      "description": "ISO 3166-1 alpha-2 country code, e.g. PG for Papua New Guinea; ZZ stands for 'Other Foreign Localities', not a country. Resolve a country name to its code with get_countries (q=name).",
      "examples": [
        "BE",
        "JP",
        "KE"
      ],
      "title": "Country Iso Code"
    },
    "verification_url": {
      "type": "boolean",
      "title": "Verification URL",
      "description": "If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.",
      "default": false
    },
    "date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ],
      "description": "Specific date in YYYY-MM-DD format",
      "title": "Date"
    }
  },
  "required": [
    "postcode",
    "country_iso_code"
  ]
}

TOOL get_dssr_locations

get_dssr_locations

List DSSR locations

Return DSSR locations, optionally filtered by q=.

The response is paginated and includes the total number of matching locations (ignoring pagination) along with the offset and limit that were applied.

Input schema

q string | null

Search by name

q (anyOf 1) string

q (anyOf 2) null

offset integer

limit integer

{
  "type": "object",
  "properties": {
    "q": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 2
        },
        {
          "type": "null"
        }
      ],
      "description": "Search by name",
      "title": "Q"
    },
    "offset": {
      "type": "integer",
      "default": 0,
      "title": "Offset"
    },
    "limit": {
      "type": "integer",
      "maximum": 20,
      "default": 10,
      "title": "Limit"
    }
  }
}

TOOL get_countries

get_countries

Resolve a country name to its ISO code and list its posts

Input schema

q string | null

Search by country name

q (anyOf 1) string

q (anyOf 2) null

offset integer

limit integer

{
  "type": "object",
  "properties": {
    "q": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 2
        },
        {
          "type": "null"
        }
      ],
      "description": "Search by country name",
      "title": "Q"
    },
    "offset": {
      "type": "integer",
      "default": 0,
      "title": "Offset"
    },
    "limit": {
      "type": "integer",
      "maximum": 300,
      "default": 20,
      "title": "Limit"
    }
  }
}

TOOL get_country

get_country

Get country by ISO code

Input schema

country_iso_code stringrequired

ISO 3166-1 alpha-2 country code, e.g. PG for Papua New Guinea; ZZ stands for 'Other Foreign Localities', not a country. Resolve a country name to its code with get_countries (q=name).

{
  "type": "object",
  "properties": {
    "country_iso_code": {
      "type": "string",
      "description": "ISO 3166-1 alpha-2 country code, e.g. PG for Papua New Guinea; ZZ stands for 'Other Foreign Localities', not a country. Resolve a country name to its code with get_countries (q=name).",
      "examples": [
        "BE",
        "JP",
        "KE"
      ],
      "title": "Country Iso Code"
    }
  },
  "required": [
    "country_iso_code"
  ]
}

TOOL get_dssr_locations_by_country

get_dssr_locations_by_country

List DSSR locations by country

Return all DSSR locations for a specific country using its ISO alpha-2 code (e.g., 'AF', 'DE')

Input schema

country_iso_code stringrequired

ISO 3166-1 alpha-2 country code, e.g. PG for Papua New Guinea; ZZ stands for 'Other Foreign Localities', not a country. Resolve a country name to its code with get_countries (q=name).

{
  "type": "object",
  "properties": {
    "country_iso_code": {
      "type": "string",
      "description": "ISO 3166-1 alpha-2 country code, e.g. PG for Papua New Guinea; ZZ stands for 'Other Foreign Localities', not a country. Resolve a country name to its code with get_countries (q=name).",
      "examples": [
        "BE",
        "JP",
        "KE"
      ],
      "title": "Country Iso Code"
    }
  },
  "required": [
    "country_iso_code"
  ]
}

TOOL cola_calculator_by_postcode

cola_calculator_by_postcode

DSSR COLA calculator by postcode

Returns the rate in percentage, the annual and the biweekly amounts of cost of living allowance (COLA) for a given DSSR postcode. Use this endpoint to automate your COLA calculations and replace the official excel file.

Input schema

postcode integerrequired

5-digit DSSR post code (no zero-padding)

family_size integerrequired

The number of family members, including the FS/DoS employee/contractor

base_salary integerrequired

Basic annual salary, excluding U.S. locality pay; including Overseas Comparability Pay.

date string | null

Specific date in YYYY-MM-DD format

date (anyOf 1) string

date (anyOf 2) null

{
  "type": "object",
  "properties": {
    "postcode": {
      "type": "integer",
      "maximum": 99999,
      "minimum": 10000,
      "title": "DSSR post code",
      "description": "5-digit DSSR post code (no zero-padding)"
    },
    "family_size": {
      "type": "integer",
      "minimum": 1,
      "description": "The number of family members, including the FS/DoS employee/contractor",
      "title": "Family Size"
    },
    "base_salary": {
      "type": "integer",
      "minimum": 1000,
      "description": "Basic annual salary, excluding U.S. locality pay; including Overseas Comparability Pay.",
      "title": "Base Salary"
    },
    "date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ],
      "description": "Specific date in YYYY-MM-DD format",
      "title": "Date"
    }
  },
  "required": [
    "postcode",
    "family_size",
    "base_salary"
  ]
}

MCP - DTMO - Mil. CONUS/OCONUS

TOOL get_dtmo_perdiem_conus

get_dtmo_perdiem_conus

Get perdiem CONUS

Department of Defense per diem for the continental U.S. by state code (e.g. 'TX'); Alaska, Hawaii and the territories are served by the OCONUS endpoint. Returns lodging, local and proportional meal rates, incidentals and the maximum per diem (lodging + meals + incidentals) per season. q filters by location name. date selects the rates in force on that day, year a fiscal year (Oct 1 to Sep 30); omit both for the current fiscal year.

Input schema

state_iso stringrequired

US state code: US- followed by the postal abbreviation, e.g. US-CA for California.

year integer

A fiscal year starts Oct 1st, ends Sep 30th

verification_url boolean

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

q string | null

Search by location name or state/country name

q (anyOf 1) string

q (anyOf 2) null

offset integer

limit integer

date string | null

Specific date in YYYY-MM-DD format

date (anyOf 1) string

date (anyOf 2) null

{
  "type": "object",
  "properties": {
    "state_iso": {
      "type": "string",
      "description": "US state code: US- followed by the postal abbreviation, e.g. US-CA for California.",
      "examples": [
        "US-AL",
        "US-CA"
      ],
      "title": "State Iso"
    },
    "year": {
      "type": "integer",
      "description": "A fiscal year starts Oct 1st, ends Sep 30th",
      "openapi_examples": {
        "recent": {
          "value": 2026
        },
        "historic": {
          "value": 2005
        }
      },
      "title": "Year"
    },
    "verification_url": {
      "type": "boolean",
      "title": "Verification URL",
      "description": "If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.",
      "default": false
    },
    "q": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "minLength": 3,
      "description": "Search by location name or state/country name",
      "title": "Q"
    },
    "offset": {
      "type": "integer",
      "default": 0,
      "title": "Offset"
    },
    "limit": {
      "type": "integer",
      "default": 50,
      "title": "Limit"
    },
    "date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ],
      "description": "Specific date in YYYY-MM-DD format",
      "title": "Date"
    }
  },
  "required": [
    "state_iso"
  ]
}

TOOL get_dtmo_perdiem_oconus

get_dtmo_perdiem_oconus

Get perdiem OCONUS

Department of Defense per diem outside the continental U.S.: foreign countries by ISO alpha-2 code (e.g. 'PG'), and Alaska, Hawaii and U.S. territories by 'US-XX' code. Returns lodging, local and proportional meal rates, incidentals and the maximum per diem (lodging + meals + incidentals) per season. q filters by location name. date selects the rates in force on that day, year a fiscal year (Oct 1 to Sep 30); omit both for the current fiscal year.

Input schema

oconus_iso_code stringrequired

Foreign country ISO 3166-1 alpha-2 code (e.g. BE), or one of the OCONUS state codes US-AK, US-HI, US-PR, US-GU, US-VI, US-AS, US-MP, US-UM. Resolve a country name to its code with get_countries (q=name).

year integer

A fiscal year starts Oct 1st, ends Sep 30th

verification_url boolean

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

q string | null

Search by location name or state/country name

q (anyOf 1) string

q (anyOf 2) null

offset integer

limit integer

date string | null

Specific date in YYYY-MM-DD format

date (anyOf 1) string

date (anyOf 2) null

{
  "type": "object",
  "properties": {
    "oconus_iso_code": {
      "type": "string",
      "description": "Foreign country ISO 3166-1 alpha-2 code (e.g. BE), or one of the OCONUS state codes US-AK, US-HI, US-PR, US-GU, US-VI, US-AS, US-MP, US-UM. Resolve a country name to its code with get_countries (q=name).",
      "examples": [
        "US-AK",
        "BE"
      ],
      "title": "Oconus Iso Code"
    },
    "year": {
      "type": "integer",
      "description": "A fiscal year starts Oct 1st, ends Sep 30th",
      "openapi_examples": {
        "recent": {
          "value": 2026
        },
        "historic": {
          "value": 2005
        }
      },
      "title": "Year"
    },
    "verification_url": {
      "type": "boolean",
      "title": "Verification URL",
      "description": "If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.",
      "default": false
    },
    "q": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "minLength": 3,
      "description": "Search by location name or state/country name",
      "title": "Q"
    },
    "offset": {
      "type": "integer",
      "default": 0,
      "title": "Offset"
    },
    "limit": {
      "type": "integer",
      "default": 50,
      "title": "Limit"
    },
    "date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ],
      "description": "Specific date in YYYY-MM-DD format",
      "title": "Date"
    }
  },
  "required": [
    "oconus_iso_code"
  ]
}

TOOL search_dtmo_perdiem

search_dtmo_perdiem

Search by location name

Department of Defense per diem by location name (e.g. 'Kabul') or country/state name (e.g. 'Afghanistan'), across CONUS and OCONUS. date selects the rates in force on that day, year a fiscal year (Oct 1 to Sep 30); omit both for the current fiscal year.

Input schema

q string | null

Search by location name or state/country name

q (anyOf 1) string

q (anyOf 2) null

year integer

A fiscal year starts Oct 1st, ends Sep 30th

verification_url boolean

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

date string | null

Specific date in YYYY-MM-DD format

date (anyOf 1) string

date (anyOf 2) null

{
  "type": "object",
  "properties": {
    "q": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "minLength": 3,
      "description": "Search by location name or state/country name",
      "title": "Q"
    },
    "year": {
      "type": "integer",
      "description": "A fiscal year starts Oct 1st, ends Sep 30th",
      "openapi_examples": {
        "recent": {
          "value": 2026
        },
        "historic": {
          "value": 2005
        }
      },
      "title": "Year"
    },
    "verification_url": {
      "type": "boolean",
      "title": "Verification URL",
      "description": "If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.",
      "default": false
    },
    "date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ],
      "description": "Specific date in YYYY-MM-DD format",
      "title": "Date"
    }
  }
}

TOOL get_dtmo_conus_locations

get_dtmo_conus_locations

Get DTMO CONUS locations

todo add filter by location

Return all DTMO locations for a specific state using its US State Code (e.g., 'US-CA')

Input schema

state_iso stringrequired

US state code: US- followed by the postal abbreviation, e.g. US-CA for California.

{
  "type": "object",
  "properties": {
    "state_iso": {
      "type": "string",
      "description": "US state code: US- followed by the postal abbreviation, e.g. US-CA for California.",
      "examples": [
        "US-AL",
        "US-CA"
      ],
      "title": "State Iso"
    }
  },
  "required": [
    "state_iso"
  ]
}

TOOL get_dtmo_oconus_locations

get_dtmo_oconus_locations

Get DTMO OCONUS locations

Return DTMO locations for a specific country using its ISO Code (e.g., 'AU', 'BE').

The optional location filter performs case-insensitive substring matching. Omitted or empty filters return all locations in the country. Nonempty input is literal, including spaces and wildcard characters. No matches returns [].

Input schema

country_iso_code stringrequired

ISO 3166-1 alpha-2 country code, e.g. PG for Papua New Guinea; ZZ stands for 'Other Foreign Localities', not a country. Resolve a country name to its code with get_countries (q=name).

location string | null

Filter by location name

location (anyOf 1) string

location (anyOf 2) null

{
  "type": "object",
  "properties": {
    "country_iso_code": {
      "type": "string",
      "description": "ISO 3166-1 alpha-2 country code, e.g. PG for Papua New Guinea; ZZ stands for 'Other Foreign Localities', not a country. Resolve a country name to its code with get_countries (q=name).",
      "examples": [
        "BE",
        "JP",
        "KE"
      ],
      "title": "Country Iso Code"
    },
    "location": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Filter by location name",
      "title": "Location"
    }
  },
  "required": [
    "country_iso_code"
  ]
}

MCP - FEMA - Fire-safe lodging

TOOL search_fema_hotels

search_fema_hotels

Search FEMA-listed properties by name and town

Return the properties whose name or city contains every word of q, case-insensitively, as a plain substring: courtyard dallas matches Courtyard properties in Dallas, mint house alexandria the Mint House in Alexandria. There is no fuzzy matching, so hampton inn does not find "Hampton by Hilton". Words of one character are ignored. state narrows the search to one state or territory (404 for a code FEMA does not list). Results are ordered by name then city and paginated with offset and limit (50 by default, 200 at most); total counts every match. No match returns an empty results list.

The Hotel and Motel Fire Safety Act of 1990 requires federal travelers to stay at a property on FEMA's Hotel and Motel National Master List to be reimbursed for lodging. Each property on the list has a FEMA ID. FEMA publishes the current list only; as_of is the date of the snapshot the results come from. This endpoint returns no rates: combine it with the GSA per diem lookups for the lodging ceiling.

Input schema

q stringrequired

Words to find in the property name or city, all required, case-insensitive.

state string | null

Restrict the search to one state or territory.

state (anyOf 1) string

2-digits US State ISO Code, format XX

state (anyOf 2) null

offset integer

Number of properties to skip.

limit integer

Properties per page, 200 at most.

{
  "type": "object",
  "properties": {
    "q": {
      "type": "string",
      "minLength": 3,
      "description": "Words to find in the property name or city, all required, case-insensitive.",
      "examples": [
        "mint house alexandria"
      ],
      "title": "Q"
    },
    "state": {
      "anyOf": [
        {
          "type": "string",
          "description": "2-digits US State ISO Code, format XX",
          "examples": [
            "AL",
            "CA"
          ]
        },
        {
          "type": "null"
        }
      ],
      "description": "Restrict the search to one state or territory.",
      "title": "State"
    },
    "offset": {
      "type": "integer",
      "minimum": 0,
      "description": "Number of properties to skip.",
      "default": 0,
      "title": "Offset"
    },
    "limit": {
      "type": "integer",
      "maximum": 200,
      "minimum": 1,
      "description": "Properties per page, 200 at most.",
      "default": 50,
      "title": "Limit"
    }
  },
  "required": [
    "q"
  ]
}

TOOL get_fema_hotel_by_id

get_fema_hotel_by_id

FEMA-listed property by FEMA ID

Return the property registered under a FEMA ID, or 404 when the ID is not on the list.

The Hotel and Motel Fire Safety Act of 1990 requires federal travelers to stay at a property on FEMA's Hotel and Motel National Master List to be reimbursed for lodging. Each property on the list has a FEMA ID. FEMA publishes the current list only; as_of is the date of the snapshot the results come from. This endpoint returns no rates: combine it with the GSA per diem lookups for the lodging ceiling.

Input schema

fema_id stringrequired

FEMA ID of the property as printed on the Hotel and Motel National Master List, two letters followed by digits. Case-insensitive.

{
  "type": "object",
  "properties": {
    "fema_id": {
      "type": "string",
      "description": "FEMA ID of the property as printed on the Hotel and Motel National Master List, two letters followed by digits. Case-insensitive.",
      "examples": [
        "VA6026"
      ],
      "title": "Fema Id"
    }
  },
  "required": [
    "fema_id"
  ]
}

TOOL get_fema_hotels_by_zipcode

get_fema_hotels_by_zipcode

FEMA-listed properties by ZIP code

Return every property on the list in a US ZIP code, ordered by name. The path accepts a five-digit ZIP or ZIP+4, normalized to the first five digits. A known ZIP with no listed property returns an empty results list; an unknown ZIP returns 404.

The Hotel and Motel Fire Safety Act of 1990 requires federal travelers to stay at a property on FEMA's Hotel and Motel National Master List to be reimbursed for lodging. Each property on the list has a FEMA ID. FEMA publishes the current list only; as_of is the date of the snapshot the results come from. This endpoint returns no rates: combine it with the GSA per diem lookups for the lodging ceiling.

Input schema

zipcode stringrequired

US ZIP (12345) or ZIP+4 (12345-6789)

{
  "type": "object",
  "properties": {
    "zipcode": {
      "type": "string",
      "description": "US ZIP (12345) or ZIP+4 (12345-6789)",
      "openapi_examples": {
        "normal": {
          "summary": "Five digits postcode",
          "value": "12084"
        },
        "zip_plus_four": {
          "summary": "Zip+4 format",
          "value": "12084-1234"
        }
      },
      "title": "Zipcode"
    }
  },
  "required": [
    "zipcode"
  ]
}

TOOL get_fema_hotels_by_state_city

get_fema_hotels_by_state_city

FEMA-listed properties by state, optionally filtered by city

Return the properties on the list in a state, ordered by city then name and paginated with offset and limit (50 by default, 200 at most); total is the number of matches across all pages. The optional city is matched case-insensitively as a partial name, so york matches New York and Yorktown. The state path accepts the 50 states, DC and the territories FEMA lists (AS, GU, MP, PR, PW, VI); other codes return 404. A city that matches nothing returns an empty results list.

The Hotel and Motel Fire Safety Act of 1990 requires federal travelers to stay at a property on FEMA's Hotel and Motel National Master List to be reimbursed for lodging. Each property on the list has a FEMA ID. FEMA publishes the current list only; as_of is the date of the snapshot the results come from. This endpoint returns no rates: combine it with the GSA per diem lookups for the lodging ceiling.

Input schema

state_iso stringrequired

2-digits US State ISO Code, format XX

city string | null

Case-insensitive partial match on the city name.

city (anyOf 1) string

city (anyOf 2) null

offset integer

Number of properties to skip.

limit integer

Properties per page, 200 at most.

{
  "type": "object",
  "properties": {
    "state_iso": {
      "type": "string",
      "description": "2-digits US State ISO Code, format XX",
      "examples": [
        "AL",
        "CA"
      ],
      "title": "State Iso"
    },
    "city": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 2
        },
        {
          "type": "null"
        }
      ],
      "description": "Case-insensitive partial match on the city name.",
      "examples": [
        "Alexandria"
      ],
      "title": "City"
    },
    "offset": {
      "type": "integer",
      "minimum": 0,
      "description": "Number of properties to skip.",
      "default": 0,
      "title": "Offset"
    },
    "limit": {
      "type": "integer",
      "maximum": 200,
      "minimum": 1,
      "description": "Properties per page, 200 at most.",
      "default": 50,
      "title": "Limit"
    }
  },
  "required": [
    "state_iso"
  ]
}

MCP - GSA - per diem, mileage, fleet and airfare

TOOL get_gsa_perdiem_by_destination

get_gsa_perdiem_by_destination

GSA per diem rate by destination

Return the GSA per diem rate in effect for a specific GSA destination on a given date. A destination is a rate area defined by GSA and may represent a city, metropolitan area, county, or the Standard CONUS area. It is not necessarily a single municipality.

destination_id is the numeric identifier assigned to that GSA rate area in the source data. Use GET /v1/gsa/destinations to browse the available destinations and find the ID for the location you need. Destination ID 0 represents the Standard CONUS rate.

The response contains the seasonal lodging rate applicable on the requested date and the daily meals and incidental expenses (M&IE) rate. When date is omitted, today's rate is returned. Set verification_url=true to include the corresponding official GSA lookup URL.

Input schema

destination_id integerrequired

GSA's numeric identifier for a rate area. Retrieve valid IDs from GET /v1/gsa/destinations; ID 0 is the Standard CONUS rate.

verification_url boolean

Include the official GSA per diem lookup URL in the response when true.

date string | null

Specific date in YYYY-MM-DD format

date (anyOf 1) string

date (anyOf 2) null

{
  "type": "object",
  "properties": {
    "destination_id": {
      "type": "integer",
      "description": "GSA's numeric identifier for a rate area. Retrieve valid IDs from \`GET /v1/gsa/destinations\`; ID 0 is the Standard CONUS rate.",
      "title": "Destination Id"
    },
    "verification_url": {
      "type": "boolean",
      "description": "Include the official GSA per diem lookup URL in the response when true.",
      "default": false,
      "title": "Verification Url"
    },
    "date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ],
      "description": "Specific date in YYYY-MM-DD format",
      "title": "Date"
    }
  },
  "required": [
    "destination_id"
  ]
}

TOOL get_gsa_perdiem_by_state

get_gsa_perdiem_by_state

GSA per diem rates by state and date

Return every GSA destination rate in a state that applies on a specific date. Each result contains the seasonal lodging rate in effect on that date and the daily meals and incidental expenses (M&IE) rate. When date is omitted, today's rates are returned.

Use the optional location parameter to filter by a GSA destination or location-defined name. Matching is case-insensitive and accepts partial names. If the state has no non-standard destination rate, the Standard CONUS rate is returned. This endpoint covers GSA CONUS rates; unsupported or unknown state codes return 404.

Set verification_url=true to include the corresponding official GSA state lookup URL.

Input schema

state_iso stringrequired

Two-letter US postal abbreviation for the state or District of Columbia.

location string | null

Optional case-insensitive partial match against the GSA destination name or location-defined name.

location (anyOf 1) string

location (anyOf 2) null

verification_url boolean

Include the official GSA state lookup URL in the response when true.

date string | null

Specific date in YYYY-MM-DD format

date (anyOf 1) string

date (anyOf 2) null

{
  "type": "object",
  "properties": {
    "state_iso": {
      "type": "string",
      "description": "Two-letter US postal abbreviation for the state or District of Columbia.",
      "title": "State Iso"
    },
    "location": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Optional case-insensitive partial match against the GSA destination name or location-defined name.",
      "title": "Location"
    },
    "verification_url": {
      "type": "boolean",
      "description": "Include the official GSA state lookup URL in the response when true.",
      "default": false,
      "title": "Verification Url"
    },
    "date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ],
      "description": "Specific date in YYYY-MM-DD format",
      "title": "Date"
    }
  },
  "required": [
    "state_iso"
  ]
}

TOOL get_gsa_perdiem_by_state_year

get_gsa_perdiem_by_state_year

GSA per diem rates by state and fiscal year

Return every GSA destination rate in a state for a US fiscal year. Each result contains the lodging rate for every month and the daily meals and incidental expenses (M&IE) rate. A US fiscal year begins October 1 of the preceding calendar year and ends September 30.

Use the optional location parameter to filter destinations by their GSA destination or location-defined name. Matching is case-insensitive and accepts partial names. Set verification_url=true to include the corresponding official GSA state lookup URL.

Input schema

state_iso stringrequired

Two-letter US postal abbreviation for the state or District of Columbia.

year integerrequired

Four-digit US fiscal year. Fiscal year 2026 runs from 2025-10-01 through 2026-09-30.

location string | null

Optional case-insensitive partial match against the GSA destination name or location-defined name.

location (anyOf 1) string

location (anyOf 2) null

verification_url boolean

Include the official GSA state lookup URL in the response when true.

{
  "type": "object",
  "properties": {
    "state_iso": {
      "type": "string",
      "description": "Two-letter US postal abbreviation for the state or District of Columbia.",
      "title": "State Iso"
    },
    "year": {
      "type": "integer",
      "description": "Four-digit US fiscal year. Fiscal year 2026 runs from 2025-10-01 through 2026-09-30.",
      "title": "Year"
    },
    "location": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Optional case-insensitive partial match against the GSA destination name or location-defined name.",
      "title": "Location"
    },
    "verification_url": {
      "type": "boolean",
      "description": "Include the official GSA state lookup URL in the response when true.",
      "default": false,
      "title": "Verification Url"
    }
  },
  "required": [
    "state_iso",
    "year"
  ]
}

TOOL get_gsa_perdiem_by_zipcode

get_gsa_perdiem_by_zipcode

GSA per diem rates by ZIP code and date

Return every GSA destination rate associated with a US ZIP code that applies on a specific date. Each result contains the seasonal lodging rate in effect on that date and the daily meals and incidental expenses (M&IE) rate. When date is omitted, today's rates are returned.

A ZIP code can map to more than one GSA destination. When that happens, results contains every applicable rate, and the API does not choose one automatically. Use the returned county or a geocoder to determine which destination applies to the travel location. If a known ZIP code has no non-standard destination, the Standard CONUS rate is returned.

The path accepts either a five-digit ZIP code or ZIP+4. ZIP+4 values are normalized to their first five digits. Set verification_url=true to include the corresponding official GSA lookup URL.

Input schema

zipcode stringrequired

Five-digit US ZIP code, or ZIP+4. ZIP+4 values are normalized to the first five digits.

verification_url boolean

Include the official GSA per diem lookup URL in the response when true.

date string | null

Specific date in YYYY-MM-DD format

date (anyOf 1) string

date (anyOf 2) null

{
  "type": "object",
  "properties": {
    "zipcode": {
      "type": "string",
      "description": "Five-digit US ZIP code, or ZIP+4. ZIP+4 values are normalized to the first five digits.",
      "title": "Zipcode"
    },
    "verification_url": {
      "type": "boolean",
      "description": "Include the official GSA per diem lookup URL in the response when true.",
      "default": false,
      "title": "Verification Url"
    },
    "date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ],
      "description": "Specific date in YYYY-MM-DD format",
      "title": "Date"
    }
  },
  "required": [
    "zipcode"
  ]
}

TOOL get_gsa_perdiem_by_zipcode_year

get_gsa_perdiem_by_zipcode_year

GSA per diem rates by ZIP code and fiscal year

Return the GSA lodging rates for every month of a US fiscal year and the daily meals and incidental expenses (M&IE) rate associated with a ZIP code. A US fiscal year begins October 1 of the preceding calendar year and ends September 30.

A ZIP code can map to more than one GSA destination. When that happens, results contains every applicable rate. The API does not choose a destination automatically; use the returned county or a geocoder to determine which rate applies. ZIP codes without a non-standard destination return the Standard CONUS rate.

ZIP+4 input is accepted and normalized to its first five digits. Set verification_url=true to include the corresponding official GSA lookup URL.

Input schema

zipcode stringrequired

Five-digit US ZIP code, or ZIP+4. ZIP+4 values are normalized to the first five digits.

year integerrequired

Four-digit US fiscal year. Fiscal year 2026 runs from 2025-10-01 through 2026-09-30.

verification_url boolean

Include the official GSA ZIP-code lookup URL in the response when true.

{
  "type": "object",
  "properties": {
    "zipcode": {
      "type": "string",
      "description": "Five-digit US ZIP code, or ZIP+4. ZIP+4 values are normalized to the first five digits.",
      "title": "Zipcode"
    },
    "year": {
      "type": "integer",
      "description": "Four-digit US fiscal year. Fiscal year 2026 runs from 2025-10-01 through 2026-09-30.",
      "title": "Year"
    },
    "verification_url": {
      "type": "boolean",
      "description": "Include the official GSA ZIP-code lookup URL in the response when true.",
      "default": false,
      "title": "Verification Url"
    }
  },
  "required": [
    "zipcode",
    "year"
  ]
}

TOOL get_zipcode

get_zipcode

Get ZIP code metadata

Look up every state associated with a US ZIP code. Most ZIP codes belong to one state, but some cross state boundaries. In that case, states contains every matching state; the API does not choose one on the caller's behalf. This is a geographic metadata endpoint; it does not return GSA per diem rates. Use /v1/gsa/perdiem/zipcode/{zipcode} for rates.

The path accepts either a five-digit ZIP code or ZIP+4. ZIP+4 values are normalized to their first five digits before lookup, and the normalized five-digit ZIP is returned in the response. Leading zeroes are significant, so ZIP codes must be sent as strings.

Input schema

zipcode stringrequired

US ZIP (12345) or ZIP+4 (12345-6789)

{
  "type": "object",
  "properties": {
    "zipcode": {
      "type": "string",
      "description": "US ZIP (12345) or ZIP+4 (12345-6789)",
      "openapi_examples": {
        "normal": {
          "summary": "Five digits postcode",
          "value": "12084"
        },
        "zip_plus_four": {
          "summary": "Zip+4 format",
          "value": "12084-1234"
        }
      },
      "title": "Zipcode"
    }
  },
  "required": [
    "zipcode"
  ]
}

TOOL get_destination_by_id

get_destination_by_id

Get GSA destination metadata by ID

Return the geographic metadata for one GSA destination rate area. A destination may represent a city, metropolitan area, county, group of jurisdictions, or the Standard CONUS area rather than a single municipality. name is GSA's short display name, while defined_name describes the geographic scope of the rate area.

destination_id is GSA's numeric identifier for that rate area. Use GET /v1/gsa/destinations to browse available destinations and find an ID. ID 0 identifies the Standard CONUS rate area.

This endpoint returns destination metadata only. Use GET /v1/gsa/perdiem/destination/{destination_id} to retrieve the per diem rate in effect for a particular date.

Input schema

destination_id integerrequired

GSA's numeric identifier for a destination rate area. Retrieve valid IDs from GET /v1/gsa/destinations; ID 0 is Standard CONUS.

{
  "type": "object",
  "properties": {
    "destination_id": {
      "type": "integer",
      "description": "GSA's numeric identifier for a destination rate area. Retrieve valid IDs from \`GET /v1/gsa/destinations\`; ID 0 is Standard CONUS.",
      "title": "Destination Id"
    }
  },
  "required": [
    "destination_id"
  ]
}

TOOL get_destinations

get_destinations

List GSA destinations

Return the paginated list of GSA destination rate areas and their numeric IDs. A destination is an area for which GSA publishes a per diem rate; it may represent a city, metropolitan area, county, locality, or the Standard CONUS area rather than a single municipality.

Use destination_id with GET /v1/gsa/perdiem/destination/{destination_id} to retrieve the rate in effect for that destination. ID 0 identifies the Standard CONUS rate. name is GSA's display name, while defined_name, county, and state fields provide the geographic context needed to select the correct rate area.

Results are ordered by destination_id. Use offset and limit to page through the list. An offset beyond the available records returns an empty list, not a 404 response.

Input schema

offset integer

Number of destination records to skip before returning results.

limit integer

Maximum number of destinations to return. The maximum is 200.

{
  "type": "object",
  "properties": {
    "offset": {
      "type": "integer",
      "description": "Number of destination records to skip before returning results.",
      "default": 0,
      "title": "Offset"
    },
    "limit": {
      "type": "integer",
      "maximum": 200,
      "description": "Maximum number of destinations to return. The maximum is 200.",
      "default": 100,
      "title": "Limit"
    }
  }
}

TOOL get_city_pair_locations

get_city_pair_locations

City Pair airport and city codes

List or search the three-letter codes used by GSA City Pair awards for the fiscal year of date (today by default), with GSA's own city, state and country labels. Awards use IATA airport codes (DCA, IAD, BWI) for most domestic pairs and metropolitan city codes (WAS, NYC, LON) for others; only GSA decides which, so resolve the code here before calling the fare lookup. Several codes can share one city label. Without q, every code of the fiscal year is returned, ordered by code. With q (3+ characters), a code matches exactly and city/country names match by substring, case-insensitively. Plan/date rules are those of the fare lookup: Sandbox and Google add-on today only; Pro the current US fiscal year; Business (including Enterprise accounts) any loaded fiscal year.

Example:

curl --get 'https://api.allowancesapi.com/v1/gsa/city-pairs/locations' -H 'X-API-Key: YOUR_KEY' --data-urlencode 'q=washington'

Labels mirror the latest imported awards table and change with it.

Input schema

q string | null

Match a code exactly or a city/country name by substring; case-insensitive. Omit to list every code of the fiscal year.

q (anyOf 1) string

q (anyOf 2) null

date string | null

Specific date in YYYY-MM-DD format

date (anyOf 1) string

date (anyOf 2) null

{
  "type": "object",
  "properties": {
    "q": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "minLength": 3,
      "description": "Match a code exactly or a city/country name by substring; case-insensitive. Omit to list every code of the fiscal year.",
      "examples": [
        "washington",
        "LON"
      ],
      "title": "Q"
    },
    "date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ],
      "description": "Specific date in YYYY-MM-DD format",
      "title": "Date"
    }
  }
}

TOOL get_city_pairs

get_city_pairs

City Pair contract airfares

Return every GSA contract award matching the airport/city code pair and date (today by default). Codes are returned in alphabetical order; fares are one-way USD and valid in either direction. Source start/end dates are inclusive; overlapping amendments are both returned. No fallback to other fiscal years or dates. Null fare categories are unavailable. Sandbox and Google add-on: today only. Pro: current US fiscal year. Business (including Enterprise accounts): any loaded fiscal year, including published future awards. Data reflects the latest imported table, not past publication snapshots. These are eligible government travelers' contract prices, not live seat availability or booking offers. Domestic fares exclude passenger facility, segment and security fees; international fares exclude taxes/fees but include fuel surcharges. Book through the agency's authorized system. Official CPP rules and price caveats; fare definitions.

Example (fixed date; use Business access for dates outside the current fiscal year):

curl --get 'https://api.allowancesapi.com/v1/gsa/city-pairs/ABE/ATL' -H 'X-API-Key: YOUR_KEY' -H 'X-Bypass-Cache: 1' --data-urlencode 'date=2026-10-28' --data-urlencode 'verification_url=true'

See the 200 response example for all result fields. Importing does not invalidate existing cached responses; use X-Bypass-Cache: 1 to verify newly imported data.

Input schema

origin stringrequired

Three-letter airport or international city code; case-insensitive. No city-name expansion.

destination stringrequired

Three-letter airport or international city code; case-insensitive. No city-name expansion.

verification_url boolean

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

date string | null

Specific date in YYYY-MM-DD format

date (anyOf 1) string

date (anyOf 2) null

{
  "type": "object",
  "properties": {
    "origin": {
      "type": "string",
      "description": "Three-letter airport or international city code; case-insensitive. No city-name expansion.",
      "examples": [
        "ABE",
        "LON"
      ],
      "title": "Origin"
    },
    "destination": {
      "type": "string",
      "description": "Three-letter airport or international city code; case-insensitive. No city-name expansion.",
      "examples": [
        "ABE",
        "LON"
      ],
      "title": "Destination"
    },
    "verification_url": {
      "type": "boolean",
      "title": "Verification URL",
      "description": "If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.",
      "default": false
    },
    "date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ],
      "description": "Specific date in YYYY-MM-DD format",
      "title": "Date"
    }
  },
  "required": [
    "origin",
    "destination"
  ]
}

TOOL get_mileage

get_mileage

POV mileage reimbursement rates

Return the privately owned vehicle (POV) mileage reimbursement rates in effect on the given date. If date is not specified, today's rates will be returned.

Input schema

type string | null

Filter by mileage type

type (anyOf 1) string

Allowed values: ["airplane", "automobile", "government_furnished_automobile", "motorcycle", "moving"]

type (anyOf 2) null

verification_url boolean

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

date string | null

Specific date in YYYY-MM-DD format

date (anyOf 1) string

date (anyOf 2) null

{
  "type": "object",
  "properties": {
    "type": {
      "anyOf": [
        {
          "type": "string",
          "enum": [
            "airplane",
            "automobile",
            "government_furnished_automobile",
            "motorcycle",
            "moving"
          ],
          "title": "MileageType"
        },
        {
          "type": "null"
        }
      ],
      "description": "Filter by mileage type",
      "title": "Type"
    },
    "verification_url": {
      "type": "boolean",
      "title": "Verification URL",
      "description": "If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.",
      "default": false
    },
    "date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ],
      "description": "Specific date in YYYY-MM-DD format",
      "title": "Date"
    }
  }
}

TOOL get_mie_breakdowns

get_mie_breakdowns

M&IE meal breakdowns

Return how daily M&IE totals break down into breakfast, lunch, dinner and incidental expenses, as in effect on the given date. The CONUS table breaks down the five standard CONUS M&IE tiers and is returned by default. Set region=oconus for the generic DTMO/DSSR M&IE total table. If date is not specified, today's breakdowns will be returned.

Input schema

region string

Breakdown table to return; defaults to CONUS

Allowed values: ["conus", "oconus"]

total integer | null

Filter by daily M&IE total in USD

total (anyOf 1) integer

total (anyOf 2) null

verification_url boolean

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

date string | null

Specific date in YYYY-MM-DD format

date (anyOf 1) string

date (anyOf 2) null

{
  "type": "object",
  "properties": {
    "region": {
      "type": "string",
      "enum": [
        "conus",
        "oconus"
      ],
      "title": "MieBreakdownRegion",
      "description": "Breakdown table to return; defaults to CONUS",
      "default": "conus"
    },
    "total": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 1
        },
        {
          "type": "null"
        }
      ],
      "description": "Filter by daily M&IE total in USD",
      "title": "Total"
    },
    "verification_url": {
      "type": "boolean",
      "title": "Verification URL",
      "description": "If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.",
      "default": false
    },
    "date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ],
      "description": "Specific date in YYYY-MM-DD format",
      "title": "Date"
    }
  }
}

TOOL get_fleet_rates_by_sin

get_fleet_rates_by_sin

GSA Fleet vehicle leasing rates by SIN

Return the GSA Fleet vehicle leasing rates (monthly lease rate and rate per mile) for the vehicle type identified by its Standard Item Number (SIN), from the standard (US) or europe rate schedule. If year is not specified, the current fiscal year's rates will be returned. Rates are available from fiscal year 2022.

Input schema

rate_type stringrequired

The GSA Fleet rate schedule: 'standard' covers vehicles leased in the United States, 'europe' covers vehicles leased in Europe.

Allowed values: ["standard", "europe"]

sin stringrequired

Standard Item Number (SIN) identifying a GSA Fleet leased vehicle type, case insensitive.

verification_url boolean

If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.

year integer | null

year (anyOf 1) integer

A fiscal year starts Oct 1st, ends Sep 30th

year (anyOf 2) null

{
  "type": "object",
  "properties": {
    "rate_type": {
      "type": "string",
      "enum": [
        "standard",
        "europe"
      ],
      "title": "Fleet rate schedule",
      "description": "The GSA Fleet rate schedule: 'standard' covers vehicles leased in the United States, 'europe' covers vehicles leased in Europe."
    },
    "sin": {
      "type": "string",
      "title": "GSA Fleet SIN",
      "description": "Standard Item Number (SIN) identifying a GSA Fleet leased vehicle type, case insensitive."
    },
    "verification_url": {
      "type": "boolean",
      "title": "Verification URL",
      "description": "If 'True', will include a verification url in the payload, pointing to the official government source. This is useful to crosscheck that the API returns the proper data and for auditing.",
      "default": false
    },
    "year": {
      "anyOf": [
        {
          "type": "integer",
          "description": "A fiscal year starts Oct 1st, ends Sep 30th",
          "openapi_examples": {
            "recent": {
              "value": 2026
            },
            "historic": {
              "value": 2005
            }
          }
        },
        {
          "type": "null"
        }
      ],
      "title": "Year"
    }
  },
  "required": [
    "rate_type",
    "sin"
  ]
}

TOOL calculate_mileage_reimbursement

calculate_mileage_reimbursement

Calculate POV mileage reimbursement

Calculate mileage reimbursement using the official GSA rate in effect on the travel date. Provide a distance in miles and select automobile, airplane, motorcycle, or moving mileage. For automobile travel, indicate whether a government-furnished automobile was authorized and available; this determines whether the standard or reduced rate applies. If no travel date is supplied, today's date is used. The response identifies the selected rate category, rate and effective date, and the reimbursement amount rounded to the nearest cent.

Input schema

distance numberrequired

One-way or total travel distance in miles, from 0.001 through 100,000.

vehicle_type stringrequired

Vehicle or travel category used to select the applicable GSA mileage rate.

Allowed values: ["automobile", "airplane", "motorcycle", "moving"]

government_vehicle_available boolean

Optional for automobile calculations and defaults to false. Use true when a government-furnished automobile is authorized and available; false selects the standard privately owned automobile rate.

date string | null

Travel date used to select the effective rate. Accepts YYYY-MM-DD or YYYYMMDD; defaults to today.

date (anyOf 1) string

date (anyOf 2) null

{
  "type": "object",
  "properties": {
    "distance": {
      "type": "number",
      "multipleOf": 0.001,
      "maximum": 100000.0,
      "exclusiveMinimum": 0.0,
      "title": "Distance",
      "description": "One-way or total travel distance in miles, from 0.001 through 100,000.",
      "example": 125.5
    },
    "vehicle_type": {
      "type": "string",
      "enum": [
        "automobile",
        "airplane",
        "motorcycle",
        "moving"
      ],
      "title": "MileageCalculatorVehicleType",
      "description": "Vehicle or travel category used to select the applicable GSA mileage rate.",
      "example": "automobile"
    },
    "government_vehicle_available": {
      "type": "boolean",
      "title": "Government Vehicle Available",
      "description": "Optional for automobile calculations and defaults to false. Use true when a government-furnished automobile is authorized and available; false selects the standard privately owned automobile rate.",
      "default": false,
      "example": false
    },
    "date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ],
      "title": "Date",
      "description": "Travel date used to select the effective rate. Accepts YYYY-MM-DD or YYYYMMDD; defaults to today.",
      "example": "2026-07-11"
    }
  },
  "required": [
    "distance",
    "vehicle_type"
  ]
}

TOOL calculate_trip_per_diem

calculate_trip_per_diem

Calculate a GSA CONUS trip per diem entitlement

Calculate estimated lodging and meals and incidental expenses (M&IE) reimbursement for a trip within the continental United States. The response provides a daily breakdown and trip totals.

Describe the trip

  • Add each temporary-duty stop in travel order, with inclusive arrival and departure dates.
  • Identify each stop with a GSA destination ID or ZIP code. A stop represents the temporary-duty locality, which may differ from the hotel location.
  • Optionally provide the actual nightly lodging cost and any meals that must be deducted.
  • When one stop ends on the same date another begins, the arriving stop applies to that date.

Calculation rules

  • The calculator selects the GSA rate in effect for each day, including seasonal and fiscal-year changes.
  • First and last travel days receive 75% of the M&IE rate; intermediate days receive 100%.
  • Submitted meal deductions use the official GSA meal values while preserving the required incidental expense amount.
  • Lodging reimbursement is limited to the nightly GSA cap. Any amount above the cap is reported as overage and is not included in the payable total.

Important notes

  • Submit only meals that you have determined must be deducted under FTR 301-11.21.
  • Single-day reimbursement applies only when the traveler is in eligible travel status for more than 12 hours.
  • If a lodging cost is omitted, the response still shows the nightly cap, but lodging and overall payable totals are null.
  • The response includes the calculation version and a source fingerprint to support auditing.

Input schema

stops object[]required

Ordered, contiguous TDY-locality stops for the trip.

stops[] object

stops[].location objectrequired

TDY locality for the stop; not merely the hotel location.

stops[].location.zipcode string | null

Five-digit US ZIP or ZIP+4. ZIP+4 is normalized to five digits.

stops[].location.zipcode (anyOf 1) string

stops[].location.zipcode (anyOf 2) null

stops[].location.destination_id integer | null

GSA destination identifier. Destination 0 is Standard CONUS.

stops[].location.destination_id (anyOf 1) integer

stops[].location.destination_id (anyOf 2) null

stops[].arrival_date stringrequired

First calendar date owned by this stop.

stops[].departure_date stringrequired

Shared boundary/return date; the arriving next stop owns a transition date.

stops[].lodging_cost_per_night number | string | null

Optional actual room cost applied to every lodging night in this stop. Must be a JSON number with no more than two decimal places.

stops[].lodging_cost_per_night (anyOf 1) number

stops[].lodging_cost_per_night (anyOf 2) string

stops[].lodging_cost_per_night (anyOf 3) null

deductible_meals object[]

Sparse caller-determined meal deductions, keyed by trip date.

deductible_meals[] object

deductible_meals[].date stringrequired

Inclusive trip date on which meals are deducted.

deductible_meals[].meals string[]required

Non-empty unique breakfast/lunch/dinner deductions for the date.

deductible_meals[].meals[] string

Allowed values: ["breakfast", "lunch", "dinner"]

verification_url boolean

Include deduplicated official GSA verification URLs when true.

{
  "type": "object",
  "properties": {
    "stops": {
      "items": {
        "properties": {
          "location": {
            "properties": {
              "zipcode": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Zipcode",
                "description": "Five-digit US ZIP or ZIP+4. ZIP+4 is normalized to five digits.",
                "examples": [
                  "20001",
                  "20001-1234"
                ]
              },
              "destination_id": {
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": 0.0
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Destination Id",
                "description": "GSA destination identifier. Destination 0 is Standard CONUS.",
                "examples": [
                  123
                ]
              }
            },
            "additionalProperties": false,
            "type": "object",
            "title": "GSATripLocationRequest",
            "description": "TDY locality for the stop; not merely the hotel location."
          },
          "arrival_date": {
            "type": "string",
            "format": "date",
            "title": "Arrival Date",
            "description": "First calendar date owned by this stop."
          },
          "departure_date": {
            "type": "string",
            "format": "date",
            "title": "Departure Date",
            "description": "Shared boundary/return date; the arriving next stop owns a transition date."
          },
          "lodging_cost_per_night": {
            "anyOf": [
              {
                "type": "number",
                "maximum": 100000.0,
                "minimum": 0.0
              },
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lodging Cost Per Night",
            "description": "Optional actual room cost applied to every lodging night in this stop. Must be a JSON number with no more than two decimal places.",
            "examples": [
              250.0
            ]
          }
        },
        "additionalProperties": false,
        "type": "object",
        "required": [
          "location",
          "arrival_date",
          "departure_date"
        ],
        "title": "GSATripStopRequest"
      },
      "type": "array",
      "maxItems": 50,
      "minItems": 1,
      "title": "Stops",
      "description": "Ordered, contiguous TDY-locality stops for the trip."
    },
    "deductible_meals": {
      "items": {
        "properties": {
          "date": {
            "type": "string",
            "format": "date",
            "title": "Date",
            "description": "Inclusive trip date on which meals are deducted."
          },
          "meals": {
            "items": {
              "type": "string",
              "enum": [
                "breakfast",
                "lunch",
                "dinner"
              ],
              "title": "GSATripMeal"
            },
            "type": "array",
            "minItems": 1,
            "title": "Meals",
            "description": "Non-empty unique breakfast/lunch/dinner deductions for the date."
          }
        },
        "additionalProperties": false,
        "type": "object",
        "required": [
          "date",
          "meals"
        ],
        "title": "GSATripDeductibleMealsRequest"
      },
      "type": "array",
      "title": "Deductible Meals",
      "description": "Sparse caller-determined meal deductions, keyed by trip date."
    },
    "verification_url": {
      "type": "boolean",
      "title": "Verification Url",
      "description": "Include deduplicated official GSA verification URLs when true.",
      "default": false
    }
  },
  "required": [
    "stops"
  ]
}

MCP - OPM - General Schedule pay

TOOL get_opm_localities

get_opm_localities

GS locality pay areas, optionally by county or city

List the locality pay areas of the latest pay year, with the code to use on the pay endpoints. The optional location keeps the areas whose name contains every word, and the areas of the counties and cities with that name. state narrows location to one state and has no effect without it.

County and city names must match exactly, ignoring case; a trailing county is optional. A place outside every listed area returns Rest of U.S. (RUS). Area names keep matching on any word they contain. matched_places lists the counties and cities behind each result. A place name can return several areas: the same name can exist in several states, which state narrows, and a city can span several areas, in which case all of them are returned and the official duty station decides. City data is not published by OPM, so for payroll use /v1/opm/localities/county/{fips}. An empty result does not mean Rest of U.S.: the name may be misspelled, and U.S. territories are not covered.

Input schema

location string | null

County, city or locality area name.

location (anyOf 1) string

location (anyOf 2) null

state string | null

Restrict location to one state.

state (anyOf 1) string

2-digits US State ISO Code, format XX

state (anyOf 2) null

{
  "type": "object",
  "properties": {
    "location": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 2
        },
        {
          "type": "null"
        }
      ],
      "description": "County, city or locality area name.",
      "examples": [
        "evanston"
      ],
      "title": "Location"
    },
    "state": {
      "anyOf": [
        {
          "type": "string",
          "description": "2-digits US State ISO Code, format XX",
          "examples": [
            "AL",
            "CA"
          ]
        },
        {
          "type": "null"
        }
      ],
      "description": "Restrict \`location\` to one state.",
      "title": "State"
    }
  }
}

TOOL get_opm_locality_by_county

get_opm_locality_by_county

GS locality pay area of a county

Return the locality pay area of a county for the latest pay year, using OPM's own definitions. A county that OPM doesn't list under an area falls under Rest of U.S. (RUS), and every county in Alaska or Hawaii returns that state's area. Returns 404 for an unknown code and for a Connecticut planning region, as OPM defines Connecticut by its eight legacy counties. U.S. territories fall under Rest of U.S. in OPM's definitions, but their county codes are not available here and return 404. Burlington County, NJ (34005) returns the Philadelphia area, while three military sites inside it (Fort Dix, Joint Base McGuire-Dix-Lakehurst and McGuire Air Force Base) belong to the New York area.

Input schema

fips stringrequired

Five-digit county FIPS code: two for the state and three for the county.

{
  "type": "object",
  "properties": {
    "fips": {
      "type": "string",
      "pattern": "^\\d{5}$",
      "description": "Five-digit county FIPS code: two for the state and three for the county.",
      "examples": [
        "17031"
      ],
      "title": "Fips"
    }
  },
  "required": [
    "fips"
  ]
}

TOOL search_opm_pay

search_opm_pay

Search GS pay by locality area

Return the latest pay tables whose locality area matches every word of q: each word must be contained in the area name, case-insensitively, or equal its code. grade and step narrow the rates. No match returns an empty results list.

Matching only looks at OPM's locality area names, not at the counties and towns each area covers: naperville finds Chicago because the name contains it, while a town missing from the names returns nothing. No match does not mean the place falls under Rest of U.S.

Input schema

q stringrequired

Words to find in the locality area name or code, all required, case-insensitive.

grade integer | null

Return only this GS grade, 1 to 15.

grade (anyOf 1) integer

grade (anyOf 2) null

step integer | null

Return only this step, 1 to 10.

step (anyOf 1) integer

step (anyOf 2) null

{
  "type": "object",
  "properties": {
    "q": {
      "type": "string",
      "minLength": 2,
      "description": "Words to find in the locality area name or code, all required, case-insensitive.",
      "examples": [
        "chicago"
      ],
      "title": "Q"
    },
    "grade": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 15,
          "minimum": 1
        },
        {
          "type": "null"
        }
      ],
      "description": "Return only this GS grade, 1 to 15.",
      "title": "Grade"
    },
    "step": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 10,
          "minimum": 1
        },
        {
          "type": "null"
        }
      ],
      "description": "Return only this step, 1 to 10.",
      "title": "Step"
    }
  },
  "required": [
    "q"
  ]
}

TOOL get_opm_pay

get_opm_pay

GS pay by locality code

Return the latest pay table of a locality pay area, ordered by grade and step, or 404 for an unknown code. grade and step narrow the rates. Use GS for the base table without locality pay, and RUS for Rest of U.S.

Input schema

locality_code stringrequired

OPM locality pay area code, from /v1/opm/localities, or GS for the base table. Case-insensitive.

grade integer | null

Return only this GS grade, 1 to 15.

grade (anyOf 1) integer

grade (anyOf 2) null

step integer | null

Return only this step, 1 to 10.

step (anyOf 1) integer

step (anyOf 2) null

{
  "type": "object",
  "properties": {
    "locality_code": {
      "type": "string",
      "description": "OPM locality pay area code, from /v1/opm/localities, or GS for the base table. Case-insensitive.",
      "examples": [
        "CHI"
      ],
      "title": "Locality Code"
    },
    "grade": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 15,
          "minimum": 1
        },
        {
          "type": "null"
        }
      ],
      "description": "Return only this GS grade, 1 to 15.",
      "title": "Grade"
    },
    "step": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 10,
          "minimum": 1
        },
        {
          "type": "null"
        }
      ],
      "description": "Return only this step, 1 to 10.",
      "title": "Step"
    }
  },
  "required": [
    "locality_code"
  ]
}

MCP - Metadata

TOOL get_latest_publications

get_latest_publications

Latest data publications

Input schema

(body) object

{
  "type": "object",
  "properties": {}
}

MCP - User

TOOL get_user

get_user

Get User

Input schema

(body) object

{
  "type": "object",
  "properties": {}
}