{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/lune/json-schema/lune-project-schema.json",
  "title": "Project",
  "description": "A Project represents the entity which issues carbon credits because of its environmental activity which reduces, avoids, or removes emissions from the atmosphere.\n\nClients cannot purchase a specific Project's credits by creating an order.\nA Project's credits are allocated to an order if the order has purchased a project bundle the project belongs to.\n",
  "x-generated": "2026-10-29",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/lune-openapi.yml#/components/schemas/Project",
  "allOf": [
    {
      "$ref": "#/$defs/ProjectSummary"
    },
    {
      "type": "object",
      "required": [
        "bundles",
        "impact_summary",
        "quality_assessment",
        "links_and_news",
        "carbon_credits",
        "timeline",
        "carbon_storage_over_time",
        "datasets"
      ],
      "properties": {
        "bundles": {
          "type": "array",
          "description": "An array of Bundle objects the project is part of.",
          "items": {
            "$ref": "#/$defs/BundleSummary"
          }
        },
        "impact_summary": {
          "description": "The items of the array are ordered exactly as they're meant to be used.\n\nA null value means there's no data or the section is disabled.\n",
          "type": [
            "array",
            "null"
          ],
          "minItems": 1,
          "items": {
            "type": "object",
            "required": [
              "icon",
              "label",
              "title",
              "description",
              "image_url"
            ],
            "properties": {
              "icon": {
                "$ref": "#/$defs/MuiIcon"
              },
              "label": {
                "type": "string",
                "description": "A short piece of text to go with the icon",
                "minLength": 1
              },
              "title": {
                "type": "string",
                "minLength": 1
              },
              "description": {
                "type": "string",
                "minLength": 1
              },
              "image_url": {
                "type": "string",
                "minLength": 1
              }
            }
          }
        },
        "datasets": {
          "description": "Datasets available for the project.\n\nFor instance Forest loss or Biodiversity.\n",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "type": "object",
            "required": [
              "dataset",
              "description",
              "thumbnail_url"
            ],
            "properties": {
              "dataset": {
                "type": "string",
                "description": "Dataset's name.",
                "minLength": 1
              },
              "description": {
                "type": "string",
                "description": "Project specific commentary regarding the dataset.",
                "minLength": 1
              },
              "thumbnail_url": {
                "type": "string",
                "description": "Project specific thumbnail URL regarding the dataset.",
                "minLength": 1
              }
            }
          }
        },
        "quality_assessment": {
          "description": "The way the project relates to every of the five Project Quality Assessment categories.\n\nA null value means there's no data or the section is disabled.\n",
          "type": [
            "object",
            "null"
          ],
          "required": [
            "durability",
            "additionality",
            "measurement",
            "risk_mitigation",
            "cobenefits"
          ],
          "properties": {
            "durability": {
              "$ref": "#/$defs/TitleAndDescription"
            },
            "additionality": {
              "$ref": "#/$defs/TitleAndDescription"
            },
            "measurement": {
              "$ref": "#/$defs/TitleAndDescription"
            },
            "risk_mitigation": {
              "$ref": "#/$defs/TitleAndDescription"
            },
            "cobenefits": {
              "$ref": "#/$defs/TitleAndDescription"
            }
          }
        },
        "links_and_news": {
          "description": "A null value means there's no data or the section is disabled.",
          "type": [
            "object",
            "null"
          ],
          "required": [
            "links",
            "news"
          ],
          "properties": {
            "links": {
              "description": "The order of the array is how the elements are meant to be used.",
              "type": "array",
              "items": {
                "type": "object",
                "required": [
                  "destination_url",
                  "title",
                  "favicon_url"
                ],
                "properties": {
                  "destination_url": {
                    "type": "string",
                    "minLength": 1
                  },
                  "title": {
                    "type": "string",
                    "minLength": 1
                  },
                  "favicon_url": {
                    "type": "string",
                    "minLength": 1
                  }
                }
              }
            },
            "news": {
              "description": "The order of the array is how the elements are meant to be used.",
              "type": "array",
              "items": {
                "type": "object",
                "required": [
                  "image_url",
                  "favicon_url",
                  "article_url",
                  "title",
                  "description",
                  "published_at"
                ],
                "properties": {
                  "image_url": {
                    "type": "string",
                    "minLength": 1
                  },
                  "favicon_url": {
                    "type": "string",
                    "minLength": 1
                  },
                  "article_url": {
                    "type": "string",
                    "minLength": 1
                  },
                  "title": {
                    "type": "string",
                    "minLength": 1
                  },
                  "description": {
                    "type": "string",
                    "minLength": 1
                  },
                  "published_at": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "date-time"
                  }
                }
              }
            }
          }
        },
        "carbon_credits": {
          "description": "A null value means there's no data or the section is disabled. Note that\navailability can be missing data or be disabled separately.\n",
          "type": [
            "object",
            "null"
          ],
          "required": [
            "offset_delivery",
            "retirement_timeframe",
            "inventory"
          ],
          "properties": {
            "offset_delivery": {
              "type": "string",
              "enum": [
                "ex_post",
                "ex_ante",
                "pre_purchase"
              ]
            },
            "retirement_timeframe": {
              "type": "string",
              "enum": [
                "instant",
                "near_term",
                "future"
              ]
            },
            "inventory": {
              "description": "What's available for sale.\n\nA null value means there's no data or the section is disabled.\n\nThe array is ordered newest to oldest (per the year property).\n",
              "type": [
                "array",
                "null"
              ],
              "minItems": 1,
              "items": {
                "type": "object",
                "required": [
                  "vintage",
                  "quantity",
                  "price"
                ],
                "properties": {
                  "vintage": {
                    "description": "This is an opaque string and you may not interpret it in any way.",
                    "type": "string",
                    "minLength": 1
                  },
                  "quantity": {
                    "description": "In tonnes.",
                    "type": "number"
                  },
                  "price": {
                    "$ref": "#/$defs/MonetaryAmount"
                  }
                }
              }
            }
          }
        },
        "timeline": {
          "description": "The array order is newest to oldest.\n\nA null value means there's no data or the section is disabled.\n",
          "type": [
            "array",
            "null"
          ],
          "minItems": 1,
          "items": {
            "type": "object",
            "required": [
              "year",
              "description"
            ],
            "properties": {
              "year": {
                "type": "number"
              },
              "description": {
                "type": "string",
                "minLength": 1
              }
            }
          }
        },
        "carbon_storage_over_time": {
          "description": "The order of the array is oldest to newest (per the year property).\n\nA null value means there's no data or the section is disabled.\n\nThe values (except for year, of course) are in tonnes.\n",
          "type": [
            "array",
            "null"
          ],
          "minItems": 1,
          "items": {
            "type": "object",
            "required": [
              "year",
              "baseline",
              "carbon_stock",
              "assumed_leakage",
              "buffer",
              "credits_issued"
            ],
            "properties": {
              "year": {
                "type": "number"
              },
              "baseline": {
                "type": "number"
              },
              "carbon_stock": {
                "type": "number"
              },
              "assumed_leakage": {
                "type": "number"
              },
              "buffer": {
                "type": "number"
              },
              "credits_issued": {
                "type": "number"
              }
            }
          }
        }
      }
    }
  ],
  "$defs": {
    "BundleSummary": {
      "type": "object",
      "required": [
        "id",
        "name",
        "unit_price",
        "gross_unit_price",
        "currency",
        "background_colour",
        "primary_image",
        "primary_image_hires",
        "small_thumbnail",
        "description",
        "disabled",
        "available_quantity",
        "offset_type",
        "approach",
        "carbon_permanence"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The bundle's unique identifier"
        },
        "name": {
          "type": "string",
          "description": "The bundle's name"
        },
        "unit_price": {
          "type": "string",
          "description": "Bundle unit price per tonne CO2\n",
          "pattern": "^[0-9]+(\\.[0-9]+)?$"
        },
        "gross_unit_price": {
          "type": "string",
          "description": "Bundle unit price per tonne CO2 inclusive of fees\n",
          "pattern": "^[0-9]+(\\.[0-9]+)?$"
        },
        "currency": {
          "type": "string",
          "description": "Currency code"
        },
        "background_colour": {
          "type": [
            "string",
            "null"
          ],
          "description": "A bundle's background colour in hexadecimal format"
        },
        "primary_image": {
          "type": [
            "string",
            "null"
          ],
          "description": "A bundle's image URL"
        },
        "large_image": {
          "type": [
            "string",
            "null"
          ],
          "description": "A bundle's larger image URL"
        },
        "primary_image_hires": {
          "type": [
            "string",
            "null"
          ],
          "description": "A bundle's high resolution image URL"
        },
        "small_thumbnail": {
          "type": [
            "string",
            "null"
          ],
          "description": "A bundle's small thumbnail image URL"
        },
        "description": {
          "type": [
            "string",
            "null"
          ],
          "description": "The bundle's description"
        },
        "disabled": {
          "type": "boolean",
          "description": "Disabled bundles do not accept orders\n"
        },
        "available_quantity": {
          "type": [
            "string",
            "null"
          ],
          "description": "Quantity of CO2 offsets available to purchase (in tonnes).\n\nIf available_quantity is null, assume there is an unlimited amount of offsets to purchase.\n",
          "pattern": "^[0-9]+(\\.[0-9]+)?$"
        },
        "offset_type": {
          "type": [
            "string",
            "null"
          ],
          "description": "Offset type classification\n",
          "enum": [
            "emissions_reduction",
            "carbon_removal",
            null
          ]
        },
        "approach": {
          "type": [
            "string",
            "null"
          ],
          "description": "Bundle approach",
          "enum": [
            "traditional",
            "innovative",
            null
          ]
        },
        "carbon_permanence": {
          "$ref": "#/$defs/CarbonPermanence"
        }
      }
    },
    "CarbonPermanence": {
      "type": "string",
      "description": "The bundle's carbon storage permanence.",
      "enum": [
        "long_term",
        "short_term",
        "no_storage"
      ]
    },
    "CurrencyCode": {
      "x-lune-name": "Currency code",
      "type": "string",
      "description": "ISO 4217 3 character currency code.\n\nNote: Lune supports most but not all currency codes.\n",
      "enum": [
        "AED",
        "AFN",
        "ALL",
        "AMD",
        "ANG",
        "AOA",
        "ARS",
        "AUD",
        "AWG",
        "AZN",
        "BAM",
        "BBD",
        "BDT",
        "BGN",
        "BHD",
        "BIF",
        "BMD",
        "BND",
        "BOB",
        "BRL",
        "BSD",
        "BTC",
        "BTN",
        "BWP",
        "BYN",
        "BYR",
        "BZD",
        "CAD",
        "CDF",
        "CHF",
        "CLF",
        "CLP",
        "CNY",
        "CNH",
        "COP",
        "CRC",
        "CUC",
        "CUP",
        "CVE",
        "CZK",
        "DJF",
        "DKK",
        "DOP",
        "DZD",
        "EGP",
        "ERN",
        "ETB",
        "EUR",
        "FJD",
        "FKP",
        "GBP",
        "GEL",
        "GGP",
        "GHS",
        "GIP",
        "GMD",
        "GNF",
        "GTQ",
        "GYD",
        "HKD",
        "HNL",
        "HRK",
        "HTG",
        "HUF",
        "IDR",
        "ILS",
        "IMP",
        "INR",
        "IQD",
        "IRR",
        "ISK",
        "JEP",
        "JMD",
        "JOD",
        "JPY",
        "KES",
        "KGS",
        "KHR",
        "KMF",
        "KPW",
        "KRW",
        "KWD",
        "KYD",
        "KZT",
        "LAK",
        "LBP",
        "LKR",
        "LRD",
        "LSL",
        "LTL",
        "LVL",
        "LYD",
        "MAD",
        "MDL",
        "MGA",
        "MKD",
        "MMK",
        "MNT",
        "MOP",
        "MRU",
        "MUR",
        "MVR",
        "MWK",
        "MXN",
        "MYR",
        "MZN",
        "NAD",
        "NGN",
        "NIO",
        "NOK",
        "NPR",
        "NZD",
        "OMR",
        "PAB",
        "PEN",
        "PGK",
        "PHP",
        "PKR",
        "PLN",
        "PYG",
        "QAR",
        "RON",
        "RSD",
        "RUB",
        "RWF",
        "SAR",
        "SBD",
        "SCR",
        "SDG",
        "SEK",
        "SGD",
        "SHP",
        "SLE",
        "SLL",
        "SOS",
        "SRD",
        "STD",
        "SVC",
        "SYP",
        "SZL",
        "THB",
        "TJS",
        "TMT",
        "TND",
        "TOP",
        "TRY",
        "TTD",
        "TWD",
        "TZS",
        "UAH",
        "UGX",
        "USD",
        "UYU",
        "UZS",
        "VES",
        "VND",
        "VUV",
        "WST",
        "XAF",
        "XAG",
        "XAU",
        "XCD",
        "XDR",
        "XOF",
        "XPF",
        "YER",
        "ZAR",
        "ZMK",
        "ZMW",
        "ZWL"
      ]
    },
    "Media": {
      "type": "object",
      "required": [
        "type",
        "url",
        "attribution_text",
        "attribution_url"
      ],
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "image",
            "video"
          ],
          "description": "The type of the media item"
        },
        "url": {
          "type": "string",
          "description": "The URL of the media item"
        },
        "attribution_text": {
          "type": [
            "string",
            "null"
          ],
          "description": "A short description of where the image or video was sourced"
        },
        "attribution_url": {
          "type": [
            "string",
            "null"
          ],
          "description": "A URL pointing to where the image or video was sourced"
        }
      }
    },
    "MonetaryAmount": {
      "type": "object",
      "required": [
        "value",
        "currency"
      ],
      "properties": {
        "value": {
          "$ref": "#/$defs/MonetaryAmountValue"
        },
        "currency": {
          "$ref": "#/$defs/CurrencyCode"
        }
      }
    },
    "MonetaryAmountValue": {
      "type": "string",
      "pattern": "^[0-9]+(\\.[0-9]+)?$",
      "description": "Specify the monetary value in the currency defined by the `currency_code` property in the request. If no `currency_code` is provided, the currency will default to that of the associated account.\n"
    },
    "MuiIcon": {
      "type": "string",
      "description": "MUI icon name"
    },
    "ProjectSummary": {
      "type": "object",
      "required": [
        "id",
        "name",
        "short_name",
        "slug",
        "description",
        "project_type",
        "registry_name",
        "registry_link",
        "latitude",
        "longitude",
        "country_name",
        "country_code",
        "region",
        "logo",
        "primary_image",
        "thumbnail_image",
        "results",
        "un_sdg",
        "media",
        "disabled",
        "crediting_start_date",
        "crediting_end_date",
        "registration_date",
        "protocol",
        "methodology",
        "durability",
        "additional_standards_met",
        "verifying_body",
        "risk_of_reversal",
        "risk_of_predicted_emissions",
        "avg_annual_emission_reductions"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The projects's unique identifier"
        },
        "name": {
          "type": "string",
          "description": "The project's name"
        },
        "short_name": {
          "type": "string",
          "description": "The project's short name. May coincide with name."
        },
        "slug": {
          "type": "string",
          "description": "Project slug"
        },
        "description": {
          "description": "Project description",
          "type": "string"
        },
        "project_type": {
          "type": "string",
          "description": "The project's offset type, eg Forest conservation, Afforestation, Direct Air Capture"
        },
        "registry_name": {
          "$ref": "#/$defs/Registry"
        },
        "registry_link": {
          "type": [
            "string",
            "null"
          ],
          "description": "A link to the registry's project details page."
        },
        "latitude": {
          "type": "number",
          "format": "float",
          "description": "Latitude"
        },
        "longitude": {
          "type": "number",
          "format": "float",
          "description": "Logitude"
        },
        "country_name": {
          "type": "string",
          "description": "The project's country"
        },
        "country_code": {
          "type": "string",
          "description": "The project's 3 character country code"
        },
        "region": {
          "type": [
            "string",
            "null"
          ],
          "description": "The project's region"
        },
        "logo": {
          "type": [
            "string",
            "null"
          ],
          "description": "A project logo image URL"
        },
        "primary_image": {
          "type": [
            "string",
            "null"
          ],
          "description": "A project image URL"
        },
        "thumbnail_image": {
          "type": [
            "string",
            "null"
          ],
          "description": "A project thumbnail image URL"
        },
        "results": {
          "description": "Project results",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "type": "string"
          }
        },
        "un_sdg": {
          "description": "UN Sustainable Development Goals.\n\nEach number in the array represent one UN Sustainable Development Goal. See https://sdgs.un.org/goals.\n",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "type": "number"
          }
        },
        "disabled": {
          "type": "boolean",
          "description": "Disabled projects do not get allocated to orders\n"
        },
        "media": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/Media"
          },
          "description": "A list of images and videos belonging to the project."
        },
        "crediting_start_date": {
          "type": [
            "string",
            "null"
          ],
          "format": "date",
          "description": "Project’s crediting period start date."
        },
        "crediting_end_date": {
          "type": [
            "string",
            "null"
          ],
          "format": "date",
          "description": "Project’s crediting period end date."
        },
        "registration_date": {
          "type": [
            "string",
            "null"
          ],
          "format": "date",
          "description": "Date the project was registered in the registry."
        },
        "protocol": {
          "type": [
            "array",
            "null"
          ],
          "items": {
            "type": "string"
          },
          "description": "The standard followed to assure that a carbon offset project delivers on carbon reduction or removal."
        },
        "methodology": {
          "type": [
            "string",
            "null"
          ],
          "description": "Detailed application of the broader principles set out in the protocol."
        },
        "durability": {
          "type": [
            "string",
            "null"
          ],
          "description": "Expected duration of the carbon storage (carbon removal projects only)."
        },
        "additional_standards_met": {
          "type": [
            "array",
            "null"
          ],
          "items": {
            "type": "string"
          },
          "description": "Any additional standards the project meets."
        },
        "verifying_body": {
          "type": [
            "string",
            "null"
          ],
          "description": "Independent entity assessing compliance of carbon projects with protocol and methodology."
        },
        "risk_of_reversal": {
          "type": [
            "string",
            "null"
          ],
          "description": "Mitigation plan for the risk of reversal."
        },
        "risk_of_predicted_emissions": {
          "type": [
            "string",
            "null"
          ],
          "description": "Mitigation plan for the risk of predicted reductions or removals not occurring."
        },
        "avg_annual_emission_reductions": {
          "type": [
            "string",
            "null"
          ],
          "pattern": "^[0-9]+(\\.[0-9]+)?$",
          "description": "Estimated average annual reductions or removals."
        }
      }
    },
    "Registry": {
      "type": "string",
      "description": "The project's Verification Standard Entity name or equivalent organization.",
      "enum": [
        "American Carbon Registry",
        "Verra",
        "Puro.earth",
        "Gold Standard",
        "Climate Action Reserve",
        "Woodland Carbon Code",
        "ACCU",
        "Carbon Future",
        "Isometric",
        "Tuv Nord",
        ""
      ]
    },
    "TitleAndDescription": {
      "type": "object",
      "required": [
        "title",
        "description"
      ],
      "properties": {
        "title": {
          "type": "string",
          "minLength": 1
        },
        "description": {
          "type": "string",
          "minLength": 1
        }
      }
    }
  }
}