---
title: "Source feed — one publisher's dataset, whole"
method: GET
path: "/v1/sources/{id}"
tags: ["Discovery"]
---

# Source feed — one publisher's dataset, whole

`GET /v1/sources/{id}`

## Request

- Base URL: `https://api.greencalculus.com`
- URL: `https://api.greencalculus.com/v1/sources/{id}`
- Auth: none required

Open (no key). Every row we hold from one public-domain publisher, with that publisher's licence, issuing body and retrieval date, and the exact source reference behind each value. Feeds exist for a NAMED SET of sources, not for every source id in the corpus — a source we have not cleared for republication has no feed, and asks for one are refused rather than quietly answered from somewhere else. The id is case-insensitive. Everything else in the corpus is readable through GET /v1/factors, which carries the same values, provenance and licence per row.

## Path parameters

- `id` string, required

## Response `200`

The publisher record plus every factor transcribed from it

- SourceFeed: One publisher's dataset, whole: every row we transcribed from it, with the publisher, the licence, the retrieval date and the exact source reference per row. The unit of CITATION rather than the unit of query — you take this when you want to hold a publisher's set, not when you want one number.
  - `schema_version` string
  - `api_endpoint` string: The origin route this feed is projected from.
  - `dataset` string
  - `gc_version` string
  - `gc_updated` string, date
  - `next_update` string: When the publisher next issues, and how long we take to reconcile — stated so a stale figure is predictable rather than a surprise.
  - `attribution` object
  - `sources` object[]: The publisher record: id, name, issuing body, url, licence, year, retrieval date.
  - `count` integer
  - `factors` FactorRow[]
    - `key` string
    - `name` string, nullable
    - `section` string, nullable
    - `activity_type` string, nullable
    - `factor` object
      - `value` number, nullable
      - `unit` string, nullable
      - `gas` string, nullable
      - `basis` string, nullable
      - `gwp_set` string, nullable
      - `gwp_set_basis` string, nullable: How we know the GWP set — "published" where the source states it, "inferred" where we deduced it. null means not recorded, which is deliberately NOT the same as published.
      - `country_iso3` string, nullable
      - `uncertainty` Uncertainty, nullable: The publisher's own stated range, never derived by us. null means NOT RECORDED — explicitly not a claim that no uncertainty exists.
        - `low` number, nullable
        - `high` number, nullable
        - `basis` string, nullable
        - `published_as` string, nullable: The publisher's exact wording, e.g. "±30-50%".
      - `uncertainty_basis` string, nullable: "none_published" means the publisher states plainly that no range exists. null means not recorded — a different fact from silence.
    - `source` SourceRef: Provenance to the line. Carried on 100% of rows — where in the source document the value was read, not just which document. A workbook cell where the publisher ships a workbook (DEFRA); otherwise the table, annex clause or page they did ship (IPCC, CBAM, ECCC).
      - `id` string
      - `cell_ref` string
      - `retrieved` string, date
    - `scope` object, nullable
      - `ghg_protocol` string, nullable
      - `category` string, nullable
    - `components` object, nullable: Per-gas decomposition keyed by gas (co2, ch4, n2o…), each with its own cell_ref. Lets a consumer re-base AR5↔AR6 without us.
    - `note` string, nullable: Includes what the publisher did NOT provide, stated verbatim.
    - `citation` FactorCitation: The canonical citation for one factor row, built by the API (src/citation.ts) and printed VERBATIM by every official client (Sheets add-in, JS and Python SDKs, MCP). Format: "<factor name>. <source name> — <publisher>, cell <cell_ref>, retrieved <date>. via GreenCalculus data version <version>, factor <key>. <proof URL>". On GET /v1/factors/{key} the version is the one actually SERVED, so a ?as_of= lookup cites the pin. Present on rows from 2026-09-09. The format is a published specification, free for anyone to implement against their own data: https://greencalculus.com/developers/citation/
      - `text` string
      - `source_id` string, nullable
      - `cell_ref` string, nullable
      - `version` string, nullable
      - `proof_url` string, nullable
    - `licence` object: The licence this row is published under, and whether the Business redistribution grant covers it. Present on the open browse from MB v2026.181 — the full terms, the required credit and the publisher are listed once per source under meta.licences. Absent (not empty) where no licence is on record: an empty value would read as "no licence applies".
      - `name` string
      - `redistributable` boolean

## Other responses

- `404`: No feed for that source id. The error names the ids that do have one.

---

[API](https://skmtc.dev/greencalculus/apis/greencalculus-api.md) · [All operations](https://skmtc.dev/greencalculus/apis/greencalculus-api/llms.txt) · [OpenAPI document](https://skmtc.dev/greencalculus/apis/greencalculus-api/revisions/2f742325958c?raw)
