---
title: "Single metric time series for one country"
method: GET
path: "/api/v1/environment/co2/country/{iso3}/{metric}"
tags: ["Environment"]
---

# Single metric time series for one country

`GET /api/v1/environment/co2/country/{iso3}/{metric}`

Returns a lean `(year, value)` series for a single metric column in the OWID CO2 bundle. The metric name must match one of the 76 column keys from the codebook exactly (e.g. `co2`, `co2_per_capita`, `consumption_co2`, `methane`, `nitrous_oxide`, `temperature_change_from_co2`, `share_global_co2`, `cumulative_co2`). Call `/api/v1/environment/co2/codebook` for the full column list with units and descriptions. Published under CC BY 4.0 with dual attribution - the response names the primary upstream provider for this specific column (Global Carbon Project, Jones et al., EIA, etc).

## Path parameters

- `iso3` string, required — ISO 3166-1 alpha-3 country code. Case-insensitive; normalised to uppercase.
- `metric` string, required — Metric column name from the codebook (e.g. `co2`, `co2_per_capita`, `methane`, `temperature_change_from_co2`).

## Query parameters

- `start_year` integer, nullable — Inclusive start year (integer). Bundle range is 1750-present.
- `end_year` integer, nullable — Inclusive end year. Defaults to the latest year in the bundle.

## Response `200`

Year-value pairs for one metric plus unit, description, and per-column attribution.

- EnvelopeCo2MetricPayload
  - `data` Co2MetricPayload, required — Single metric time series for one ISO3 country.
    - `iso_code` string, required — ISO 3166-1 alpha-3 code echoed from the path parameter, uppercased.
    - `country` string, nullable — Country name as published by OWID.
    - `metric` string, required — Column name requested from the CSV (e.g. `co2`, `co2_per_capita`, `methane`, `temperature_change_from_co2`).
    - `unit` string, nullable — Unit of measure sourced from the codebook (e.g. `million tonnes`, `tonnes per person`, `degrees Celsius`).
    - `description` string, nullable — Human-readable column description from the codebook.
    - `upstream_source` string, nullable — Primary data provider cited by the codebook for this metric (e.g. `Global Carbon Budget (2025)`, `Jones et al. (2025)`).
    - `observations` Co2MetricObservation[], required — Yearly observations ordered ascending by year.
      - `year` integer, required — Observation year.
      - `value` number, nullable — Metric value. Null if not published for that country-year.
    - `count` integer, required — Number of observations in the response.
    - `attribution` string, required — CC BY 4.0 attribution string combining Our World in Data and the primary upstream source.
  - `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)
