{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://researchark.eu/schemas/funding/v4.6.0/arkid_funding_schema.json",
  "title": "Funding Opportunity",
  "description": "A schema for describing funding opportunities.",
  "type": "object",
  "version": "4.6.0",
  "lastUpdated": "2026-04-18",
  "properties": {
    "arkf": {
      "type": [
        "string",
        "null"
      ],
      "pattern": "^ARKF-[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{3}[0-9X]$",
      "description": "Persistent ArkID identifier for this funding instrument (Programme, Call, or Module)."
    },
    "level": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "Programme",
        "Call",
        "Module",
        null
      ],
      "description": "Position in the funding hierarchy. Programme = top-level scheme; Call = funding opportunity that applicants apply to; Module = thematic budget split inside a Call."
    },
    "parent_arkf": {
      "type": [
        "string",
        "null"
      ],
      "pattern": "^ARKF-[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{3}[0-9X]$",
      "description": "ARKF of the parent in the funding hierarchy. Allowed transitions: Programme→null; Call→Programme|null; Module→Call. Used to walk the tree when populating funding_program (parent) and call_modules (children)."
    },
    "opportunity_id": {
      "description": "A unique identifier generated by combining components from the domain, subdomain (if applicable), an abbreviation from the opportunity title, a date if available (or 'NODATE' if not), and initials from the URL title. The format is `SOURCE-ABBR-YYYYMMDD-INITIALS`, where:\n\n- `SOURCE`: Derived from the first two letters of the subdomain (if applicable) and the first two letters of the main domain (e.g., 'DFGD' for dfg.de or 'ECEU' for ec.europa.eu).\n- `ABBR`: An abbreviation from the opportunity or program title, formed by taking the first letters of each significant word (e.g., 'WBPR' for Walter Benjamin Programme, 'HEUR' for Horizon Europe).\n- `YYYYMMDD`: A date, typically the application deadline, formatted as `YYYYMMDD` (e.g., '20240815' for 15 August 2024). If no date is present, 'NODATE' is used.\n- `INITIALS`: Extracted from the key words in the URL title (e.g., 'wb' for 'walter-benjamin').\n\nExamples:\n\n1. For the URL `https://www.dfg.de/en/research-funding/funding-opportunities/programmes/individual/walter-benjamin` with no specific deadline, the `opportunity_id` would be:\n   - `DFGD-WBPR-NODATE-wb`\n\n2. For the URL `https://ec.europa.eu/info/funding-tenders/opportunities/topic-details/horizon-europe` with a deadline of 20 November 2024, the `opportunity_id` would be:\n   - `ECEU-HEUR-20241120-he`\n   - Where `HEUR` is derived from 'Horizon Europe' and `he` from the URL's key words.\n\n3. For the URL `https://www.ukri.org/opportunities/sustainable-agriculture-research-funding` with a deadline of 1 January 2025, the `opportunity_id` would be:\n   - `UKRI-SARF-20250101-sarf`\n   - Where `SARF` comes from 'Sustainable Agriculture Research Funding' and `sarf` from the URL.",
      "type": "string",
      "pattern": "^[A-Z]{2,4}-[A-Z]{2,10}-(?:\\d{8}|NODATE)-[a-z]{2,10}$",
      "example": "ECEU-HEUR-20241120-he"
    },
    "title": {
      "description": "The title of the funding opportunity.",
      "type": "string"
    },
    "summary": {
      "description": "A brief summary of the funding opportunity.",
      "type": "string"
    },
    "full_description": {
      "description": "A detailed description of the funding opportunity.",
      "type": "string"
    },
    "funding_type": {
      "description": "Type of funding mechanism. fellowship=researcher stipend; grant=project subsidy; cooperative-agreement=US federal grant with substantial agency involvement (U01/U54); prize=competitive cash award; award=post-achievement recognition; training-grant=cohort program; salary-award=researcher salary; research-and-innovation-actions=EU RIA/IA/CSA consortia; capacity-building-grant=institution-building/equipment for under-resourced entities; blended-finance=grant+equity+loan mix; co-fund=EC co-funded instrument; coordination-and-support-actions=EC CSA; equity-participation=equity stakes, silent partnerships, mezzanine capital; guarantee=Bürgschaft, credit guarantee schemes.",
      "type": "string",
      "enum": [
        "award",
        "contract",
        "co-fund",
        "coordination-and-support-actions",
        "crowdfunding",
        "endowment",
        "equipment-funding",
        "facilities-funding",
        "fellowship",
        "grant",
        "loan",
        "prize",
        "salary-award",
        "secondment",
        "seed-funding",
        "training-grant",
        "research-and-innovation-actions",
        "cooperative-agreement",
        "blended-finance",
        "capacity-building-grant",
        "equity-participation",
        "guarantee",
        "other"
      ]
    },
    "applicant_type": {
      "description": "Array of applicant type slugs. All that apply. research-organization=EC code REC; educational-institution=EC code HES; micro-small-and-medium-enterprises=SMEs; non-profit-organization=NGO/charity/foundation (EC code OTH); public-sector-organization=EC code PUB; national-government=sovereign ministry (World Bank/UNDP calls); student-or-early-career-researcher=doctoral student or early postdoc; not-specified when source is silent.",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": "string",
        "enum": [
          "individual-researcher",
          "student-or-early-career-researcher",
          "research-organization",
          "educational-institution",
          "non-profit-organization",
          "public-sector-organization",
          "micro-small-and-medium-enterprises",
          "start-up",
          "large-enterprise",
          "international-organization",
          "national-government",
          "national-consortium",
          "transnational-consortium",
          "other-individual",
          "other-organization",
          "not-specified"
        ]
      }
    },
    "status": {
      "description": "Current lifecycle status of the funding opportunity.",
      "type": "string",
      "enum": [
        "draft",
        "open",
        "closed",
        "suspended",
        "cancelled",
        "archived"
      ],
      "example": "open"
    },
    "funding_cycle": {
      "description": "Type of funding cycle indicating if this is a recurring opportunity.",
      "type": "string",
      "enum": [
        "annual",
        "rolling",
        "one-time",
        "multi-year-program",
        "emergency",
        "other"
      ],
      "example": "annual"
    },
    "project_duration_months": {
      "description": "Expected or maximum project duration in months.",
      "type": "integer",
      "minimum": 1,
      "example": 36
    },
    "funding_organizations": {
      "description": "An array of organizations involved in funding or supporting the opportunity. Funding organizations array is optional at schema level, but strongly recommended. If provided, should contain at least one organization.",
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name",
          "role"
        ],
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string",
            "description": "The full official name of the organization"
          },
          "role": {
            "type": "string",
            "enum": [
              "primary-funder",
              "co-funder",
              "managing-organization",
              "coordinator",
              "beneficiary",
              "affiliated-entity",
              "associated-partner",
              "supporting-partner",
              "partner",
              "national-funding-agency",
              "subcontractor",
              "not-specified"
            ],
            "description": "The role of the organization in this funding opportunity."
          },
          "funding_council": {
            "type": [
              "string",
              "null"
            ],
            "description": "Sub-council within an umbrella funder (e.g. 'epsrc', 'bbsrc', 'mrc' within UKRI). Critical for UKRI disambiguation."
          },
          "contribution_amount": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0,
            "description": "The amount of financial contribution in the specified currency. Only applicable for 'primary-funder' and 'co-funder' roles. Omit for other roles"
          },
          "contribution_currency": {
            "type": "string",
            "pattern": "^[A-Z]{3}$",
            "description": "The ISO 4217 three-letter currency code for the contribution amount (e.g., 'EUR', 'USD', 'GBP'). Only applicable when contribution_amount is specified"
          },
          "funder_registry_id": {
            "type": "string",
            "pattern": "^https://doi.org/10\\.13039/.*$",
            "description": "Crossref Funder Registry (FundRef) DOI — deprecated in favour of ROR. Provide ror_id when available."
          },
          "ror_id": {
            "type": "string",
            "pattern": "^https://ror.org/[0-9a-z]{9}$",
            "description": "ROR identifier for the organization to support PID alignment."
          },
          "country_code": {
            "type": "string",
            "pattern": "^[A-Z]{2}$",
            "description": "ISO 3166-1 alpha-2 country code indicating the organization's primary location."
          }
        },
        "allOf": [
          {
            "if": {
              "required": [
                "contribution_amount"
              ]
            },
            "then": {
              "required": [
                "contribution_currency"
              ]
            }
          }
        ]
      }
    },
    "funding_scheme": {
      "type": "string",
      "description": "The specific funding scheme or program under which the opportunity is offered"
    },
    "related_identifiers": {
      "type": "array",
      "description": "Persistent identifiers that link this opportunity or its components to related entities (projects, awards, schemes, outputs).",
      "items": {
        "type": "object",
        "required": [
          "identifier",
          "scheme",
          "relation_type"
        ],
        "additionalProperties": false,
        "properties": {
          "identifier": {
            "type": "string",
            "description": "Identifier value such as a DOI, handle, or URL."
          },
          "scheme": {
            "type": "string",
            "enum": [
              "doi",
              "handle",
              "grant-doi",
              "ror",
              "fundref",
              "url",
              "ark",
              "orcid",
              "grid",
              "issn",
              "isbn",
              "other"
            ],
            "description": "The identifier scheme or resolver namespace. fundref=Crossref Funder Registry (deprecated, use ror_id); grid=deprecated (use ror_id); orcid=for PI/programme officer ORCID."
          },
          "relation_type": {
            "type": "string",
            "enum": [
              "IsPartOf",
              "HasPart",
              "Requires",
              "IsRequiredBy",
              "References",
              "IsReferencedBy",
              "Continues",
              "IsContinuedBy",
              "IsSupplementTo",
              "IsSupplementedBy"
            ],
            "description": "Relationship type following DataCite/Crossref relationType vocabulary."
          },
          "description": {
            "type": "string",
            "description": "Free-text explanation of how the related identifier connects to this opportunity."
          }
        }
      }
    },
    "funding_references": {
      "type": "array",
      "description": "References to parent or linked awards/funders needed for DOI export workflows.",
      "items": {
        "type": "object",
        "required": [
          "funder_name"
        ],
        "properties": {
          "parent_award_number": {
            "type": "string",
            "description": "Identifier assigned to the upstream/parent award or umbrella funding decision."
          },
          "funder_name": {
            "type": "string",
            "description": "Name of the funding body responsible for the parent award."
          },
          "funder_identifier": {
            "type": "string",
            "description": "Persistent identifier for the funder (e.g., Crossref Funder Registry DOI or ROR URL)."
          },
          "parent_award_identifier": {
            "type": "string",
            "description": "Persistent identifier for the parent award if available (e.g., DOI)."
          }
        },
        "anyOf": [
          {
            "required": [
              "parent_award_number"
            ]
          },
          {
            "required": [
              "parent_award_identifier"
            ]
          }
        ]
      }
    },
    "opportunity_url": {
      "description": "The URL to the funding opportunity webpage.",
      "type": "string",
      "format": "uri"
    },
    "apply_here_url": {
      "description": "The URL where applicants can submit their application.",
      "type": "string",
      "format": "uri"
    },
    "eligibility_criteria": {
      "description": "The criteria for eligibility to apply for the funding opportunity.",
      "type": "string"
    },
    "geographic_eligibility": {
      "deprecated": true,
      "description": "Geographic eligibility broken into standardized buckets. DEPRECATED: Use applicant_eligibility_location and project_implementation_location for clarity. Three-layer taxonomy: (A) Country: ISO 3166-1 alpha-2 uppercase (e.g. 'DE', 'US'); Subdivision: ISO 3166-2 uppercase (e.g. 'US-CA', 'DE-BY'). (B) UN M49-aligned macroregions: 'world', 'sub-saharan-africa', 'southern-asia', 'eastern-asia', 'south-east-asia', 'latin-america-and-the-caribbean', 'northern-africa-and-western-asia', 'central-asia', 'northeast-asia', 'greater-china', 'middle-east', 'north-africa'. (C) Political/programme blocs: 'eu', 'eea', 'efta', 'western-balkans', 'eastern-partnership', 'horizon-europe-associated-countries', 'oecd', 'g7', 'g20', 'nato', 'asean', 'african-union', 'gcc', 'apec', 'sadc', 'ecowas', 'eac', 'comesa', 'saarc'. Development finance: 'least-developed-countries', 'lower-middle-income-countries', 'upper-middle-income-countries', 'ida-eligible', 'small-island-developing-states', 'fragile-and-conflict-affected-states'. Sub-regional Africa: 'east-africa', 'west-africa', 'southern-africa', 'central-africa', 'horn-of-africa'.",
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "countries": {
          "type": "array",
          "description": "ISO 3166-1 alpha-2 country codes eligible for this call.",
          "items": {
            "type": "string",
            "pattern": "^[A-Z]{2}$"
          }
        },
        "states": {
          "type": "array",
          "description": "ISO 3166-2 sub-division codes (e.g., 'US-CA') or similar state/province identifiers.",
          "items": {
            "type": "string",
            "pattern": "^[A-Z]{2}-[A-Z0-9]{1,3}$"
          }
        },
        "regions": {
          "type": "array",
          "description": "Supra-national regions or groupings. Common values: EU, EEA, Europe, Nordic, EFTA, NAFTA, APEC, ASEAN, WE (Western Europe), EE (Eastern Europe), SEA (Southeast Asia), LATAM, MENA, BRICS, CIS, AU (African Union), Oceania, CELAC, UNASUR, SADC, CARICOM, OECD, Arctic, Global, Sub-Saharan Africa, North Africa, Middle East, Central Asia, South Asia, East Asia, Central America, South America, Caribbean, Central Europe, Southern Europe, Northern Europe, North America, Africa, Asia, Americas, Pacific, Balkans, Worldwide, or custom definitions.",
          "items": {
            "type": "string"
          }
        }
      },
      "additionalProperties": false
    },
    "applicant_eligibility_location": {
      "description": "Geographic restrictions on applicant eligibility based on the location of the applicant's institution or residence. NEW in v4.3.0: Distinguishes WHERE APPLICANTS must be located (institution address) from where work happens.",
      "type": "object",
      "properties": {
        "countries": {
          "type": "array",
          "description": "ISO 3166-1 alpha-2 country codes where applicants must be based/registered.",
          "items": {
            "type": "string",
            "pattern": "^[A-Z]{2}$"
          },
          "example": [
            "US",
            "UK",
            "DE"
          ]
        },
        "states": {
          "type": "array",
          "description": "ISO 3166-2 sub-division codes for state/province-level applicant restrictions.",
          "items": {
            "type": "string",
            "pattern": "^[A-Z]{2}-[A-Z0-9]{1,3}$"
          },
          "example": [
            "US-CA",
            "US-NY"
          ]
        },
        "regions": {
          "type": "array",
          "description": "Supra-national regions or groupings where applicants must be based. Common values: EU, EEA, Europe, Nordic, EFTA, NAFTA, APEC, ASEAN, WE (Western Europe), EE (Eastern Europe), SEA (Southeast Asia), LATAM, MENA, BRICS, CIS, AU (African Union), Oceania, CELAC, UNASUR, SADC, CARICOM, OECD, Arctic, Global, Sub-Saharan Africa, North Africa, Middle East, Central Asia, South Asia, East Asia, Central America, South America, Caribbean, Central Europe, Southern Europe, Northern Europe, North America, Africa, Asia, Americas, Pacific, Balkans, Worldwide, or custom regional definitions.",
          "items": {
            "type": "string"
          },
          "example": [
            "EU",
            "OECD",
            "Sub-Saharan Africa"
          ]
        },
        "exclusions": {
          "type": "array",
          "description": "Countries explicitly excluded from eligibility even if in an included region.",
          "items": {
            "type": "string",
            "pattern": "^[A-Z]{2}$"
          },
          "example": [
            "RU",
            "BY"
          ]
        },
        "notes": {
          "type": "string",
          "description": "Additional clarifications about applicant location eligibility (e.g., 'Must be legally registered in eligible country for at least 2 years')."
        }
      },
      "additionalProperties": false
    },
    "project_implementation_location": {
      "description": "Geographic requirements for where the funded project activities must take place and where funds must be spent. NEW in v4.3.0: Distinguishes WHERE WORK HAPPENS from where applicants are based.",
      "type": "object",
      "properties": {
        "countries": {
          "type": "array",
          "description": "ISO 3166-1 alpha-2 country codes where project work must be conducted.",
          "items": {
            "type": "string",
            "pattern": "^[A-Z]{2}$"
          },
          "example": [
            "KE",
            "UG",
            "TZ"
          ]
        },
        "states": {
          "type": "array",
          "description": "ISO 3166-2 sub-division codes for state/province-level implementation requirements.",
          "items": {
            "type": "string",
            "pattern": "^[A-Z]{2}-[A-Z0-9]{1,3}$"
          }
        },
        "regions": {
          "type": "array",
          "description": "Supra-national regions or groupings where project implementation must occur. Common values: EU, EEA, Europe, Nordic, EFTA, NAFTA, APEC, ASEAN, WE (Western Europe), EE (Eastern Europe), SEA (Southeast Asia), LATAM, MENA, BRICS, CIS, AU (African Union), Oceania, CELAC, UNASUR, SADC, CARICOM, OECD, Arctic, Global, Sub-Saharan Africa, North Africa, Middle East, Central Asia, South Asia, East Asia, Central America, South America, Caribbean, Central Europe, Southern Europe, Northern Europe, North America, Africa, Asia, Americas, Pacific, Balkans, Worldwide, or custom regional definitions.",
          "items": {
            "type": "string"
          },
          "example": [
            "Sub-Saharan Africa",
            "Southeast Asia",
            "Global"
          ]
        },
        "minimum_percentage_in_location": {
          "type": "number",
          "minimum": 0,
          "maximum": 100,
          "description": "Minimum percentage of project activities or funds that must be spent in specified locations.",
          "example": 60
        },
        "spending_restrictions": {
          "type": "object",
          "description": "Detailed requirements about how and where funds must be spent.",
          "properties": {
            "minimum_local_spending_percentage": {
              "type": "number",
              "minimum": 0,
              "maximum": 100,
              "description": "Minimum percentage of budget that must be spent in implementation countries."
            },
            "local_partner_required": {
              "type": "boolean",
              "description": "Whether a local partner in the implementation country is required."
            },
            "notes": {
              "type": "string",
              "description": "Additional details about spending requirements."
            }
          }
        },
        "field_work_requirements": {
          "type": "string",
          "description": "Specific requirements about field work or on-site presence in implementation locations."
        },
        "notes": {
          "type": "string",
          "description": "Additional clarifications about implementation location requirements (e.g., 'Research must benefit target communities in implementation countries')."
        }
      },
      "additionalProperties": false
    },
    "consortium_guidelines": {
      "description": "The guidelines and requirements for forming a consortium for the funding opportunity.",
      "type": "string"
    },
    "discipline_subject_area": {
      "type": [
        "array",
        "null"
      ],
      "minItems": 1,
      "description": "OECD FORD disciplines. MANDATORY — always assign at least 1. No other-sciences fallback. Use ALL disciplines that apply.",
      "items": {
        "type": "object",
        "required": [
          "discipline",
          "knowledge_fields"
        ],
        "additionalProperties": false,
        "properties": {
          "discipline": {
            "type": "string",
            "enum": [
              "natural-sciences",
              "engineering-and-technology",
              "medical-and-health-sciences",
              "agricultural-and-veterinary-sciences",
              "social-sciences",
              "humanities-and-the-arts"
            ],
            "description": "OECD FORD broad classification slug."
          },
          "knowledge_fields": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "string"
            },
            "description": "Knowledge field slugs valid for chosen discipline. natural-sciences: mathematics,computer-and-information-sciences,physical-sciences,chemical-sciences,earth-and-related-environmental-sciences,biological-sciences,other-natural-sciences. engineering-and-technology: civil-engineering,electrical-electronic-information-engineering,mechanical-engineering,chemical-engineering,materials-engineering,medical-engineering,environmental-engineering,environmental-biotechnology,industrial-biotechnology,nano-technology,other-engineering-and-technologies. medical-and-health-sciences: basic-medicine,clinical-medicine,health-sciences,medical-biotechnology,other-medical-sciences. agricultural-and-veterinary-sciences: agriculture-forestry-and-fisheries,animal-and-dairy-science,veterinary-science,agricultural-biotechnology,other-agricultural-sciences. social-sciences: psychology-and-cognitive-sciences,economics-and-business,education,sociology,law,political-science,social-and-economic-geography,media-and-communications,other-social-sciences. humanities-and-the-arts: history-and-archaeology,languages-and-literature,philosophy-ethics-and-religion,arts,other-humanities."
          }
        }
      }
    },
    "career_level": {
      "description": "EURAXESS European Framework for Research Careers. r1=doctoral candidate/supervised researcher (MSCA DN, ESR); r2=postdoc/junior researcher (MSCA PF, not yet independent); r3=independent researcher/PI (ERC StG/CoG, assistant/associate professor, first independent position); r4=leading researcher (ERC AdG, full professor, CSO). undergraduate/graduate=pre-R1. not-applicable=non-researcher grants (equipment, infrastructure). any-researcher=explicitly open to all career stages. not-specified=source is silent or ambiguous.",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": "string",
        "enum": [
          "not-applicable",
          "not-specified",
          "undergraduate",
          "graduate",
          "r1",
          "r2",
          "r3",
          "r4",
          "any-researcher"
        ]
      }
    },
    "total_funding_available": {
      "description": "The total amount of funding available for the opportunity. Plain integer (e.g. 500000). null when unknown. Use min/max fields for ranges.",
      "type": [
        "integer",
        "null"
      ],
      "minimum": 0
    },
    "award_amount": {
      "description": "The amount of funding awarded per successful application. Plain integer (e.g. 500000). null when unknown. Use min/max fields for ranges.",
      "type": [
        "integer",
        "null"
      ],
      "minimum": 0
    },
    "minimum_award_amount": {
      "description": "The minimum amount of funding that can be awarded per successful application. Plain integer (e.g. 500000). null when unknown. Use min/max fields for ranges.",
      "type": [
        "integer",
        "null"
      ],
      "minimum": 0
    },
    "maximum_award_amount": {
      "description": "The maximum amount of funding that can be awarded per successful application. Plain integer (e.g. 500000). null when unknown. Use min/max fields for ranges.",
      "type": [
        "integer",
        "null"
      ],
      "minimum": 0
    },
    "currency": {
      "description": "The currency of the funding amounts. Uses three-letter uppercase ISO 4217 currency code.",
      "type": "string",
      "pattern": "^[A-Z]{3}$"
    },
    "number_of_awards": {
      "description": "The number of awards available for the funding opportunity.",
      "type": [
        "integer",
        "null"
      ],
      "minimum": 0
    },
    "funding_duration": {
      "description": "The duration of the funding period.",
      "type": "string",
      "enum": [
        "up-to-1-year",
        "1-2-years",
        "2-3-years",
        "3-4-years",
        "4-5-years",
        "5-years-and-more",
        "not-specified"
      ]
    },
    "funding_allocation_notes": {
      "type": "string",
      "description": "Any specific notes about how funding must be allocated, e.g., 'At least 60% of funds must be spent in eligible developing countries.'"
    },
    "indirect_costs_policy": {
      "description": "Policy regarding indirect costs (overhead, facilities & administrative costs).",
      "type": "object",
      "properties": {
        "allowed": {
          "type": "boolean",
          "description": "Whether indirect costs are allowed."
        },
        "maximum_rate": {
          "type": "number",
          "minimum": 0,
          "maximum": 100,
          "description": "Maximum indirect cost rate as a percentage."
        },
        "calculation_base": {
          "type": "string",
          "description": "What the rate is calculated on (e.g., 'Modified Total Direct Costs', 'Total Direct Costs', 'Personnel Costs').",
          "example": "Modified Total Direct Costs"
        },
        "notes": {
          "type": "string",
          "description": "Additional details about indirect cost policy."
        }
      }
    },
    "eligible_cost_categories": {
      "description": "Categories of costs that are eligible for funding.",
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "personnel",
          "equipment",
          "travel",
          "materials",
          "subcontracts",
          "consultancy",
          "publication",
          "dissemination",
          "training",
          "other-direct-costs"
        ]
      },
      "example": [
        "personnel",
        "equipment",
        "travel"
      ]
    },
    "prohibited_costs": {
      "description": "Specific costs that are not allowed to be charged to this funding.",
      "type": "array",
      "items": {
        "type": "string"
      },
      "example": [
        "entertainment",
        "alcoholic beverages",
        "political activities"
      ]
    },
    "preliminary_deadline": {
      "type": [
        "string",
        "null"
      ],
      "description": "ISO 8601 date (YYYY-MM-DD) or datetime with timezone (YYYY-MM-DDTHH:MM:SS+HH:MM or Z). Use datetime when source specifies time and timezone. Use date-only when only date is given."
    },
    "application_deadline": {
      "type": [
        "string",
        "null"
      ],
      "description": "ISO 8601 date (YYYY-MM-DD) or datetime with timezone (YYYY-MM-DDTHH:MM:SS+HH:MM or Z). Use datetime when source specifies time and timezone. Use date-only when only date is given."
    },
    "application_deadline_timezone": {
      "type": [
        "string",
        "null"
      ],
      "description": "IANA timezone ID (e.g. Europe/Berlin, America/New_York, UTC) when timezone is named in source but not embedded in the datetime string."
    },
    "application_open_date": {
      "type": [
        "string",
        "null"
      ],
      "description": "ISO 8601 date (YYYY-MM-DD) or datetime with timezone (YYYY-MM-DDTHH:MM:SS+HH:MM or Z). Use datetime when source specifies time and timezone. Use date-only when only date is given."
    },
    "project_start_date": {
      "type": [
        "string",
        "null"
      ],
      "description": "ISO 8601 date (YYYY-MM-DD) or datetime with timezone (YYYY-MM-DDTHH:MM:SS+HH:MM or Z). Use datetime when source specifies time and timezone. Use date-only when only date is given."
    },
    "submission_method": {
      "description": "The method for submitting applications.",
      "type": "string"
    },
    "required_documents": {
      "description": "The documents required for the application.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "contact_information": {
      "description": "The contact information for inquiries about the funding opportunity.",
      "type": "string"
    },
    "selection_process": {
      "description": "The process for selecting successful applications.",
      "type": "string"
    },
    "evaluation_criteria": {
      "description": "The criteria used to evaluate applications.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "ethical_considerations": {
      "description": "The ethical considerations for the funding opportunity.",
      "type": "string"
    },
    "open_access_requirements": {
      "description": "The requirements for open access to research outputs.",
      "type": "string",
      "enum": [
        "required",
        "encouraged",
        "not-required",
        "not-specified"
      ]
    },
    "transnational_collaboration_requirements": {
      "description": "The requirements for transnational collaboration.",
      "type": "string"
    },
    "data_management_plan_required": {
      "description": "Whether a data management plan (DMP) is required as part of the application.",
      "type": "boolean",
      "example": true
    },
    "data_management_plan_guidance_url": {
      "description": "URL to guidance or template for data management plans.",
      "type": "string",
      "format": "uri"
    },
    "intellectual_property_policy": {
      "description": "Policy regarding ownership and management of intellectual property generated from funded research.",
      "type": "string"
    },
    "limited_submission_policy": {
      "description": "Policy for institutions with limits on the number of applications they can submit.",
      "type": "object",
      "properties": {
        "applies": {
          "type": "boolean",
          "description": "Whether limited submission rules apply."
        },
        "maximum_applications_per_institution": {
          "type": "integer",
          "minimum": 1,
          "description": "Maximum number of applications allowed per institution."
        },
        "internal_deadline_recommended": {
          "type": "string",
          "format": "date",
          "description": "Recommended internal institutional deadline for pre-selection."
        },
        "notes": {
          "type": "string",
          "description": "Additional details about limited submission policy."
        }
      }
    },
    "payment_schedule": {
      "description": "How and when funds will be disbursed to recipients.",
      "type": "object",
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "upfront",
            "milestone-based",
            "reimbursement",
            "installments",
            "hybrid"
          ],
          "description": "Type of payment schedule."
        },
        "payment_stages": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "stage_name": {
                "type": "string",
                "description": "Name of the payment stage (e.g., 'Initial payment', 'Mid-term', 'Final')."
              },
              "percentage": {
                "type": "number",
                "minimum": 0,
                "maximum": 100,
                "description": "Percentage of total funds disbursed at this stage."
              },
              "trigger": {
                "type": "string",
                "description": "What triggers this payment (e.g., 'Contract signing', 'Interim report approval')."
              }
            }
          },
          "description": "Breakdown of payment stages if milestone-based or installments."
        },
        "notes": {
          "type": "string",
          "description": "Additional details about payment terms."
        }
      }
    },
    "award_notification_date": {
      "type": [
        "string",
        "null"
      ],
      "description": "ISO 8601 date (YYYY-MM-DD) or datetime with timezone (YYYY-MM-DDTHH:MM:SS+HH:MM or Z). Use datetime when source specifies time and timezone. Use date-only when only date is given."
    },
    "notification_date": {
      "type": [
        "string",
        "null"
      ],
      "description": "ISO 8601 date (YYYY-MM-DD) or datetime with timezone (YYYY-MM-DDTHH:MM:SS+HH:MM or Z). Use datetime when source specifies time and timezone. Use date-only when only date is given."
    },
    "re_submission_policy": {
      "description": "The policy for re-submitting applications.",
      "type": "string"
    },
    "keywords": {
      "description": "The keywords associated with the funding opportunity.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "language": {
      "description": "The language of the funding opportunity. Uses two-letter lowercase ISO 639-1 language code.",
      "type": "string",
      "pattern": "^[a-z]{2}$"
    },
    "attachments": {
      "description": "Additional attachments related to the funding opportunity.",
      "type": "array",
      "items": {
        "type": "string",
        "format": "uri"
      }
    },
    "additional_information": {
      "description": "Any additional information about the funding opportunity.",
      "type": "string"
    },
    "faq_url": {
      "description": "URL to frequently asked questions about this funding opportunity.",
      "type": "string",
      "format": "uri",
      "example": "https://example.com/funding/faq"
    },
    "info_session_dates": {
      "description": "Scheduled information sessions, webinars, or Q&A events for applicants.",
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "date"
        ],
        "properties": {
          "date": {
            "type": "string",
            "format": "date-time",
            "description": "Date and time of the information session."
          },
          "title": {
            "type": "string",
            "description": "Title or topic of the session."
          },
          "format": {
            "type": "string",
            "enum": [
              "webinar",
              "in-person",
              "hybrid",
              "recorded"
            ],
            "description": "Format of the information session."
          },
          "registration_url": {
            "type": "string",
            "format": "uri",
            "description": "URL to register for the session."
          },
          "recording_url": {
            "type": "string",
            "format": "uri",
            "description": "URL to recording if available."
          }
        }
      }
    },
    "budget_template_url": {
      "description": "URL to budget template or form that applicants should use.",
      "type": "string",
      "format": "uri",
      "example": "https://example.com/funding/budget-template.xlsx"
    },
    "historical_success_rate": {
      "description": "Historical success rate for this funding opportunity or similar calls.",
      "type": "object",
      "properties": {
        "percentage": {
          "type": "number",
          "minimum": 0,
          "maximum": 100,
          "description": "Success rate as a percentage."
        },
        "year": {
          "type": "integer",
          "description": "Year or period this statistic refers to."
        },
        "applications_received": {
          "type": "integer",
          "minimum": 0,
          "description": "Number of applications received."
        },
        "awards_made": {
          "type": "integer",
          "minimum": 0,
          "description": "Number of awards granted."
        },
        "notes": {
          "type": "string",
          "description": "Additional context about these statistics."
        }
      }
    },
    "support_contacts": {
      "description": "Named support resources for applicants (help desks, programme officers, etc.). Support contacts must have at least one way to reach them (email, phone, or channel).",
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name"
        ],
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "phone": {
            "type": "string"
          },
          "channel": {
            "type": "string",
            "enum": [
              "email",
              "phone",
              "portal",
              "office-hours",
              "other"
            ]
          },
          "notes": {
            "type": "string"
          }
        },
        "anyOf": [
          {
            "required": [
              "email"
            ]
          },
          {
            "required": [
              "phone"
            ]
          },
          {
            "required": [
              "channel"
            ]
          }
        ]
      }
    },
    "partner_search": {
      "description": "Metadata describing whether an official partner-search workflow is available for this opportunity.",
      "type": "object",
      "properties": {
        "enabled": {
          "type": "boolean"
        },
        "url": {
          "type": "string",
          "format": "uri"
        },
        "notes": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "submission_timeline": {
      "description": "Structured submission stages (e.g., expression of interest, full proposal).",
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "phase"
        ],
        "additionalProperties": false,
        "properties": {
          "phase": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "open_date": {
            "type": "string",
            "format": "date-time"
          },
          "deadline_date": {
            "type": "string",
            "format": "date-time"
          },
          "notes": {
            "type": "string"
          }
        }
      }
    },
    "per_action_budget": {
      "description": "Per-action budget envelopes extracted from programme budget tables.",
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "action",
          "budgets"
        ],
        "additionalProperties": false,
        "properties": {
          "action": {
            "type": "string"
          },
          "deadline_model": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "single-stage",
              "two-stage",
              "cascade",
              "fpa-sga",
              "rolling",
              "cut-off",
              "not-specified"
            ]
          },
          "planned_opening_date": {
            "type": "string",
            "format": "date-time"
          },
          "budgets": {
            "type": "object",
            "additionalProperties": {
              "type": "number"
            },
            "description": "Keyed by budget year with amount in the specified currency."
          },
          "deadline_date": {
            "type": [
              "string",
              "null"
            ]
          },
          "contributions_min": {
            "type": [
              "integer",
              "null"
            ]
          },
          "contributions_max": {
            "type": [
              "integer",
              "null"
            ]
          },
          "indicative_number_of_grants": {
            "type": [
              "integer",
              "null"
            ]
          },
          "module_ref": {
            "type": [
              "string",
              "null"
            ],
            "description": "Cross-reference key matching a call_modules entry."
          }
        }
      }
    },
    "evaluation_matrix": {
      "description": "Structured evaluation criteria including optional weights or thresholds.",
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "criterion"
        ],
        "additionalProperties": false,
        "properties": {
          "criterion": {
            "type": "string"
          },
          "weight": {
            "type": "number"
          },
          "threshold": {
            "type": "number"
          },
          "notes": {
            "type": "string"
          }
        }
      }
    },
    "technology_readiness_level": {
      "description": "The Technology Readiness Level (TRL) range for the funding opportunity. The start_level must be less than or equal to end_level. VALIDATION NOTE: Application code must verify start_level <= end_level. JSON Schema cannot enforce cross-field comparison without enumerating all 81 combinations.",
      "type": "object",
      "required": [
        "start_level",
        "end_level"
      ],
      "properties": {
        "start_level": {
          "type": "integer",
          "minimum": 1,
          "maximum": 9,
          "description": "Starting TRL (must be <= end_level)"
        },
        "end_level": {
          "type": "integer",
          "minimum": 1,
          "maximum": 9,
          "description": "Ending TRL (must be >= start_level)"
        }
      }
    },
    "matching_funds_requirement": {
      "description": "Indicates if the opportunity requires matching funds from the applicant's institution.",
      "type": "boolean"
    },
    "reporting_requirements": {
      "description": "The requirements for interim and final reporting for funded projects.",
      "type": "string"
    },
    "scraping_metadata": {
      "description": "Metadata related to the scraping process.",
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "source_domain": {
            "description": "The domain of the source website. Must be a valid URI.",
            "type": "string",
            "format": "uri"
          },
          "source_page_url": {
            "description": "The URL of the source webpage. Must be a valid URI.",
            "type": "string",
            "format": "uri"
          },
          "data_collection_date": {
            "description": "The date when the data was collected. Must be in the ISO 8601 date-time format.",
            "type": "string",
            "format": "date-time"
          },
          "date_posted": {
            "description": "The date when the funding opportunity was posted. Must be in the YYYY-MM-DD format.",
            "type": "string",
            "format": "date"
          },
          "last_updated": {
            "description": "The date when the funding opportunity was last updated. Must be in the YYYY-MM-DD format or null if unknown.",
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "data_processor": {
            "description": "The LLM used for processing the data.",
            "type": "string"
          },
          "scraping_notes": {
            "description": "Additional notes about the scraping process.",
            "type": "string"
          },
          "legal_disclaimer": {
            "description": "The legal disclaimer associated with the scraped data.",
            "type": "string"
          }
        }
      }
    },
    "document_metadata": {
      "type": "object",
      "description": "Metadata describing the call document revision and provenance.",
      "required": [
        "version",
        "last_updated"
      ],
      "properties": {
        "version": {
          "type": "string",
          "description": "Semantic version of the source call document (e.g., 'v1.2')."
        },
        "last_updated": {
          "type": "string",
          "format": "date",
          "description": "Date when the call text was last updated according to the publisher."
        },
        "sources": {
          "type": "array",
          "description": "List of source documents or URLs referenced when compiling the opportunity.",
          "items": {
            "type": "object",
            "required": [
              "title",
              "url"
            ],
            "properties": {
              "title": {
                "type": "string",
                "description": "Human-readable name of the source."
              },
              "url": {
                "type": "string",
                "format": "uri",
                "description": "Direct link to the source material."
              }
            }
          }
        },
        "related_initiatives": {
          "type": "array",
          "description": "Referenced strategic initiatives this call aligns with (e.g., SET Plan, Mission Innovation).",
          "items": {
            "type": "string",
            "enum": [
              "SET_PLAN",
              "MI_GPFM",
              "NEB",
              "B4P",
              "OTHER"
            ]
          }
        }
      }
    },
    "call_process": {
      "type": "object",
      "description": "Structured representation of key call stages and their deadlines.",
      "properties": {
        "stages": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "name"
            ],
            "properties": {
              "name": {
                "type": "string",
                "enum": [
                  "pre_proposal",
                  "full_proposal",
                  "implementation",
                  "other"
                ],
                "description": "Stage identifier."
              },
              "activities": {
                "type": "string",
                "description": "Narrative summary of what happens during this stage."
              },
              "deadline": {
                "type": "string",
                "format": "date-time",
                "description": "Submission or action deadline associated with the stage."
              },
              "decision_window": {
                "type": "string",
                "description": "Text describing when applicants are notified (e.g., 'Jan 2026')."
              },
              "eligibility_notes": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "evaluation_criteria": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                }
              },
              "application_form_type": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "short-proposal",
                  "full-proposal",
                  "expression-of-interest",
                  "letter-of-intent",
                  "implementation-plan",
                  "business-plan",
                  "concept-note",
                  "pitch",
                  "other"
                ]
              },
              "invitation_required": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "true = only pre-selected applicants from previous stage may submit"
              }
            }
          }
        }
      }
    },
    "change_history": {
      "type": "array",
      "description": "Chronological list of notable changes communicated by the funder.",
      "items": {
        "type": "object",
        "required": [
          "date",
          "change_type",
          "summary"
        ],
        "properties": {
          "date": {
            "type": "string",
            "format": "date",
            "description": "Date the change was published."
          },
          "change_type": {
            "type": "string",
            "enum": [
              "funding_org",
              "requirement",
              "budget",
              "timeline",
              "other"
            ],
            "description": "Category of change."
          },
          "summary": {
            "type": "string",
            "description": "Short description of the change."
          }
        }
      }
    },
    "global_requirements": {
      "type": "array",
      "description": "Transnational requirements that apply to every applicant.",
      "items": {
        "type": "object",
        "required": [
          "requirement_type",
          "details"
        ],
        "properties": {
          "requirement_type": {
            "type": "string",
            "enum": [
              "consortium",
              "budget",
              "trl",
              "timeline",
              "documentation",
              "other"
            ],
            "description": "Classification of the requirement."
          },
          "details": {
            "type": "string",
            "description": "Full text of the requirement."
          },
          "enforced_by": {
            "type": "string",
            "description": "Body or authority enforcing the rule."
          }
        }
      }
    },
    "module_requirements": {
      "type": "array",
      "description": "Module-specific eligibility or compliance rules.",
      "items": {
        "type": "object",
        "required": [
          "requirement_type",
          "details"
        ],
        "properties": {
          "requirement_type": {
            "type": "string",
            "enum": [
              "consortium",
              "budget",
              "trl",
              "timeline",
              "documentation",
              "other"
            ],
            "description": "Classification of the requirement."
          },
          "details": {
            "type": "string",
            "description": "Full text of the requirement."
          },
          "enforced_by": {
            "type": "string",
            "description": "Body or authority enforcing the rule."
          },
          "module_code": {
            "type": "string",
            "description": "Identifier of the relevant call module."
          }
        }
      }
    },
    "funding_body_requirements": {
      "type": "array",
      "description": "Requirements issued by participating funding organisations.",
      "items": {
        "type": "object",
        "required": [
          "requirement_type",
          "details"
        ],
        "properties": {
          "requirement_type": {
            "type": "string",
            "enum": [
              "consortium",
              "budget",
              "trl",
              "timeline",
              "documentation",
              "other"
            ],
            "description": "Classification of the requirement."
          },
          "details": {
            "type": "string",
            "description": "Full text of the requirement."
          },
          "enforced_by": {
            "type": "string",
            "description": "Body or authority enforcing the rule."
          },
          "funding_body": {
            "type": "string",
            "description": "Name of the funding body publishing the rule."
          },
          "region": {
            "type": "string",
            "description": "Applicable country or sub-region."
          }
        }
      }
    },
    "call_modules": {
      "type": "array",
      "description": "Detailed descriptions for each call module in the opportunity.",
      "items": {
        "type": "object",
        "properties": {
          "module_code": {
            "type": "string",
            "description": "Short code such as 'CM2025-01'."
          },
          "module_identifier": {
            "type": "string",
            "description": "Persistent identifier for the module (e.g., DOI, URI, or internal UUID) to enable interoperability with award registries."
          },
          "module_title": {
            "type": "string",
            "description": "Human readable title for the module."
          },
          "aim": {
            "type": "string",
            "description": "High-level objective of the module."
          },
          "challenges": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Key challenges the module addresses."
          },
          "scope": {
            "type": "string",
            "description": "Description of what the module covers."
          },
          "target_topics": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Specific topics, themes, or innovation priorities."
          },
          "cross_cutting_dimensions": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "digitalisation",
                "fair_transition",
                "circularity",
                "regulation_market",
                "innovation_ecosystems",
                "robust_pathways",
                "other"
              ]
            },
            "description": "Non-technical dimensions emphasised in the module."
          },
          "expected_outcomes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "List of outcomes the funder expects."
          },
          "budget_guidance": {
            "type": "string",
            "description": "Narrative guidance describing module budgets or per-project ranges."
          },
          "module_budget_total": {
            "type": "integer",
            "minimum": 0,
            "description": "Total funding allocated to this module or sub-action (integer amount). If omitted, assume funds draw from the overall call total."
          },
          "module_min_project_budget": {
            "type": "integer",
            "minimum": 0,
            "description": "Minimum budget per project (integer amount) for this module when specified."
          },
          "module_max_project_budget": {
            "type": "integer",
            "minimum": 0,
            "description": "Maximum budget per project (integer amount) for this module when specified."
          },
          "module_budget_currency": {
            "type": "string",
            "pattern": "^[A-Z]{3}$",
            "description": "ISO 4217 currency code for the module-specific budget fields. Defaults to the opportunity currency if omitted."
          },
          "trl_guidance": {
            "type": "string",
            "description": "TRL expectations from the module text."
          },
          "related_initiatives": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "SET_PLAN",
                "MI_GPFM",
                "NEB",
                "B4P",
                "OTHER"
              ]
            },
            "description": "Initiatives explicitly linked to this module."
          },
          "module_relationships": {
            "type": "array",
            "description": "Relationships from this module to other modules, calls, or awards (e.g., CETP module hierarchy).",
            "items": {
              "type": "object",
              "required": [
                "relation_type",
                "target_module_identifier"
              ],
              "properties": {
                "relation_type": {
                  "type": "string",
                  "enum": [
                    "IsPartOf",
                    "HasPart",
                    "Requires"
                  ],
                  "description": "Relationship vocabulary aligned with DataCite/Crossref relationType values."
                },
                "target_module_identifier": {
                  "type": "string",
                  "description": "Identifier (DOI/URI/internal) of the related module or parent call."
                },
                "target_module_title": {
                  "type": "string",
                  "description": "Optional human-readable title of the related module for traceability."
                },
                "notes": {
                  "type": "string",
                  "description": "Additional context explaining the relationship."
                }
              }
            }
          },
          "opening_date": {
            "type": [
              "string",
              "null"
            ]
          },
          "deadline_date": {
            "type": [
              "string",
              "null"
            ]
          },
          "type_of_action": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "ria",
              "ria-ls",
              "ia",
              "ia-ls",
              "csa",
              "cofund",
              "ju-ria",
              "ju-ia",
              "ju-csa",
              "art-185",
              "eit-kic",
              "msca-dn",
              "msca-pf",
              "msca-se",
              "msca-cofund",
              "erc-stg",
              "erc-cog",
              "erc-adg",
              "erc-poc",
              "erc-sg",
              "eic-pathfinder",
              "eic-transition",
              "eic-accelerator",
              "eic-acc-bf",
              "other",
              "not-specified"
            ]
          },
          "indicative_number_of_grants": {
            "type": [
              "integer",
              "null"
            ]
          },
          "contributions_min": {
            "type": [
              "integer",
              "null"
            ]
          },
          "contributions_max": {
            "type": [
              "integer",
              "null"
            ]
          },
          "stage_model": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "single-stage",
              "two-stage",
              "not-specified"
            ]
          },
          "module_ref": {
            "type": [
              "string",
              "null"
            ],
            "description": "Cross-reference key matching a per_action_budget entry. Use the module_code value."
          },
          "trl_start": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "maximum": 9
          },
          "trl_end": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "maximum": 9
          },
          "sub_themes": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "theme_code": {
                  "type": "string"
                },
                "theme_title": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                }
              }
            }
          },
          "module_funding_agencies": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "agency_name"
              ],
              "additionalProperties": false,
              "properties": {
                "agency_name": {
                  "type": "string"
                },
                "agency_role": {
                  "type": "string",
                  "enum": [
                    "primary-funder",
                    "co-funder",
                    "managing-organization",
                    "not-specified"
                  ]
                },
                "contribution_amount": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "contribution_currency": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "country_code": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "ISO 3166-1 alpha-2 — national agency country"
                },
                "ror_id": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "national_call_id": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "National agency's own call reference (e.g. FORMAS 2025-01234, DFG SPP 2402)."
                }
              }
            }
          },
          "module_national_requirements": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "country_code",
                "requirement_type",
                "details"
              ],
              "additionalProperties": false,
              "properties": {
                "country_code": {
                  "type": "string",
                  "description": "ISO 3166-1 alpha-2"
                },
                "funding_body": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "requirement_type": {
                  "type": "string",
                  "enum": [
                    "eligibility",
                    "co-funding",
                    "counterpart-funding",
                    "reporting",
                    "language",
                    "consortium-composition",
                    "procurement",
                    "national-contact",
                    "other"
                  ]
                },
                "details": {
                  "type": "string"
                },
                "national_call_id": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "National agency's own call reference (e.g. FORMAS 2025-01234). Critical for ERA-NET applicants."
                },
                "national_submission_url": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "URL of national agency's submission portal."
                },
                "national_deadline": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "National agency deadline (ISO 8601). Often differs from joint call deadline."
                },
                "contact_email": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "contact_url": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              }
            }
          }
        },
        "allOf": [
          {
            "if": {
              "properties": {
                "module_relationships": {
                  "type": "array",
                  "minItems": 1
                }
              },
              "required": [
                "module_relationships"
              ]
            },
            "then": {
              "required": [
                "module_identifier"
              ]
            }
          },
          {
            "if": {
              "anyOf": [
                {
                  "required": [
                    "module_budget_total"
                  ]
                },
                {
                  "required": [
                    "module_min_project_budget"
                  ]
                },
                {
                  "required": [
                    "module_max_project_budget"
                  ]
                }
              ]
            },
            "then": {
              "properties": {
                "module_budget_currency": {
                  "type": "string"
                }
              }
            }
          }
        ]
      }
    },
    "timeline": {
      "type": "object",
      "properties": {
        "milestones": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "name",
              "date"
            ],
            "properties": {
              "name": {
                "type": "string",
                "enum": [
                  "info_event",
                  "launch",
                  "submission_open",
                  "submission_deadline",
                  "selection",
                  "project_start",
                  "other"
                ],
                "description": "Milestone label."
              },
              "date": {
                "type": "string",
                "format": "date",
                "description": "Date of the milestone."
              },
              "description": {
                "type": "string",
                "description": "Narrative describing the milestone."
              },
              "stage": {
                "type": "string",
                "description": "Stage the milestone is associated with."
              }
            }
          }
        },
        "time_zone": {
          "type": "string",
          "description": "Time zone reference for deadlines (e.g., 'CET')."
        }
      }
    },
    "participating_regions": {
      "type": "array",
      "description": "Participating countries/regions and their funding bodies.",
      "items": {
        "type": "object",
        "required": [
          "country",
          "funding_body"
        ],
        "properties": {
          "country": {
            "type": "string",
            "pattern": "^[A-Z]{2}$",
            "description": "ISO 3166-1 alpha-2 country code."
          },
          "region": {
            "type": "string",
            "description": "Specific state/region (if applicable)."
          },
          "funding_body": {
            "type": "string",
            "description": "Name of the participating organisation."
          },
          "status": {
            "type": "string",
            "enum": [
              "confirmed",
              "tbc",
              "withdrawn"
            ],
            "description": "Participation status as stated by the funder."
          },
          "contact": {
            "type": "string",
            "description": "Email or phone for enquiries."
          },
          "website": {
            "type": "string",
            "format": "uri",
            "description": "Funding body or call-specific URL."
          }
        }
      }
    },
    "grant_doi": {
      "type": [
        "string",
        "null"
      ],
      "format": "uri",
      "pattern": "^https://doi\\.org/10\\.55099/.*$",
      "description": "Crossref Grants Registry DOI (prefix 10.55099) for DOI-registered grants. Distinct from funder_registry_id which uses prefix 10.13039."
    },
    "crossref_grant_type": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "research-grant",
        "infrastructure",
        "article-processing-charge",
        "book-processing-charge",
        "fellowship",
        "studentship",
        "contract",
        "prize",
        "other"
      ],
      "description": "Crossref Grants Schema v0.2.0 grant_type vocabulary. Only for Crossref-registered grants."
    },
    "deadline_model": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "single-stage",
        "two-stage",
        "cascade",
        "fpa-sga",
        "rolling",
        "cut-off",
        "not-specified"
      ],
      "description": "Submission model. two-stage=pre-proposal+full proposal; fpa-sga=Framework Partnership Agreement+annual Specific Grant Agreements; cut-off=EIC Accelerator batch evaluation; rolling=continuous submission."
    },
    "funding_program": {
      "type": [
        "object",
        "null"
      ],
      "description": "Parent funding scheme or programme under which this call is issued.",
      "additionalProperties": false,
      "properties": {
        "name": {
          "type": "string"
        },
        "acronym": {
          "type": [
            "string",
            "null"
          ]
        },
        "program_code": {
          "type": [
            "string",
            "null"
          ],
          "description": "e.g. HORIZON-CL4-2025, NIH-R01, MSCA-PF-2025"
        },
        "program_url": {
          "type": [
            "string",
            "null"
          ],
          "format": "uri"
        },
        "program_type": {
          "type": "string",
          "enum": [
            "framework-programme",
            "erc",
            "msca",
            "eit-kic",
            "eic",
            "joint-undertaking",
            "mission",
            "co-funded-partnership",
            "co-programmed-partnership",
            "institutionalised-partnership",
            "era-net",
            "era-net-cofund",
            "ejp-cofund",
            "jpi",
            "national-programme",
            "bilateral-programme",
            "multilateral-programme",
            "south-south-cooperation",
            "triangular-cooperation",
            "regional-programme",
            "oda-research-partnership",
            "development-finance",
            "trust-fund",
            "foundation-programme",
            "euratom",
            "digital-europe",
            "other",
            "not-specified"
          ]
        },
        "partnership_name": {
          "type": [
            "string",
            "null"
          ],
          "description": "EIT/Partnership name if applicable, e.g. EIT-Climate-KIC"
        },
        "partnership_type": {
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "co-funded",
            "co-programmed",
            "institutionalised",
            "not-specified",
            null
          ]
        },
        "thematic_tags": {
          "type": [
            "array",
            "null"
          ],
          "items": {
            "type": "string"
          },
          "description": "Programme-level thematic or disease-area focus (e.g. 'rare-diseases', 'soil-health', 'alzheimers'). Used for EJP Cofund, JPI, mission-specific constraints."
        },
        "ec_grant_agreement_number": {
          "type": [
            "string",
            "null"
          ],
          "description": "EC grant number for ERA-NET Cofund programmes (e.g. '101007299')."
        }
      }
    },
    "rolling_opportunity_details": {
      "type": [
        "object",
        "null"
      ],
      "description": "Validity metadata for rolling/always-open opportunities.",
      "additionalProperties": false,
      "properties": {
        "validity_period_start": {
          "type": [
            "string",
            "null"
          ]
        },
        "validity_period_end": {
          "type": [
            "string",
            "null"
          ],
          "description": "Program end / funding cut-off date"
        },
        "acceptance_pattern": {
          "type": "string",
          "enum": [
            "continuous",
            "rolling-with-rounds",
            "first-come-first-served",
            "yearly-rolling",
            "until-funds-exhausted",
            "not-specified"
          ]
        },
        "covered_fiscal_years": {
          "type": [
            "array",
            "null"
          ],
          "items": {
            "type": "string"
          },
          "description": "e.g. ['2024-2025', '2025-2026']"
        },
        "funds_exhausted_possible": {
          "type": [
            "boolean",
            "null"
          ]
        },
        "rolling_period_note": {
          "type": [
            "string",
            "null"
          ]
        }
      }
    },
    "sdg_goals": {
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": "integer",
        "minimum": 1,
        "maximum": 17
      },
      "description": "UN Sustainable Development Goals 1-17 that this opportunity addresses."
    },
    "trl_start": {
      "type": [
        "integer",
        "null"
      ],
      "minimum": 1,
      "maximum": 9,
      "description": "Technology Readiness Level at project start as specified in call (1=basic research, 9=production-proven)."
    },
    "trl_end": {
      "type": [
        "integer",
        "null"
      ],
      "minimum": 1,
      "maximum": 9,
      "description": "Target Technology Readiness Level at project end."
    },
    "grant_payment_model": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "cost-reimbursement",
        "lump-sum",
        "unit-cost",
        "flat-rate",
        "blended",
        "not-specified"
      ],
      "description": "lump-sum=fixed budget, no cost reporting (HORIZON-RIA-LS/HORIZON-IA-LS); cost-reimbursement=actual costs submitted and verified."
    },
    "gender_equality_plan_required": {
      "type": [
        "boolean",
        "null"
      ],
      "description": "Mandatory eligibility criterion for HES/REC/PUB applicants in Horizon Europe since 2022."
    },
    "ethics_self_assessment_required": {
      "type": [
        "boolean",
        "null"
      ]
    },
    "open_software_required": {
      "type": [
        "boolean",
        "null"
      ],
      "description": "EC 2025-2027 WP open software mandate."
    },
    "fair_data_required": {
      "type": [
        "boolean",
        "null"
      ],
      "description": "FAIR data principles compliance — distinct from data_management_plan_required."
    },
    "official_opportunity_number": {
      "type": [
        "string",
        "null"
      ],
      "description": "Official agency-assigned identifier: NIH FOA (PA-25-123, RFA-CA-25-001), NSF solicitation (NSF 25-501), Grants.gov number. Distinct from ResearchArk's synthetic opportunity_id."
    },
    "assistance_listing_number": {
      "type": [
        "string",
        "null"
      ],
      "description": "US federal Assistance Listings (CFDA) number (e.g. '93.853'). Required on all US federal grant awards."
    },
    "nationality_restriction": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "none",
        "funding-country-nationality-required",
        "institution-affiliation-required",
        "permanent-residency-accepted",
        "not-specified"
      ],
      "description": "Nationality/affiliation constraints — for funders like NSFC, NRF, DBT that require PI nationality to match funder country."
    },
    "counterpart_funding_required": {
      "type": [
        "boolean",
        "null"
      ]
    },
    "counterpart_funding_percentage": {
      "type": [
        "number",
        "null"
      ],
      "description": "Required counterpart as % of total project cost (e.g. 30 for 30%)."
    },
    "counterpart_funding_type": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "cash",
        "in-kind",
        "cash-or-in-kind",
        "not-specified"
      ]
    },
    "disbursement_model": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "lump-sum",
        "tranche-based",
        "reimbursement",
        "advance-with-reporting",
        "dli-based",
        "not-specified"
      ]
    },
    "arkid_extensions": {
      "type": [
        "object",
        "null"
      ],
      "description": "ARKID platform-specific extensions — not part of the canonical v4.5.0 schema.",
      "additionalProperties": false,
      "properties": {
        "arkf_id": {
          "type": [
            "string",
            "null"
          ]
        },
        "linked_projects": {
          "type": [
            "array",
            "null"
          ],
          "items": {
            "type": "string"
          }
        },
        "linked_ideas": {
          "type": [
            "array",
            "null"
          ],
          "items": {
            "type": "string"
          }
        },
        "ec_template_version": {
          "type": [
            "string",
            "null"
          ]
        },
        "ec_proposal": {
          "type": [
            "object",
            "null"
          ]
        }
      }
    }
  },
  "required": [
    "opportunity_id",
    "title",
    "opportunity_url"
  ],
  "allOf": [
    {
      "description": "Currency validation: If any monetary field has an integer value, currency must be specified. String values like 'unknown' or 'undisclosed' do not require currency.",
      "if": {
        "anyOf": [
          {
            "required": [
              "total_funding_available"
            ],
            "properties": {
              "total_funding_available": {
                "type": "integer"
              }
            }
          },
          {
            "required": [
              "award_amount"
            ],
            "properties": {
              "award_amount": {
                "type": "integer"
              }
            }
          },
          {
            "required": [
              "minimum_award_amount"
            ],
            "properties": {
              "minimum_award_amount": {
                "type": "integer"
              }
            }
          },
          {
            "required": [
              "maximum_award_amount"
            ],
            "properties": {
              "maximum_award_amount": {
                "type": "integer"
              }
            }
          }
        ]
      },
      "then": {
        "required": [
          "currency"
        ]
      }
    }
  ]
}
