Product carbon footprint API
For consultants and software platforms: create a product's carbon footprint from your own system with the same engine as this site, calculated in line with ISO 14067 and exported in PACT v3 format. Keys are issued by request: hello@missionsustainability.org.
Authentication and limits
Send your key on every call: Authorization: Bearer <key>. Each key has a monthly call limit; every response carries X-RateLimit-Limit and X-RateLimit-Remaining. Keys only see the footprints they created. We store only a fingerprint of your key, so a lost key is replaced, not recovered.
Endpoints
| Method | Path | What it does |
|---|---|---|
POST | /api/v1/footprints | Calculate and store a footprint. Body: a simple product or a full engine input. Returns 201 with the footprint. |
GET | /api/v1/footprints/{id} | The stored footprint, in the same form. |
GET | /api/v1/footprints/{id}/pact | The PACT v3.0.3 data file (JSON) for your customer's systems. |
GET | /api/v1/footprints/{id}/buyer-pack | ZIP: PDF report, PACT file, assumptions and data sources. |
GET | /api/v1/usage | This key's calls and footprints this month, and its limit. |
Two kinds of input
- A simple product (
product): name, category, materials (as on a label, for example "60% cotton, 40% polyester" or "Upper: cotton; Outsole: natural rubber"), weight_g, made_in, and optional sku and brand. It is read exactly like a row of a catalogue upload: a screening estimate, with every default written to the assumptions. - A full engine input (
spec): materials, factory energy, packaging, transport, use and end of life, as in the full footprint form (its "Edit as JSON" view shows the format). Use it when you have the company's own data.
Full example
Request
Response (201 Created; long lists shortened with …)
{
"id": "fp_XXXXXXXXXXXX",
"object": "footprint",
"created": "2026-11-12T10:00:00.000Z",
"kind": "product",
"product": {
"name": "Organic cotton T-shirt",
"sku": "TS-101",
"category": "clothing"
},
"result": {
"total_kgco2e": 4.194774,
"total_including_biogenic_uptake_kgco2e": 3.693363,
"cradle_to_gate_kgco2e": 2.497337,
"declared_unit": "piece",
"boundary": "cradle_to_grave",
"partial": false,
"stages_kgco2e": {
"raw_materials": 0.309176,
"production": 1.984892,
"packaging": 0.203269,
"distribution": 0.04007,
"use": 1.522918,
"end_of_life": 0.134449
},
"uncertainty_95_kgco2e": [
2.44,
13.44
],
"gwp": "IPCC AR6, GWP100; 93% of emissions come from factors published in AR5 or with an unstated basis (ISO 14067 allows this when no AR6 version exists)"
},
"data_quality": {
"confidence": "Medium",
"dqr": {
"technological": 3,
"geographical": 1.37,
"temporal": 1,
"overall": 1.79
},
"primary_data_share_pct": 0,
"own_activity_data_pct": 0
},
"eco_score": {
"band": "B",
"vs_category_median_pct": -16.2,
"category": "t-shirt",
"benchmark_products": 3060,
"method": "eco-score v1"
},
"standards": {
"summary": [
{
"standard": "ISO 14040/14044",
"met": 13,
"justified": 1,
"not_met": 0,
"needs_reviewer": 1,
"conforms_by_calculation": true
},
{
"standard": "ISO 14067",
"met": 21,
"justified": 2,
"not_met": 1,
"needs_reviewer": 1,
"conforms_by_calculation": false
},
{
"standard": "PACT",
"met": 14,
"justified": 1,
"not_met": 3,
"needs_reviewer": 1,
"conforms_by_calculation": false
}
],
"checks": [
{
"id": "goal_statement",
"title": "The study's purpose is written down",
"results": {
"ISO14044": {
"status": "met",
"clause": "4.2.2",
"detail": "Application, reasons and audience stated."
},
"ISO14067": {
"status": "met",
"clause": "6.3.1",
"detail": "Application, reasons and audience stated."
}
}
},
"…"
]
},
"status_label": "Screening estimate",
"assumptions": [
"Screening mode: this listing gives no primary data, so every input below that is not a stated material or weight is a named screening default. The result is not PACT-conformant (primary data share 0%).",
"…"
],
"warnings": [
"Factor Organic cotton lint, India includes land-use change that cannot be separated; land-use change is reported inside fossil GHG for this line.",
"…"
],
"sources": [
{
"title": "Carbon intensity of electricity (Ember via Our World in Data)",
"publisher": "Our World in Data / Ember",
"version": "2026 release (2025 data)",
"licence": "CC BY 4.0",
"share_of_footprint_pct": 83.2
},
{
"title": "UK DESNZ Greenhouse gas reporting: conversion factors 2025",
"publisher": "UK Department for Energy Security and Net Zero",
"version": "2025 (flat file)",
"licence": "Open Government Licence v3.0",
"share_of_footprint_pct": 9.2
},
"…"
],
"engine": {
"version": "1.2.0",
"factor_library": "2026.11-mfp.8"
},
"links": {
"self": "https://productcarbonfootprint.ai/api/v1/footprints/fp_XXXXXXXXXXXX",
"pact": "https://productcarbonfootprint.ai/api/v1/footprints/fp_XXXXXXXXXXXX/pact",
"buyer_pack": "https://productcarbonfootprint.ai/api/v1/footprints/fp_XXXXXXXXXXXX/buyer-pack"
}
}Results only
Responses give totals, the breakdown by life-cycle stage, uncertainty, data quality, the eco-score, the standards checklist, assumptions and the sources with their licences. Individual emission factor values are never returned: the buyer pack's PDF leaves them out and has no calculation CSV. This is a condition of the data licences.
Errors
Every error is JSON: {"error": {"code": "...", "message": "..."}}
| Status | Code | Meaning |
|---|---|---|
| 401 | missing_key / invalid_key | No key, or a key that is not valid or switched off. |
| 404 | not_found | No footprint with this id for this key (keys only see their own footprints). |
| 413 | too_large | Request body over 200 KB. |
| 422 | invalid_input | The footprint could not be calculated. problems lists every missing or invalid input; nothing is guessed. |
| 429 | monthly_limit | The key has used its calls for the month. |
Footprints are screening estimates or company studies, as labelled in each response; they are for business-to-business use and not for public environmental claims. See how we calculate.