Skip to content

API Reference

Base URL: http://localhost:8000/api/v1

Interactive documentation is available at http://localhost:8000/docs (Swagger UI) and http://localhost:8000/redoc (ReDoc).


Technology Catalogue

Method Path Description
GET /technologies List all technologies (paginated, filterable)
GET /technologies/{id} Full technology detail with all instances
GET /technologies/category/{cat} Filter by category
GET /technologies/{id}/instances All equipment instances for a technology
GET /technologies/{id}/instances/{iid} One specific equipment instance

Valid category values: generation · storage · transmission · conversion

Query parameters (list / category endpoints):

Parameter Type Description Default
skip int Pagination offset 0
limit int Max results (max 200) 50
tag string Filter by tag string
lifecycle string Filter by stage: commercial, projection, demonstration, retired

Framework Adapters

Method Path Description
GET /adapt/pypsa/{id} PyPSA-ready parameter dict (capital_cost annualised via CRF)
GET /adapt/calliope/{id} Calliope-ready config dict (essentials + constraints + costs)
GET /technologies/calliope All technologies as a Calliope techs: block
GET /technologies/calliope?category=generation Filtered Calliope block
GET /technologies/{id}/calliope Single technology in Calliope format
POST /technologies/{id}/calliope Single technology + constraint/cost overrides

PyPSA query parameters: instance_index (int, default 0), discount_rate (float, default 0.07)

Calliope query parameters: instance_index (int, default 0), cost_class (str, default "monetary")


Time-Series Catalogue

Method Path Description
GET /timeseries Paginated list of profile metadata
GET /timeseries/{id}/data Full hourly data array for one profile
POST /timeseries/submit Contributor upload (requires Bearer JWT)
GET /admin/timeseries/submissions List pending submissions (admin only)
PATCH /admin/timeseries/{id}/approve Approve a submission (admin only)

Timeseries query parameters: skip (int), limit (int), type (string), location (string)


Authentication

Method Path Description
GET /auth/orcid Redirect to ORCID OAuth login page
GET /auth/orcid/callback OAuth callback; exchanges code for JWT, redirects to frontend
GET /auth/me Validate Bearer JWT and return user profile

Scraper Pipeline (admin only)

Method Path Description
GET /scraper/status Scheduler state, enabled sources, candidate counts, last run
POST /scraper/run Manually trigger a pipeline run (background or sync)
GET /scraper/candidates List scraper candidates (filter by status, tech)
GET /scraper/candidates/{id} Full candidate detail with extracted parameters
POST /scraper/candidates/{id}/approve Approve candidate and merge into catalogue
POST /scraper/candidates/{id}/reject Reject candidate and archive

Candidate query parameters: status (pending, approved, rejected), technology_id (string)


Diagnostics

Method Path Description
GET /debug/data Inspect loading status of all JSON files
POST /debug/reload Clear LRU cache and reload all files from disk
GET http://localhost:8000/health Service health check + version info

Response examples

GET /technologies/ccgt

{
  "technology_id": "ccgt",
  "technology_name": "Combined Cycle Gas Turbine (CCGT)",
  "domain": "generation",
  "carrier": "natural_gas",
  "oeo_class": "OEO_00000044",
  "oeo_uri": "http://openenergy-platform.org/ontology/oeo/OEO_00000044",
  "description": "High-efficiency gas-fired power plant combining gas and steam turbines.",
  "instances": [
    {
      "instance_id": "ccgt_800mw_current",
      "instance_name": "CCGT – 800 MW (Current, 2024)",
      "typical_capacity_mw": 800,
      "capex_usd_per_kw": 900,
      "opex_fixed_usd_per_kw_yr": 20.0,
      "opex_var_usd_per_mwh": 3.5,
      "efficiency_percent": 58.0,
      "lifetime_years": 30,
      "co2_emission_factor_operational_g_per_kwh": 202,
      "ramping_rate_percent_per_min": 8.0,
      "reference_source": "NREL ATB 2023"
    }
  ]
}

GET /adapt/pypsa/ccgt?discount_rate=0.07

{
  "technology_id": "ccgt",
  "instance_index": 0,
  "component_type": "Generator",
  "parameters": {
    "carrier": "natural_gas",
    "efficiency": 0.58,
    "capital_cost": 12500.4,
    "marginal_cost": 3.5,
    "co2_emissions": 0.202,
    "lifetime": 30
  }
}

GET /adapt/calliope/ccgt

{
  "ccgt": {
    "essentials": {
      "name": "Combined Cycle Gas Turbine (CCGT)",
      "color": "#999",
      "carrier_in": "natural_gas",
      "carrier_out": "electricity",
      "parent": "supply"
    },
    "constraints": {
      "energy_eff": 0.58,
      "energy_cap_max": 800000,
      "energy_ramping": 0.08
    },
    "costs": {
      "monetary": {
        "interest_rate": 0.07,
        "energy_cap": 900,
        "om_annual": 20.0,
        "om_prod": 0.0035
      }
    }
  }
}

GET /timeseries

{
  "total": 24,
  "profiles": [
    {
      "profile_id": "de_solar_pv_utility_cf_2019",
      "name": "Germany Solar PV Utility CF 2019",
      "type": "capacity_factor",
      "resolution": "1h",
      "location": "DE",
      "carrier": "solar",
      "year": 2019,
      "n_timesteps": 8760,
      "source": "Renewables.ninja / ERA5"
    }
  ]
}

GET /scraper/status

{
  "scheduler_running": true,
  "next_run": "2026-06-01T02:00:00Z",
  "enabled_sources": ["open_alex", "semantic_scholar", "nrel_atb", "crossref"],
  "pending_candidates": 12,
  "last_run": {
    "run_id": "a1b2c3d4",
    "started_at": "2026-05-15T02:00:00Z",
    "status": "completed",
    "total_papers": 347,
    "candidates_created": 18
  }
}