A real request, and what comes back

Ambulatory health care services in Louisiana, annual, two years. The response below is what this request returned when it was last replayed; the vintage it names is in its metadata, and a later vintage returns different values.

Your key

# every request goes to https://api.datatactical.group
export DTG_API_KEY=dtg_live_…

Request

curl "https://api.datatactical.group/v2/industry/series?areas=22&naics=621&from=2024&to=2025" \
  -H "Authorization: Bearer $DTG_API_KEY"

Response · replayed 2026-10-05 against vintage 20260913.

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 119
X-RateLimit-Reset: 1
​
{
  "data": [
    {
      "naics": "621",
      "area": "22",
      "ownership": "all",
      "points": [
        { "period": "2024", "emp": 117235.33, "estabs": 11094.5,
            "earnings": 7634923163.23, "avg_pay": 65124.76,
            "disclosure": 0, "reliability": 1, "naics_restated": false,
            "fips_restated": false, "quarters_present": 4 },
        { "period": "2025", "emp": 118518.71, "estabs": 11449,
            "earnings": 7980832503.2, "avg_pay": 67338.17, "disclosure": 0,
            "reliability": 1, "naics_restated": false,
            "fips_restated": false, "quarters_present": 4 }
      ]
    }
  ],
  "meta": {
    "vintage": "20260913",
    "generated_at": "2026-10-05T04:26:55Z",
    "granularity": "annual",
    "provenance_boundaries": {
      "actuals": { "from": "2004q1", "to": "2026q1" },
      "ces": { "from": "2026q2", "to": "2026q3" },
      "projections": { "from": "2026q4", "to": "2036q4" }
    },
    "geography": { "requested": 1, "returned": 1, "excluded": 0 },
    "pagination": { "cursor": null, "next_cursor": null, "count": 1 }
  }
}

Make the request

Set your key in the environment and send one GET. The area is Louisiana by FIPS code, the industry is NAICS 621, the period is two annual values. State-level series are available to every key regardless of which counties the plan includes.

What came back

data holds one series per area, code and ownership. Each point carries the period, employment (emp), establishments (estabs), total earnings and average pay, then the labels: disclosure (0 published, 1 estimated, 2 carried forward, 3 projected), reliability (0 to 1, 1 for a published value, null for carried-forward and projected values and where there is no employment), and the two restatement flags. On an annual point, quarters_present counts the quarters of source data behind it; the annual figure itself is always the average of four quarters. meta names the vintage, the provenance boundaries that say which periods are surveyed, carried forward and projected, how many of the requested areas were returned, and the paging state.

The response carries the vintage it was read from. Pin it with vintage= to get the same numbers on every call; leave it out to get the current vintage, whose values change when a new one is released.

Change one thing

Replace areas=22 with a county, areas=22073, and the same request returns Ouachita Parish, if that county is in your plan. A request whose every county is outside the plan is refused with a 403 and the code geography_excluded, naming the counties in excluded_fips:

Request

curl "https://api.datatactical.group/v2/industry/series?areas=48113&naics=621&from=2024&to=2025" \
  -H "Authorization: Bearer $DTG_API_KEY"

Response · replayed 2026-10-05 against vintage 20260913.

HTTP/1.1 403 Forbidden
Content-Type: application/problem+json; charset=utf-8
​
{
  "type": "https://api.datatactical.group/problems/geography_excluded",
  "title": "Forbidden",
  "status": 403,
  "detail": "No requested area is entitled.",
  "code": "geography_excluded",
  "excluded_fips": [
    "48113"
  ]
}

A request that mixes counties in the plan with counties outside it returns the ones in the plan, and meta.geography.excluded counts the rest rather than silently returning less. Add strict=true to turn any exclusion into the 403 instead:

Request

curl "https://api.datatactical.group/v2/industry/series?areas=22073,48113&naics=621&from=2024&to=2025" \
  -H "Authorization: Bearer $DTG_API_KEY"

Response · replayed 2026-10-05 against vintage 20260913. Trimmed: data.points to 1 of 2.

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
​
{
  "data": [
    {
      "naics": "621",
      "area": "22073",
      "ownership": "all",
      "points": [
        { "period": "2024", "emp": 6581.87, "estabs": 576.5,
            "earnings": 369727676.3, "avg_pay": 56173.63, "disclosure": 1,
            "reliability": 0.98, "naics_restated": false,
            "fips_restated": false, "quarters_present": 4 }
      ]
    }
  ],
  "meta": {
    "vintage": "20260913",
    "generated_at": "2026-10-05T04:26:55Z",
    "granularity": "annual",
    "provenance_boundaries": {
      "actuals": { "from": "2004q1", "to": "2026q1" },
      "ces": { "from": "2026q2", "to": "2026q3" },
      "projections": { "from": "2026q4", "to": "2036q4" }
    },
    "geography": { "requested": 2, "returned": 1, "excluded": 1 },
    "pagination": { "cursor": null, "next_cursor": null, "count": 1 }
  }
}

Replace naics=621 with naics_level=3 to get every sector at once, or set granularity=quarterly with from=2024q1 for quarters. A large result comes in pages; see paging. Every parameter is in the industry reference.