{
  "openapi": "3.0.1",
  "info": {
    "title": "EU EV Charging Graph - DE + FR + ES charge points by EVSE ID",
    "description": "Homogeneous inventory of public EV charge points from the official registers of Germany, France and Spain, keyed by EVSE ID, with operator normalisation, quality flags and a change history (new / changed / removed) the sources do not keep.",
    "version": "0.1",
    "x-build-id": "VmJTOVgnKvw25pnNP"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rastriq~eu-ev-charging-graph/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rastriq-eu-ev-charging-graph",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/rastriq~eu-ev-charging-graph/runs": {
      "post": {
        "operationId": "runs-sync-rastriq-eu-ev-charging-graph",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/rastriq~eu-ev-charging-graph/run-sync": {
      "post": {
        "operationId": "run-sync-rastriq-eu-ev-charging-graph",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "snapshot",
              "delta",
              "preloaded"
            ],
            "type": "string",
            "description": "<b>Snapshot</b>: every charge point in scope, flagged new / changed / unchanged / removed against your last run. <b>Delta</b> (default when empty): only what changed; the first run is a full <code>baseline</code>. <b>Preloaded</b>: instant, cheaper copy of the latest full DE+FR+ES snapshot published by the author (no change history, always EVSE level)."
          },
          "countries": {
            "title": "Countries",
            "type": "array",
            "description": "Registers to read. Empty = all three. Germany is about 209,000 charge points, France about 225,000 rows (168,000 distinct EVSE IDs), Spain about 35,500.",
            "items": {
              "type": "string",
              "enum": [
                "DE",
                "FR",
                "ES"
              ],
              "enumTitles": [
                "Germany - Bundesnetzagentur Ladesäulenregister",
                "France - IRVE base nationale (data.gouv.fr)",
                "Spain - DGT NAP (DATEX II)"
              ]
            }
          },
          "includeConnectors": {
            "title": "One row per charge point (EVSE)",
            "type": "boolean",
            "description": "On (default): one row per EVSE / charge point. Off: one row per station, with <code>evse_count</code>, the highest <code>power_kw</code> and the union of connector types.",
            "default": true
          },
          "operators": {
            "title": "Operators",
            "type": "array",
            "description": "Optional. Operator name (matched on the normalised name: ignores case, accents, punctuation and legal form, so <code>Tesla</code> = <code>Tesla Germany GmbH</code> = <code>TESLA France SARL</code>) or the 5-character EVSE operator prefix (<code>DEENB</code>, <code>FRFR1</code>). Empty = all operators.",
            "items": {
              "type": "string"
            }
          },
          "minPowerKw": {
            "title": "Minimum power (kW)",
            "minimum": 0,
            "type": "number",
            "description": "Optional. Keep charge points with at least this power (e.g. <code>50</code> for DC fast charging). Points without a published power are excluded when this is set."
          },
          "postalCodes": {
            "title": "Postal codes",
            "type": "array",
            "description": "Optional. Full postal codes or prefixes (<code>28</code> = Madrid province, <code>10115</code> = Berlin Mitte, <code>75</code> = Paris). Empty = all.",
            "items": {
              "type": "string"
            }
          },
          "excludeFlags": {
            "title": "Exclude rows with quality flags",
            "type": "array",
            "description": "Optional. Rows are never dropped by default: problems are only <b>flagged</b> in <code>quality_flags</code>. Pick flags here to leave those rows out of the output (and out of your bill). Typical: <code>missing_evse_id</code> (about 143,000 German points have no EVSE ID in the register) and <code>duplicate_evse_secondary</code> (the French base repeats about 57,000 EVSE IDs published by different producers: this flag is only on the extra copies, so one row per ID is kept; <code>duplicate_evse</code> would remove every copy, including the first).",
            "items": {
              "type": "string",
              "enum": [
                "missing_evse_id",
                "duplicate_evse",
                "duplicate_evse_secondary",
                "invalid_evse_format",
                "coords_out_of_country",
                "missing_coordinates",
                "power_outlier",
                "operator_possibly_natural_person"
              ],
              "enumTitles": [
                "No EVSE ID in the source",
                "EVSE ID appears more than once in the same source (drops ALL copies, including the primary one)",
                "Secondary copies of a repeated EVSE ID (keeps one row per ID - recommended)",
                "EVSE ID fails the eMI3 pattern",
                "Coordinates outside the country",
                "No usable coordinates",
                "Power outside 1-1000 kW",
                "Operator name may be a private person (heuristic)"
              ]
            }
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many rows (0 = no limit). A truncated first run does not save state.",
            "default": 0
          },
          "stateKey": {
            "title": "State key (advanced)",
            "type": "string",
            "description": "Name of your delta stream. Runs sharing the same key compare against each other. By default the stream is derived from countries, level and filters, so different setups keep separate histories. With an explicit key, the operator / power / postal-code / exclude-flag filters are still part of the stream name, and changing <i>countries</i> or <i>One row per charge point</i> starts a new baseline (a note in RUN_SUMMARY says so)."
          },
          "allowMassChange": {
            "title": "Allow mass change (advanced)",
            "type": "boolean",
            "description": "Safety net for <i>Delta</i>: if more than 10% of a country's records are new, changed or removed in one run, the run stops with <code>status: mass_change</code> (nothing emitted, state not updated) because that usually means a broken source file. Tick this only if you expect such a change.",
            "default": false
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}