---
title: "Full Penn World Table time series for one country"
method: GET
path: "/api/v1/research/pwt/country/{iso3}"
tags: ["Research"]
---

# Full Penn World Table time series for one country

`GET /api/v1/research/pwt/country/{iso3}`

Returns the country-year panel for one ISO 3166-1 alpha-3 coded country across all Penn World Table variables (or a caller-chosen subset). Annual cadence. Covers real GDP (expenditure and output side, both current and chained PPPs), national accounts, population, employment, human capital index, capital stock, TFP levels and growth rates, labor share, price levels, expenditure shares, and data-flag metadata. Not every country has full 1950 coverage - post-Soviet and post-Yugoslav states typically start around 1990-1992. Published under CC BY 4.0 with attribution to Penn World Table (Feenstra, Inklaar & Timmer, University of Groningen).

## Path parameters

- `iso3` string, required — ISO 3166-1 alpha-3 country code. Case-insensitive; normalised to uppercase.

## Query parameters

- `start_year` integer, nullable — Inclusive start year (integer). Panel range starts 1950.
- `end_year` integer, nullable — Inclusive end year (integer). Defaults to the latest year in the panel.
- `variables` string, nullable — Comma-separated variable names to return (e.g. `rgdpo,pop,emp,hc`). Omit to receive every variable in the panel.
- `version` string, nullable — Release selector. `pwt1100` (default) or `pwt1001` (legacy).

## Response `200`

Full country-year panel slice for one country across the requested variable subset.

- EnvelopePwtCountryPayload
  - `data` PwtCountryPayload, required — Full time series for one country across the requested variable subset.
    - `version` string, required — Release identifier.
    - `countrycode` string, required — ISO 3166-1 alpha-3 code echoed from the path, uppercased.
    - `country` string, nullable — Country name.
    - `currency_unit` string, nullable — National currency unit.
    - `variables` string[], required — Variable names included in the response (excludes identifiers).
    - `observations` PwtObservation[], required — Year-indexed observations ordered ascending by year.
      - `year` integer, required — Observation year.
      - `countrycode` string, nullable — ISO 3166-1 alpha-3 country code.
      - `country` string, nullable — Country name as published.
      - `currency_unit` string, nullable — National currency unit.
    - `count` integer, required — Number of observations after year-range filtering.
    - `start_year` integer, nullable — Inclusive start year applied, or null.
    - `end_year` integer, nullable — Inclusive end year applied, or null.
    - `attribution` string, required — CC BY 4.0 attribution.
  - `meta` SugraMeta, required — Metadata attached to every /api/v1/* response envelope.
    - `endpoint` string, required — Requested endpoint path.
    - `data_time` string, required — ISO 8601 UTC timestamp of the source data, not of the request.
    - `response_time` string, required — ISO 8601 UTC timestamp when this response was produced.
    - `provider` string, required — API name and version.
    - `source` string, nullable — Identifier of the primary upstream source used for this response.
    - `attribution` string, nullable — Human-readable attribution mandated by an upstream source (e.g. a securities regulator or self-regulatory organization). Present only on responses whose source requires the owner and source to be clearly identified. Do not remove or alter it when using the response.
    - `fallback_used` boolean, nullable — True when the primary source failed and a fallback produced the data.
    - `fallback_chain` string[], nullable — Ordered list of sources attempted, in the order they were tried.
    - `cached` boolean, nullable — True when this response was served from the internal cache.
    - `stale` boolean, nullable — True when the cached response was returned after the upstream rate-limited or errored. Clients can use this to detect degraded data.

## Other responses

- `401` — Missing or invalid `x-api-key` header. JSON body with a stable `code` distinguishing `missing_api_key` (no header sent) from `invalid_api_key` (header sent, key not accepted); any other 401 source carries the generic `unauthorized` with its detail as `reason`. Plus `hint`. `plan` is always null on 401 - an unauthenticated request has no plan; quota exhaustion is 429, not 401.
- `422` — Validation Error
- `429` — Daily rate limit exceeded. Check `X-RateLimit-Reset` for the next window.
- `503` — Upstream source is temporarily unavailable. Retry after a short delay.

---

[API](https://skmtc.net/sugra/apis/sugra-api.md) · [All operations](https://skmtc.net/sugra/apis/sugra-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/sugra/sugra-api/versions/a0c7dc18e21b/schema)
