{
  "openapi": "3.0.0",
  "info": {
    "version": "2.0.4",
    "title": "Verzoeksroutering",
    "description": "Een API voor verzoeksroutering, waaronder het bepalen van de bevoegd gezagen voor het indienen van verzoeken.",
    "contact": {
      "name": "Ontwikkelaarsportaal Omgevingswet",
      "url": "https://developer.omgevingswet.overheid.nl/services/contact/"
    }
  },
  "paths": {
    "/": {
      "get": {
        "summary": "OpenApi Specification",
        "tags": [
          "Meta"
        ],
        "responses": {
          "200": {
            "description": "OpenApi Specification Json",
            "content": {
              "application/json": {
                "schema": {
                  "example": "{\"openapi\": \"3.0.0\", ... }"
                }
              }
            }
          }
        }
      }
    },
    "/health": {
      "get": {
        "summary": "health info",
        "tags": [
          "Meta"
        ],
        "responses": {
          "200": {
            "description": "Health",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "status"
                  ],
                  "properties": {
                    "status": {
                      "type": "string",
                      "enum": [
                        "UP"
                      ]
                    },
                    "groups": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Health",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "status"
                  ],
                  "properties": {
                    "status": {
                      "type": "string",
                      "enum": [
                        "DOWN",
                        "OUT_OF_SERVICE"
                      ]
                    },
                    "groups": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/info": {
      "get": {
        "summary": "applicatie info",
        "tags": [
          "Meta"
        ],
        "responses": {
          "200": {
            "description": "Info",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Info",
                  "required": [
                    "app"
                  ],
                  "properties": {
                    "app": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "version": {
                          "type": "string"
                        },
                        "version2": {
                          "type": "string"
                        },
                        "buildtime": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/bevoegdgezag/_bepalen": {
      "post": {
        "summary": "Het bepalen van de bevoegd gezagen voor de activiteiten, opgedeeld per verzoek.",
        "parameters": [
          {
            "$ref": "#/components/parameters/crs"
          },
          {
            "$ref": "#/components/parameters/x_api_key"
          }
        ],
        "responses": {
          "200": {
            "description": "Verzoeken met bijbehorend bevoegd gezag, gesorteerd op prioriteit.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Verzoek"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "500": {
            "$ref": "#/components/responses/500"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BepalenBevoegdGezagRequest"
              }
            }
          },
          "description": "Request body met de benodigde gegevens voor het bepalen van het bevoegd gezag.",
          "required": true
        }
      }
    },
    "/behandeldienst/_bepalen": {
      "post": {
        "summary": "Het bepalen van de behandeldienst voor de activiteiten van een verzoek. Indien er geen behandeldienst gevonden kan worden zal een 404 geretourneerd worden.",
        "parameters": [
          {
            "$ref": "#/components/parameters/crs"
          },
          {
            "$ref": "#/components/parameters/x_api_key"
          }
        ],
        "responses": {
          "200": {
            "description": "De behandeldienst waar het verzoek naar gestuurd moet worden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Behandeldienst"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "500": {
            "$ref": "#/components/responses/500"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BepalenBehandeldienstRequest"
              }
            }
          },
          "description": "Request body met de benodigde gegevens voor het bepalen van de behandeldienst",
          "required": true
        }
      }
    },
    "/conceptverzoek/_bepalen": {
      "post": {
        "summary": "Het bepalen of een conceptverzoek is toegestaan voor de activiteiten van een verzoek.",
        "parameters": [
          {
            "$ref": "#/components/parameters/crs"
          },
          {
            "$ref": "#/components/parameters/x_api_key"
          }
        ],
        "responses": {
          "200": {
            "description": "De uitkomst van de conceptverzoek bepaling.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Conceptverzoek"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "500": {
            "$ref": "#/components/responses/500"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BepalenConceptverzoekRequest"
              }
            }
          },
          "description": "Request body met de benodigde gegevens voor het bepalen of conceptverzoek is toegestaan.",
          "required": true
        }
      }
    }
  },
  "components": {
    "parameters": {
      "x_api_key": {
        "name": "x-api-key",
        "in": "header",
        "description": "De api-key ter authenticatie, verkrijgbaar via het ontwikkelaarsportaal",
        "required": false,
        "schema": {
          "type": "string"
        }
      },
      "crs": {
        "name": "Content-Crs",
        "in": "header",
        "description": "Het coordinatenstelsel (Coordinate Reference Systems) waarop geometrie parameters in het request zijn gebaseerd",
        "required": false,
        "schema": {
          "type": "string",
          "enum": [
            "EPSG:28992"
          ],
          "default": "EPSG:28992"
        }
      }
    },
    "responses": {
      "400": {
        "description": "Fouten (missing parameter; niet bestaande parameter; invalide waarde voor parameter)",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "required": [
                    "type",
                    "title",
                    "status"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "description": "Het type fout dat opgetreden is. Bijvoorbeeld VALIDATIE_FOUT of ONVERWACHTE_FOUT."
                    },
                    "title": {
                      "type": "string",
                      "description": "Informatie over de opgetreden fout."
                    },
                    "status": {
                      "type": "integer",
                      "format": "int64",
                      "description": "De statuscode van de fout (= 400) overeenkomend met de http-status code van de response."
                    },
                    "detail": {
                      "type": "string",
                      "description": "Meer detail informatie over de opgetreden fout"
                    },
                    "instance": {
                      "type": "string",
                      "description": "Het unieke instance id van het request dat resulteerde in de foutmelding."
                    }
                  }
                },
                {
                  "properties": {
                    "invalid-params": {
                      "type": "array",
                      "items": {
                        "required": [
                          "type",
                          "name",
                          "reason"
                        ],
                        "properties": {
                          "type": {
                            "type": "string",
                            "description": "Een type van de fout, bijvoorbeeld 'Validatie melding'"
                          },
                          "name": {
                            "type": "string",
                            "description": "'Naam van de parameter die een fout bevat, bijvoorbeeld: activiteitFunctioneleStructuurRef'"
                          },
                          "reason": {
                            "type": "string",
                            "description": "Bijvoorbeeld 'de activiteitFunctioneleStructuurRef mag geen speciale karakters bevatten.'"
                          }
                        }
                      }
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "404": {
        "description": "De gevraagde resource is niet gevonden",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "required": [
                    "type",
                    "title",
                    "status"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "description": "Het type resource dat niet gevonden is."
                    },
                    "title": {
                      "type": "string",
                      "description": "Informatie over de opgetreden fout."
                    },
                    "status": {
                      "type": "integer",
                      "format": "int64",
                      "description": "De statuscode van de fout (= 404) overeenkomend met de http-status code van de response."
                    },
                    "detail": {
                      "type": "string",
                      "description": "Meer detail informatie over de opgetreden fout"
                    },
                    "instance": {
                      "type": "string",
                      "description": "Het unieke instance id van het request dat resulteerde in de foutmelding."
                    }
                  }
                },
                {
                  "properties": {
                    "type": {
                      "type": "string",
                      "description": "Bevat informatie over het type object dat niet gevonden is. Bijvoorbeeld ACTIVITY_NOT_FOUND of SUBACTIVITY_NOT_FOUND"
                    },
                    "detail": {
                      "type": "string",
                      "description": "De identifier van het object dat niet gevonden is. Bijvoorbeeld de URN van een activiteit."
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "500": {
        "description": "Er is een onverwachte technische fout opgetreden",
        "content": {
          "application/json": {
            "schema": {
              "required": [
                "type",
                "title",
                "status"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "description": "Het type fout dat opgetreden is. Bijvoorbeeld VALIDATIE_FOUT of ONVERWACHTE_FOUT."
                },
                "title": {
                  "type": "string",
                  "description": "Informatie over de opgetreden fout."
                },
                "status": {
                  "type": "integer",
                  "format": "int64",
                  "description": "De statuscode (= 500) van de fout overeenkomend met de http-status code van de response."
                },
                "detail": {
                  "type": "string",
                  "description": "Meer detail informatie over de opgetreden fout"
                },
                "instance": {
                  "type": "string",
                  "description": "Het unieke instance id van het request dat resulteerde in de foutmelding."
                }
              }
            }
          }
        }
      }
    },
    "schemas": {
      "BepalenBevoegdGezagRequest": {
        "required": [
          "activiteiten",
          "_geo"
        ],
        "properties": {
          "activiteiten": {
            "description": "Activiteiten waarvoor het bevoegd gezag moet worden bepaald, opgedeeld per verzoek, met eventueel subactiviteiten.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ActiviteitMetSubactiviteiten"
            },
            "minItems": 1,
            "maxItems": 100
          },
          "_geo": {
            "$ref": "#/components/schemas/GeoQuery"
          },
          "datum": {
            "description": "Het verzoek wordt uitgevoerd met de versie van de activiteiten die geldig zijn op deze datum. Indien geen datum meegegeven wordt het verzoek uitgevoerd tegen de op dit moment geldende activiteiten. Het formaat van de datum is dd-MM-yyyy",
            "allOf": [
              {
                "$ref": "#/components/schemas/Datum"
              }
            ]
          }
        }
      },
      "ActiviteitMetSubactiviteiten": {
        "required": [
          "functioneleStructuurRef",
          "subFunctioneleStructuurRefs"
        ],
        "properties": {
          "functioneleStructuurRef": {
            "description": "De verwijzing naar een regelbeheerobject van een geselecteerde activiteit in de functionele structuur in de Registratie Toepasbare Regels.",
            "type": "string"
          },
          "subFunctioneleStructuurRefs": {
            "deprecated": true,
            "description": "Verwijzing naar regelbeheerobjecten van geselecteerde subactiviteiten in de functionele structuur in de Registratie Toepasbare Regels. Voor verfijnbare activiteiten dient de lijst minimaal 1 item bevatten. Voor niet-verfijnbare activiteiten dient de lijst leeg te zijn. Deprecated omdat de verfijnbaar functionaliteit deprecated is.",
            "type": "array",
            "items": {
              "type": "string"
            },
            "maxItems": 100
          }
        }
      },
      "BepalenBehandeldienstRequest": {
        "required": [
          "bevoegdGezagOin",
          "activiteiten",
          "_geo"
        ],
        "properties": {
          "bevoegdGezagOin": {
            "description": "Het bevoegd gezag dat is geselecteerd bij het verzoek",
            "type": "string"
          },
          "activiteiten": {
            "description": "Activiteiten waarvoor de behandeldienst moet worden bepaald",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ActiviteitMetSubactiviteiten"
            },
            "minItems": 1,
            "maxItems": 100
          },
          "_geo": {
            "$ref": "#/components/schemas/GeoQuery"
          },
          "datum": {
            "description": "Het verzoek wordt uitgevoerd met de versie van de activiteiten die geldig zijn op deze datum. Indien geen datum meegegeven wordt het verzoek uitgevoerd tegen de op dit moment geldende activiteiten. Het formaat van de datum is dd-MM-yyyy",
            "allOf": [
              {
                "$ref": "#/components/schemas/Datum"
              }
            ]
          }
        }
      },
      "BepalenConceptverzoekRequest": {
        "required": [
          "bevoegdGezagOin",
          "activiteiten",
          "_geo"
        ],
        "properties": {
          "bevoegdGezagOin": {
            "description": "Het bevoegd gezag dat is geselecteerd bij het verzoek",
            "type": "string"
          },
          "activiteiten": {
            "description": "Activiteiten waarvoor het conceptverzoek moet worden bepaald",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ActiviteitMetSubactiviteiten"
            },
            "minItems": 1,
            "maxItems": 100
          },
          "_geo": {
            "$ref": "#/components/schemas/GeoQuery"
          },
          "datum": {
            "description": "Het verzoek wordt uitgevoerd met de versie van de activiteiten die geldig zijn op deze datum. Indien geen datum meegegeven wordt het verzoek uitgevoerd tegen de op dit moment geldende activiteiten. Het formaat van de datum is dd-MM-yyyy",
            "allOf": [
              {
                "$ref": "#/components/schemas/Datum"
              }
            ]
          }
        }
      },
      "Verzoek": {
        "description": "Verzoek bestaande uit 1 of meerdere activiteiten, bedoeld voor 1 bevoegd gezag.",
        "required": [
          "toestemming",
          "bevoegdGezagen",
          "activiteiten"
        ],
        "properties": {
          "toestemming": {
            "$ref": "#/components/schemas/ToestemmingResponse"
          },
          "bevoegdGezagen": {
            "description": "Bevoegd gezagen waar het verzoek heen gestuurd kan worden",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BevoegdGezag"
            }
          },
          "activiteiten": {
            "description": "Activiteiten die gegroepeerd zijn in dit verzoek, in onbepaalde volgorde.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Activiteit"
            }
          }
        }
      },
      "BevoegdGezag": {
        "description": "Een bevoegd gezag",
        "required": [
          "oin",
          "naam",
          "bestuurslaag",
          "afgeleid"
        ],
        "properties": {
          "oin": {
            "description": "OIN van het bevoegd gezag",
            "type": "string"
          },
          "naam": {
            "description": "Naam van het bevoegd gezag. Als de naam niet opgehaald kon worden uit het OIN register, staat hier het OIN.",
            "type": "string"
          },
          "bestuurslaag": {
            "$ref": "#/components/schemas/Bestuurslaag"
          },
          "afgeleid": {
            "description": "Definieert of dit het afgeleide bevoegd gezag is waar het verzoek heen moet worden gestuurd. Als deze op true staat is dit het bevoegd gezag waar het verzoek volgens de afleiding heen moet worden gestuurd. false betekent dat dit een alternatief bevoegd gezag is wat de gebruiker kan kiezen. Normaal zal in een response één bevoegd gezag afgeleid=true hebben, maar bij een project locatie over bestuurlijke grenzen kunnen alle bevoegd gezagen van dezelfde bestuurslaag afgeleid=true hebben.",
            "type": "boolean"
          }
        }
      },
      "Activiteit": {
        "description": "Een activiteit",
        "required": [
          "functioneleStructuurRef",
          "typering"
        ],
        "properties": {
          "functioneleStructuurRef": {
            "description": "FunctioneleStructuurRef van de activiteit",
            "type": "string"
          },
          "typering": {
            "$ref": "#/components/schemas/ActiviteitTypering"
          }
        }
      },
      "Behandeldienst": {
        "description": "Een behandeldienst",
        "required": [
          "oin",
          "naam"
        ],
        "properties": {
          "oin": {
            "description": "OIN van de behandeldienst",
            "type": "string"
          },
          "naam": {
            "description": "Naam van de behandeldienst. Als de naam niet opgehaald kon worden uit het OIN register, staat hier het OIN.",
            "type": "string"
          }
        }
      },
      "Conceptverzoek": {
        "description": "Uitkomst van bepalen conceptverzoek",
        "required": [
          "toegestaan"
        ],
        "properties": {
          "toegestaan": {
            "description": "Is conceptverzoek toegestaan?",
            "type": "boolean"
          }
        }
      },
      "Bestuurslaag": {
        "description": "Bestuurslaag van een Organisatie",
        "type": "string",
        "enum": [
          "rijk",
          "provincie",
          "waterschap",
          "gemeente"
        ]
      },
      "ActiviteitTypering": {
        "description": "Typering van de activiteit",
        "type": "string",
        "enum": [
          "Water",
          "Milieubelastende",
          "Overige"
        ]
      },
      "ToestemmingResponse": {
        "required": [
          "code",
          "waarde"
        ],
        "properties": {
          "code": {
            "type": "string",
            "description": "Code van de toestemming",
            "enum": [
              "Vergunning",
              "Melding",
              "Informatie",
              "InformatieOngewoonVoorval",
              "AanvraagMaatwerkvoorschrift",
              "MeldingGelijkwaardigeMaatregel",
              "AanvraagToestemmingGelijkwaardigeMaatregel"
            ]
          },
          "waarde": {
            "type": "string",
            "description": "Waarde van het toestemmingstype."
          }
        }
      },
      "GeoQuery": {
        "description": "Filter op geografisch punt of vlak. Zie de [DSO API/URI strategie](https://iplo.nl/digitaal-stelsel/aansluiten/standaarden/api-en-uri-strategie).",
        "required": [
          "intersects"
        ],
        "properties": {
          "intersects": {
            "description": "Punt of vlak waarmee het resultaat raakvlak moet hebben. Analoog aan ElasticSearch GeoShape Query (https://www.elastic.co/guide/en/elasticsearch/reference/5.0/query-dsl-geo-shape-query.html)",
            "oneOf": [
              {
                "title": "Point",
                "description": "GeoJSON Point gespecificeerd volgens https://tools.ietf.org/html/rfc7946#section-3.1.2",
                "type": "object",
                "required": [
                  "type",
                  "coordinates"
                ],
                "properties": {
                  "type": {
                    "type": "string",
                    "enum": [
                      "Point"
                    ]
                  },
                  "coordinates": {
                    "description": "De coördinaten van het punt waarbij het 1e item de x-coordinaat is en het 2e item de y-coordinaat, gespecificeerd volgens https://tools.ietf.org/html/rfc7946#section-3.1.1",
                    "type": "array",
                    "minItems": 2,
                    "items": {
                      "type": "number"
                    }
                  }
                }
              },
              {
                "title": "Polygon",
                "description": "GeoJSON Polygon gespecificeerd volgens https://tools.ietf.org/html/rfc7946#section-3.1.6",
                "type": "object",
                "required": [
                  "type",
                  "coordinates"
                ],
                "properties": {
                  "type": {
                    "type": "string",
                    "enum": [
                      "Polygon"
                    ]
                  },
                  "coordinates": {
                    "description": "De coördinaten van een Polygon volgens https://tools.ietf.org/html/rfc7946#section-3.1.6",
                    "type": "array",
                    "items": {
                      "type": "array",
                      "minItems": 4,
                      "items": {
                        "$ref": "#/components/schemas/GeoQuery/properties/intersects/oneOf/0/properties/coordinates"
                      }
                    }
                  }
                }
              },
              {
                "title": "MultiPolygon",
                "description": "GeoJSON MultiPolygon gespecificeerd volgens https://tools.ietf.org/html/rfc7946#section-3.1.7",
                "type": "object",
                "required": [
                  "type",
                  "coordinates"
                ],
                "properties": {
                  "type": {
                    "type": "string",
                    "enum": [
                      "MultiPolygon"
                    ]
                  },
                  "coordinates": {
                    "description": "De coördinaten van een MultiPolygon volgens https://tools.ietf.org/html/rfc7946#section-3.1.7",
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/GeoQuery/properties/intersects/oneOf/1/properties/coordinates"
                    }
                  }
                }
              },
              {
                "description": "GeoJSon geometry collection volgens https://tools.ietf.org/html/rfc7946#section-3.1.8",
                "type": "object",
                "required": [
                  "geometries",
                  "type"
                ],
                "properties": {
                  "type": {
                    "type": "string",
                    "enum": [
                      "GeometryCollection"
                    ]
                  },
                  "geometries": {
                    "type": "array",
                    "items": {
                      "anyOf": [
                        {
                          "$ref": "#/components/schemas/GeoQuery/properties/intersects/oneOf/0"
                        },
                        {
                          "$ref": "#/components/schemas/GeoQuery/properties/intersects/oneOf/1"
                        },
                        {
                          "$ref": "#/components/schemas/GeoQuery/properties/intersects/oneOf/2"
                        }
                      ],
                      "minItems": 0
                    }
                  }
                }
              }
            ]
          }
        },
        "example": {
          "intersects": {
            "type": "Point",
            "coordinates": [
              155000,
              463000
            ]
          }
        }
      },
      "Datum": {
        "description": "Datum in het formaat dd-MM-yyyy.",
        "type": "string",
        "pattern": "^\\d{2}-\\d{2}-\\d{4}$",
        "example": "01-01-2023"
      }
    }
  },
  "x-wso2-cors": {
    "accessControlAllowOrigins": [
      "*"
    ],
    "corsConfigurationEnabled": true,
    "accessControlAllowCredentials": false,
    "accessControlAllowMethods": [
      "GET",
      "PUT",
      "POST",
      "DELETE",
      "PATCH",
      "OPTIONS"
    ],
    "accessControlAllowHeaders": [
      "authorization",
      "Access-Control-Allow-Origin",
      "Content-Type",
      "SOAPAction"
    ]
  }
}

