{
  "openapi": "3.0.0",
  "info": {
    "version": "1.0.0",
    "title": "Opvragen Werkzaamheden",
    "description": "Een REST-API voor het opvragen van werkzaamheden. Een werkzaamheid is een verzameling van werkzaamheid versies en wordt geïdentificeerd d.m.v. de urn. Een specifieke versie van een werkzaamheid wordt geïdentificeerd met de urn van de werkzaamheid, en een datum waarop de versie geldig is.",
    "contact": {
      "name": "Ontwikkelaarsportaal Omgevingswet",
      "url": "https://aandeslagmetdeomgevingswet.nl/ontwikkelaarsportaal/services/contact/"
    }
  },
  "servers": [
    {
      "url": "/publiek/toepasbare-regels/api/werkzaamheden/v1"
    }
  ],
  "tags": [
    {
      "name": "Meta",
      "description": "Meta informatie over deze API zelf zoals deze API specificatie, en informatie over de actuele status van deze API."
    },
    {
      "name": "Opvragen Werkzaamheden",
      "description": "Leesoperaties om werkzaamheid en werkzaamheid versie informatie op te vragen."
    }
  ],
  "paths": {
    "/": {
      "get": {
        "summary": "OpenApi Specification",
        "tags": [
          "Meta"
        ],
        "responses": {
          "200": {
            "description": "OpenApi Specification Json",
            "content": {
              "application/json": {
                "schema": {
                  "example": "{\"openapi\": \"3.0.0\", ... }"
                }
              }
            }
          }
        }
      }
    },
    "/app-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"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/app-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"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/werkzaamheden": {
      "get": {
        "summary": "Opvragen alle werkzaamheden",
        "tags": [
          "Opvragen Werkzaamheden"
        ],
        "description": "Retourneert de urns van alle werkzaamheden, ongeacht of en wanneer de werkzaamheid actieve versies heeft.",
        "parameters": [
          {
            "$ref": "#/components/parameters/pageSizeEnum"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/_sortByUrn"
          }
        ],
        "responses": {
          "200": {
            "description": "De lijst van werkzaamheden.",
            "content": {
              "application/hal+json": {
                "schema": {
                  "$ref": "#/components/schemas/WerkzaamheidHALResponseList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "500": {
            "$ref": "#/components/responses/500"
          }
        }
      }
    },
    "/werkzaamheden/{urn}": {
      "get": {
        "summary": "Opvragen details van een werkzaamheid",
        "tags": [
          "Opvragen Werkzaamheden"
        ],
        "description": "Retourneert versies van een werkzaamheid, eventueel met trefwoorden en/of gerelateerde werkzaamheden.",
        "parameters": [
          {
            "$ref": "#/components/parameters/WerkzaamheidUrn"
          },
          {
            "$ref": "#/components/parameters/datumActiefFilter"
          },
          {
            "$ref": "#/components/parameters/pageSizeEnum"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/_sort"
          },
          {
            "$ref": "#/components/parameters/expand"
          },
          {
            "$ref": "#/components/parameters/expandScope"
          }
        ],
        "responses": {
          "200": {
            "description": "De werkzaamheid versies van de meegegeven urn.",
            "content": {
              "application/hal+json": {
                "schema": {
                  "$ref": "#/components/schemas/WerkzaamheidVersieHALResponseListWithExpand"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "500": {
            "$ref": "#/components/responses/500"
          }
        }
      }
    },
    "/werkzaamheidversies": {
      "get": {
        "summary": "Opvragen versies van werkzaamheden",
        "tags": [
          "Opvragen Werkzaamheden"
        ],
        "description": "Retourneert versies van werkzaamheden, gefilterd op urn of datum. N.B. minstens één van de filters urns of geldigOp moet worden meegegeven.",
        "parameters": [
          {
            "$ref": "#/components/parameters/WerkzaamheidUrnFilter"
          },
          {
            "$ref": "#/components/parameters/datumActiefFilter"
          },
          {
            "$ref": "#/components/parameters/pageSizeEnum"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/_sort"
          }
        ],
        "responses": {
          "200": {
            "description": "De gevraagde werkzaamheidversies",
            "content": {
              "application/hal+json": {
                "schema": {
                  "$ref": "#/components/schemas/WerkzaamheidVersieHALResponseList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "500": {
            "$ref": "#/components/responses/500"
          }
        }
      }
    }
  },
  "components": {
    "parameters": {
      "datumActiefFilter": {
        "name": "geldigOp",
        "description": "Datum waarop de versie van de werkzaamheid geldig is.",
        "in": "query",
        "schema": {
          "$ref": "#/components/schemas/Datum"
        }
      },
      "pageSizeEnum": {
        "name": "pageSize",
        "description": "Het gewenste aantal items per pagina in een gepagineerde response.",
        "in": "query",
        "schema": {
          "type": "integer",
          "enum": [
            10,
            20,
            50,
            100,
            200
          ]
        },
        "required": false
      },
      "page": {
        "name": "page",
        "description": "De pagina die geretourneerd moet worden in een gepagineerde response.",
        "in": "query",
        "schema": {
          "type": "integer",
          "minimum": 1,
          "default": 1
        },
        "required": false
      },
      "WerkzaamheidUrn": {
        "in": "path",
        "name": "urn",
        "description": "De urn van de werkzaamheid",
        "required": true,
        "schema": {
          "$ref": "#/components/schemas/WerkzaamheidUrn"
        }
      },
      "WerkzaamheidUrnFilter": {
        "in": "query",
        "name": "urns",
        "description": "Komma-gescheiden lijst van werkzaamheid urn's waarvan de versies worden opgevraagd. Indien geen urn's worden meegegeven, is het verplicht om een geldigOp datum mee te geven.",
        "required": false,
        "schema": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/WerkzaamheidUrn"
          },
          "maxItems": 50
        },
        "explode": false
      },
      "_sort": {
        "name": "_sort",
        "description": "Het veld waarop gesorteerd moet worden. Door een minteken (“-”) voor de veldnaam te zetten wordt het veld in aflopende volgorde gesorteerd.",
        "in": "query",
        "schema": {
          "type": "string",
          "enum": [
            "-URN",
            "URN",
            "-OMSCHRIJVING",
            "OMSCHRIJVING"
          ],
          "default": "URN"
        },
        "required": false
      },
      "_sortByUrn": {
        "name": "_sort",
        "description": "Sortering van de resultaten:\n  - URN: alfabetisch oplopend op URN\n  - -URN: alfabetisch aflopend op URN\n",
        "in": "query",
        "schema": {
          "type": "string",
          "enum": [
            "-URN",
            "URN"
          ],
          "default": "URN"
        },
        "required": false
      },
      "expand": {
        "in": "query",
        "name": "_expand",
        "description": "Indien true, worden sub-resources genest teruggegeven als onderdeel van het antwoordbericht. De parameter _expandScope is in dit geval verplicht om aan te geven welke sub-resources het betreft.",
        "schema": {
          "type": "boolean"
        }
      },
      "expandScope": {
        "in": "query",
        "name": "_expandScope",
        "description": "Geeft aan welke geneste resources teruggegeven worden als onderdeel van het antwoordbericht. Heeft alleen effect als de parameter _expand de waarde true heeft. De waarde is een komma gescheiden lijst.",
        "schema": {
          "type": "array",
          "items": {
            "type": "string",
            "maxItems": 2,
            "enum": [
              "TREFWOORDEN",
              "LOGISCHE_RELATIES"
            ]
          }
        },
        "explode": false
      }
    },
    "responses": {
      "400": {
        "description": "Fouten (missing parameter; niet bestaande parameter; invalide waarde voor parameter)",
        "content": {
          "application/problem+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/problem+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."
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "429": {
        "description": "Te veel requests (binnen een bepaalde tijd)"
      },
      "500": {
        "description": "Er is een onverwachte technische fout opgetreden",
        "content": {
          "application/problem+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": {
      "WerkzaamheidUrn": {
        "description": "Urn van de werkzaamheid",
        "type": "string",
        "pattern": "^\\w{1,100}$",
        "example": "BoomKappen"
      },
      "Omschrijving": {
        "description": "Omschrijving van de werkzaamheid versie",
        "type": "string",
        "minLength": 1,
        "maxLength": 250,
        "example": "Vellen van een houtopstand"
      },
      "Trefwoord": {
        "description": "Trefwoord van de werkzaamheid versie",
        "type": "string",
        "minLength": 1,
        "maxLength": 250,
        "example": "Omhakken"
      },
      "Trefwoorden": {
        "description": "Trefwoorden van de werkzaamheid versie",
        "type": "array",
        "minItems": 0,
        "maxItems": 500,
        "items": {
          "$ref": "#/components/schemas/Trefwoord"
        },
        "example": [
          "Omhakken",
          "Boom"
        ]
      },
      "WerkzaamheidHALResponseList": {
        "description": "Lijst van werkzaamheden met HAL links.",
        "required": [
          "_links",
          "page"
        ],
        "properties": {
          "_embedded": {
            "required": [
              "werkzaamheden"
            ],
            "properties": {
              "werkzaamheden": {
                "type": "array",
                "minItems": 1,
                "items": {
                  "$ref": "#/components/schemas/WerkzaamheidHALResponse"
                }
              }
            }
          },
          "_links": {
            "$ref": "#/components/schemas/HalPaginationLinks"
          },
          "page": {
            "$ref": "#/components/schemas/Page"
          }
        }
      },
      "WerkzaamheidHALResponse": {
        "description": "Werkzaamheid met HAL links",
        "allOf": [
          {
            "$ref": "#/components/schemas/WerkzaamheidResponse"
          },
          {
            "required": [
              "_links"
            ],
            "properties": {
              "_links": {
                "required": [
                  "versies"
                ],
                "properties": {
                  "versies": {
                    "description": "HAL link om alle versies van de werkzaamheid op te halen",
                    "allOf": [
                      {
                        "$ref": "#/components/schemas/HalLink"
                      }
                    ]
                  }
                }
              }
            }
          }
        ]
      },
      "WerkzaamheidResponse": {
        "description": "Werkzaamheid gegevens",
        "required": [
          "urn"
        ],
        "properties": {
          "urn": {
            "$ref": "#/components/schemas/WerkzaamheidUrn"
          }
        }
      },
      "WerkzaamheidVersieHALResponseListWithExpand": {
        "description": "Lijst van werkzaamheid versies met HAL links en eventueel gerelateerde gegevens (in het geval _expand is gebruikt)",
        "required": [
          "_links",
          "page"
        ],
        "properties": {
          "_embedded": {
            "required": [
              "werkzaamheidversies"
            ],
            "properties": {
              "werkzaamheidversies": {
                "type": "array",
                "minItems": 1,
                "items": {
                  "$ref": "#/components/schemas/WerkzaamheidVersieHALResponse"
                }
              }
            }
          },
          "_links": {
            "$ref": "#/components/schemas/HalPaginationLinks"
          },
          "page": {
            "$ref": "#/components/schemas/Page"
          }
        }
      },
      "WerkzaamheidVersieHALResponseList": {
        "description": "Lijst van werkzaamheid versies met HAL links",
        "required": [
          "_links",
          "page"
        ],
        "properties": {
          "_embedded": {
            "required": [
              "werkzaamheidversies"
            ],
            "properties": {
              "werkzaamheidversies": {
                "type": "array",
                "minItems": 1,
                "items": {
                  "$ref": "#/components/schemas/WerkzaamheidVersieResponse"
                }
              }
            }
          },
          "_links": {
            "$ref": "#/components/schemas/HalPaginationLinks"
          },
          "page": {
            "$ref": "#/components/schemas/Page"
          }
        }
      },
      "WerkzaamheidVersieHALResponse": {
        "description": "Werkzaamheid versie met HAL links",
        "allOf": [
          {
            "$ref": "#/components/schemas/WerkzaamheidVersieResponse"
          },
          {
            "properties": {
              "_embedded": {
                "properties": {
                  "trefwoorden": {
                    "$ref": "#/components/schemas/Trefwoorden"
                  },
                  "logischeRelaties": {
                    "description": "De werkzaamheden waarnaar een logische relatie bestaat.",
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/WerkzaamheidHALResponse"
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "WerkzaamheidVersieResponse": {
        "description": "Werkzaamheid versie gegevens",
        "required": [
          "urn",
          "omschrijving",
          "beginDatum"
        ],
        "properties": {
          "urn": {
            "$ref": "#/components/schemas/WerkzaamheidUrn"
          },
          "omschrijving": {
            "$ref": "#/components/schemas/Omschrijving"
          },
          "beginDatum": {
            "description": "De datum vanaf wanneer de werkzaamheid versie geldig is.",
            "type": "string",
            "allOf": [
              {
                "$ref": "#/components/schemas/Datum"
              }
            ]
          },
          "eindDatum": {
            "description": "De datum tot en met wanneer de werkzaamheid versie geldig is.",
            "type": "string",
            "allOf": [
              {
                "$ref": "#/components/schemas/Datum"
              }
            ]
          }
        }
      },
      "Datum": {
        "description": "Datum in het formaat yyyy-MM-dd",
        "type": "string",
        "format": "date",
        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        "example": "2023-01-01"
      },
      "HalPaginationLinks": {
        "description": "Links om te navigeren door de paginering",
        "required": [
          "self",
          "first",
          "last"
        ],
        "properties": {
          "self": {
            "description": "uri voor het opvragen van de huidige pagina van deze collectie",
            "allOf": [
              {
                "$ref": "#/components/schemas/HalLink"
              }
            ]
          },
          "first": {
            "description": "uri voor het opvragen van de eerste pagina van deze collectie",
            "allOf": [
              {
                "$ref": "#/components/schemas/HalLink"
              }
            ]
          },
          "last": {
            "description": "uri voor het opvragen van de laatste pagina van deze collectie",
            "allOf": [
              {
                "$ref": "#/components/schemas/HalLink"
              }
            ]
          },
          "prev": {
            "description": "uri voor het opvragen van de vorige pagina van deze collectie",
            "allOf": [
              {
                "$ref": "#/components/schemas/HalLink"
              }
            ]
          },
          "next": {
            "description": "uri voor het opvragen van de volgende pagina van deze collectie",
            "allOf": [
              {
                "$ref": "#/components/schemas/HalLink"
              }
            ]
          }
        }
      },
      "Page": {
        "description": "Info voor paginering.",
        "type": "object",
        "required": [
          "size",
          "totalElements",
          "totalPages",
          "number"
        ],
        "properties": {
          "size": {
            "description": "het aantal items op de huidige pagina",
            "type": "integer",
            "minimum": 0
          },
          "totalElements": {
            "description": "het totaal aantal items in deze collectie",
            "type": "integer",
            "minimum": 0
          },
          "totalPages": {
            "description": "het totaal aantal pagina's in deze collectie",
            "type": "integer",
            "minimum": 0
          },
          "number": {
            "description": "het huidige paginanummer",
            "type": "integer",
            "minimum": 1
          }
        }
      },
      "HalLink": {
        "description": "HAL link",
        "required": [
          "href"
        ],
        "properties": {
          "href": {
            "description": "URI",
            "type": "string"
          }
        }
      }
    }
  },
  "x-wso2-cors": {
    "accessControlAllowOrigins": [
      "*"
    ],
    "corsConfigurationEnabled": true,
    "accessControlAllowCredentials": false,
    "accessControlAllowMethods": [
      "GET",
      "PUT",
      "POST",
      "DELETE",
      "PATCH",
      "OPTIONS"
    ],
    "accessControlAllowHeaders": [
      "authorization",
      "Access-Control-Allow-Origin",
      "Content-Type",
      "SOAPAction"
    ]
  }
}

