{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://raw.githubusercontent.com/api-evangelist/open-education-api/main/json-schema/open-education-api-organisation-schema.json",
  "title": "Organisation",
  "description": "A description of a group of people working together to achieve a goal",
  "x-generated": "2026-10-09",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/open-education-api-openapi.yml#/components/schemas/Organisation",
  "type": "object",
  "required": [
    "organisationId",
    "organisationType",
    "name",
    "primaryCode"
  ],
  "properties": {
    "organisationId": {
      "type": "string",
      "description": "Unique id of this organisation",
      "format": "uuid"
    },
    "primaryCode": {
      "description": "The primary human readable identifier for the organisation. This is often the source identifier as defined by the root organisation.",
      "$ref": "#/$defs/IdentifierEntry"
    },
    "organisationType": {
      "$ref": "#/$defs/organisationType"
    },
    "name": {
      "type": "array",
      "description": "The name of the organisation",
      "minItems": 1,
      "items": {
        "$ref": "#/$defs/LanguageTypedString"
      }
    },
    "shortName": {
      "type": [
        "string",
        "null"
      ],
      "description": "Short name of the organisation",
      "maxLength": 256
    },
    "description": {
      "type": [
        "array",
        "null"
      ],
      "description": "If the organisation is an educational organisation, any general description should clearly mention the type of \neducation organisation, especially in the case of a binary system. In Dutch; universiteit (university) or \nhogeschool (university of applied sciences).\nIf the organisation is not an educational organisation, a general description should describe the role it plays \nin education like providing certain types of internships, educational services, products or facilities.\n",
      "minItems": 1,
      "items": {
        "$ref": "#/$defs/LanguageTypedString"
      }
    },
    "addresses": {
      "type": [
        "array",
        "null"
      ],
      "description": "Addresses of this organisation",
      "items": {
        "$ref": "#/$defs/Address"
      }
    },
    "link": {
      "type": [
        "string",
        "null"
      ],
      "description": "URL of the organisation's website",
      "format": "uri",
      "maxLength": 2048
    },
    "logo": {
      "type": [
        "string",
        "null"
      ],
      "description": "Logo of this organisation",
      "format": "uri",
      "maxLength": 2048
    },
    "otherCodes": {
      "type": [
        "array",
        "null"
      ],
      "description": "An array of additional human readable codes/identifiers for the entity being described.",
      "items": {
        "$ref": "#/$defs/IdentifierEntry"
      }
    },
    "rootId": {
      "description": "The identifier of the organisation which is the root organisation of this organisation.\nWhen the client does not request expansion of `root`, only this identifier is returned.\nThis field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses).\n",
      "oneOf": [
        {
          "$ref": "#/$defs/Identifier"
        },
        {
          "type": "null"
        }
      ]
    },
    "root": {
      "description": "The expanded organisation object which is the root organisation of this organisation.\nWhen the client requests expansion of `root`, the full expanded organisation object MUST be returned here instead of only the identifier.\nIf no root organisation is defined, this value is `null`.\n",
      "oneOf": [
        {
          "$ref": "#/$defs/Organisation"
        },
        {
          "type": "null"
        }
      ]
    },
    "parentId": {
      "description": "The identifier of the organisational unit which is the parent of this organisation.\nWhen the client does not request expansion of `parent`, only this identifier is returned.\nThis field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses).\n",
      "oneOf": [
        {
          "$ref": "#/$defs/Identifier"
        },
        {
          "type": "null"
        }
      ]
    },
    "parent": {
      "description": "The expanded organisation object which is the parent of this organisation.\nWhen the client requests expansion of `parent`, the full expanded organisation object MUST be returned here instead of only the identifier.\nIf no parent organisation is defined, this value is `null`.\n",
      "oneOf": [
        {
          "$ref": "#/$defs/Organisation"
        },
        {
          "type": "null"
        }
      ]
    },
    "childIds": {
      "description": "The identifiers of the organisational units for which this organisation is the parent.\nWhen the client does not request expansion of `children`, only these identifiers are returned.\nThis field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses).\n\nAlthough `childIds` and `children` (for example `organisationIds` versus `organisations`) may \nseem unusual, this naming is intentional and follows the singular–plural convention defined \nby the specification.\n",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "$ref": "#/$defs/Identifier"
      }
    },
    "children": {
      "description": "The expanded organisational unit objects for which this organisation is the parent.\nWhen the client requests expansion of `children`, the full expanded organisation objects MUST be returned here instead of only the identifiers.\nIf no children are defined, this value is `null`.\n",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "oneOf": [
          {
            "$ref": "#/$defs/Organisation"
          },
          {
            "type": "null"
          }
        ]
      }
    },
    "consumer": {
      "oneOf": [
        {
          "$ref": "#/$defs/Consumer"
        },
        {
          "type": "null"
        }
      ]
    },
    "ext": {
      "oneOf": [
        {
          "$ref": "#/$defs/Ext"
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "$defs": {
    "Address": {
      "type": "object",
      "description": "The full street address",
      "required": [
        "addressType"
      ],
      "properties": {
        "addressType": {
          "$ref": "#/$defs/addressType"
        },
        "street": {
          "type": [
            "string",
            "null"
          ],
          "description": "The street name"
        },
        "streetNumber": {
          "type": [
            "string",
            "null"
          ],
          "description": "The street number"
        },
        "additional": {
          "type": [
            "array",
            "null"
          ],
          "description": "Further details like building name, suite, apartment number, etc.",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/LanguageTypedString"
          }
        },
        "postCode": {
          "type": [
            "string",
            "null"
          ],
          "description": "Code to help sort and deliver mail also known as Postal code and ZIP code"
        },
        "city": {
          "type": [
            "string",
            "null"
          ],
          "description": "name of the city / locality"
        },
        "countryCode": {
          "oneOf": [
            {
              "$ref": "#/$defs/Country"
            },
            {
              "type": "null"
            }
          ]
        },
        "geolocation": {
          "type": [
            "object",
            "null"
          ],
          "description": "Geolocation of the entrance of this address (WGS84 coordinate reference system)",
          "required": [
            "latitude",
            "longitude"
          ],
          "properties": {
            "latitude": {
              "type": "number",
              "format": "double"
            },
            "longitude": {
              "type": "number",
              "format": "double"
            }
          }
        },
        "ext": {
          "oneOf": [
            {
              "$ref": "#/$defs/Ext"
            },
            {
              "type": "null"
            }
          ]
        }
      }
    },
    "Consumer": {
      "type": "object",
      "description": "The additional elements of a consumer that may be provided, see the [documentation on support for specific consumers](https://oeapi.eu/v6.0/#/technical/consumers-and-profiles/) for further information about this mechanism.",
      "required": [
        "consumerKey"
      ],
      "properties": {
        "consumerKey": {
          "description": "The key of the consumer (destination) for which this information is intended. See the [consumer registry](https://oeapi.eu/v6.0/#/technical/consumers-and-profiles/). This key is used to select the additional data to be presented in the request.",
          "type": "string"
        },
        "exampleProperty": {
          "description": "An example of an additional property",
          "type": [
            "string",
            "null"
          ]
        }
      },
      "additionalProperties": true
    },
    "Country": {
      "type": "object",
      "description": "An object indicating a country based on at least one iso-3166 code. In situations where more than one ISO-3166 code is provided, the codes must refer to the same country.\n",
      "properties": {
        "iso3166-1-alpha2": {
          "type": [
            "string",
            "null"
          ],
          "minLength": 2,
          "maxLength": 2,
          "description": "A country code based on https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2"
        },
        "iso3166-1-alpha3": {
          "type": [
            "string",
            "null"
          ],
          "minLength": 3,
          "maxLength": 3,
          "description": "A country code based on https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3"
        },
        "iso3166-2": {
          "type": [
            "string",
            "null"
          ],
          "minLength": 5,
          "maxLength": 6,
          "description": "A country subdivision code based on https://en.wikipedia.org/wiki/ISO_3166-2"
        },
        "iso3166-3": {
          "type": [
            "string",
            "null"
          ],
          "minLength": 4,
          "maxLength": 4,
          "description": "A code for a country that no longer exists is listed on ISO 3166-3 (https://en.wikipedia.org/wiki/ISO_3166-3).\nImplementations should refrain from using the original ISO 3166-1 code for such a country since country codes\ncan be reassigned to new countries once the original country code is officially declared obsolete.\n"
        }
      }
    },
    "Ext": {
      "type": "object",
      "description": "Object for additional non-standard attributes"
    },
    "Identifier": {
      "type": "string",
      "description": "An identifier of another resource.",
      "format": "uuid"
    },
    "IdentifierEntry": {
      "type": "object",
      "properties": {
        "codeType": {
          "$ref": "#/$defs/codeType"
        },
        "code": {
          "description": "Human readable value for the code/identifier",
          "type": "string"
        }
      },
      "required": [
        "codeType",
        "code"
      ],
      "additionalProperties": false
    },
    "Language": {
      "description": "The language used in the described entity. The value **must be a language tag that conforms to RFC 5646** (Tags for Identifying Languages, BCP 47):\nhttps://www.rfc-editor.org/rfc/rfc5646.html\n\nA tag consists of the following components, in this exact order:\n1. **language** – two‑ to three‑letter codes (ISO 639‑1/‑2) **or** four‑letter codes (ISO 639‑5) **or** five‑ to eight‑letter registered language subtags.\n2. **script** – optional, four letters in Title‑Case (e.g. `Latn`, `Hant`).\n3. **region** – optional, either two uppercase letters (ISO 3166‑1) **or** three digits (UN M.49).\n4. **variant** – zero or more subtags, each either five‑ to eight‑alphanumerics or a digit followed by three alphanumerics (e.g. `1901`, `oxendict`).\n5. **extension** – zero or more extensions. Each extension starts with a *singleton* (a single alphanumeric character except `x`) followed by one or more subtags of two‑ to eight‑alphanumerics (e.g. `u‑co‑phonebk`).\n6. **private‑use** – optional, the letter `x` followed by one or more subtags of one‑ to eight‑alphanumerics (e.g. `x‑private`).\n\nThe most common form is a two‑letter language code (ISO 639‑1) optionally followed by a hyphen and a two‑letter country code (ISO 3166‑1), for example `en` or `en‑GB`.\n\nMore specific tags are also valid, for instance `zh‑Hant‑TW` (Traditional Chinese as used in Taiwan).\n\nFor sign languages two conventions are recognised:\n* `sgn` – e.g. `nl‑sgn‑NL` (Dutch Sign Language)\n* `s`   – e.g. `nl‑s‑NL` (Dutch Sign Language)\n",
      "type": "string",
      "minLength": 2,
      "pattern": "^(?:(?:[A-Za-z]{2,3}(?:-[A-Za-z]{3}){0,2}|[A-Za-z]{4}|[A-Za-z]{5,8})(?:-[A-Za-z]{4})?(?:-(?:[A-Z]{2}|[0-9]{3}))?(?:-(?:[A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*?(?:-(?:[A-WY-Za-wy-z0-9](?:-[A-Za-z0-9]{2,8})+))*?(?:-x(?:-[A-Za-z0-9]{1,8})+)?|x(?:-[A-Za-z0-9]{1,8})+)$"
    },
    "LanguageTypedString": {
      "type": "object",
      "description": "A String with an associated language code. IF this object is used both fields are mandatory.",
      "required": [
        "language",
        "value"
      ],
      "properties": {
        "language": {
          "$ref": "#/$defs/Language"
        },
        "value": {
          "description": "String to describe the entity.",
          "type": "string"
        }
      }
    },
    "Organisation": {
      "type": "object",
      "description": "A description of a group of people working together to achieve a goal",
      "required": [
        "organisationId",
        "organisationType",
        "name",
        "primaryCode"
      ],
      "properties": {
        "organisationId": {
          "type": "string",
          "description": "Unique id of this organisation",
          "format": "uuid"
        },
        "primaryCode": {
          "description": "The primary human readable identifier for the organisation. This is often the source identifier as defined by the root organisation.",
          "$ref": "#/$defs/IdentifierEntry"
        },
        "organisationType": {
          "$ref": "#/$defs/organisationType"
        },
        "name": {
          "type": "array",
          "description": "The name of the organisation",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/LanguageTypedString"
          }
        },
        "shortName": {
          "type": [
            "string",
            "null"
          ],
          "description": "Short name of the organisation",
          "maxLength": 256
        },
        "description": {
          "type": [
            "array",
            "null"
          ],
          "description": "If the organisation is an educational organisation, any general description should clearly mention the type of \neducation organisation, especially in the case of a binary system. In Dutch; universiteit (university) or \nhogeschool (university of applied sciences).\nIf the organisation is not an educational organisation, a general description should describe the role it plays \nin education like providing certain types of internships, educational services, products or facilities.\n",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/LanguageTypedString"
          }
        },
        "addresses": {
          "type": [
            "array",
            "null"
          ],
          "description": "Addresses of this organisation",
          "items": {
            "$ref": "#/$defs/Address"
          }
        },
        "link": {
          "type": [
            "string",
            "null"
          ],
          "description": "URL of the organisation's website",
          "format": "uri",
          "maxLength": 2048
        },
        "logo": {
          "type": [
            "string",
            "null"
          ],
          "description": "Logo of this organisation",
          "format": "uri",
          "maxLength": 2048
        },
        "otherCodes": {
          "type": [
            "array",
            "null"
          ],
          "description": "An array of additional human readable codes/identifiers for the entity being described.",
          "items": {
            "$ref": "#/$defs/IdentifierEntry"
          }
        },
        "rootId": {
          "description": "The identifier of the organisation which is the root organisation of this organisation.\nWhen the client does not request expansion of `root`, only this identifier is returned.\nThis field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses).\n",
          "oneOf": [
            {
              "$ref": "#/$defs/Identifier"
            },
            {
              "type": "null"
            }
          ]
        },
        "root": {
          "description": "The expanded organisation object which is the root organisation of this organisation.\nWhen the client requests expansion of `root`, the full expanded organisation object MUST be returned here instead of only the identifier.\nIf no root organisation is defined, this value is `null`.\n",
          "oneOf": [
            {
              "$ref": "#/$defs/Organisation"
            },
            {
              "type": "null"
            }
          ]
        },
        "parentId": {
          "description": "The identifier of the organisational unit which is the parent of this organisation.\nWhen the client does not request expansion of `parent`, only this identifier is returned.\nThis field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses).\n",
          "oneOf": [
            {
              "$ref": "#/$defs/Identifier"
            },
            {
              "type": "null"
            }
          ]
        },
        "parent": {
          "description": "The expanded organisation object which is the parent of this organisation.\nWhen the client requests expansion of `parent`, the full expanded organisation object MUST be returned here instead of only the identifier.\nIf no parent organisation is defined, this value is `null`.\n",
          "oneOf": [
            {
              "$ref": "#/$defs/Organisation"
            },
            {
              "type": "null"
            }
          ]
        },
        "childIds": {
          "description": "The identifiers of the organisational units for which this organisation is the parent.\nWhen the client does not request expansion of `children`, only these identifiers are returned.\nThis field is [`expandable`](https://oeapi.eu/v6.0/#/technical/expanding-responses).\n\nAlthough `childIds` and `children` (for example `organisationIds` versus `organisations`) may \nseem unusual, this naming is intentional and follows the singular–plural convention defined \nby the specification.\n",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "$ref": "#/$defs/Identifier"
          }
        },
        "children": {
          "description": "The expanded organisational unit objects for which this organisation is the parent.\nWhen the client requests expansion of `children`, the full expanded organisation objects MUST be returned here instead of only the identifiers.\nIf no children are defined, this value is `null`.\n",
          "type": [
            "array",
            "null"
          ],
          "items": {
            "oneOf": [
              {
                "$ref": "#/$defs/Organisation"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "consumer": {
          "oneOf": [
            {
              "$ref": "#/$defs/Consumer"
            },
            {
              "type": "null"
            }
          ]
        },
        "ext": {
          "oneOf": [
            {
              "$ref": "#/$defs/Ext"
            },
            {
              "type": "null"
            }
          ]
        }
      }
    },
    "addressType": {
      "type": "string",
      "description": "The type of address, indicating its intended use:\n  \n- postal: Used for receiving post\n- visit: Used for physical visits\n- deliveries: Used for deliveries\n- invoicing: Used for invoicing purposes\n- teaching: The location where educational activities take place\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
      "x-ooapi-extensible-enum": [
        "postal",
        "visit",
        "deliveries",
        "invoicing",
        "teaching"
      ]
    },
    "codeType": {
      "type": "string",
      "description": "The type of code or identifier.\n\nThe predefined values are:\n\n| Code                      | Description                                                       |\n|---------------------------|-------------------------------------------------------------------|\n| `account_id`              | Identifier for an account.                                        |\n| `bag_id`                  | Identifier for a building in the Dutch Building and Address       |\n|                           | Registry (BAG).                                                   |\n| `building_id`             | Identifier for a building.                                        |\n| `component_code`          | Identifier for a component (part of a course).                    |\n| `eckid`                   | Identifier assigned within the Dutch *Educatieve ContentKeten iD* |\n|                           | framework. It enables persistent identification and exchange of   |\n|                           | digital learning resources within the Dutch educational sector for|\n|                           | EQF levels 1, 2, 3 and 4. Comparable international approaches     |\n|                           | include LRMI, DOI and Handle                                      |\n|                           | identifiers for learning resources.                               |\n| `email_address`           | An email address.                                                 |\n| `esi`                     | European Student Identifier.                                      |\n| `group_code`              | Identifier for a group of people.                                 |\n| `group_type_code`         | Identifier for the type of group.                                 |\n| `identifier`              | Generic identifier.                                               |\n| `institution_code`        | Registration number of an educational institution. In the         |\n|                           | Netherlands, the former BRIN code has been replaced by the        |\n|                           | institution code, issued by the Ministry of Education, Culture    |\n|                           | and Science (OCW).                                                |\n| `isbn`                    | International Standard Book Number (for books).                   |\n| `issn`                    | International Standard Serial Number (for periodicals).           |\n| `kvk_organisation_id`     | Identifier for a KvK (Dutch Chamber of Commerce) registered       |\n|                           | organisation.                                                     |\n| `kvk_establishment_id`    | Identifier for a specific establishment of a KvK                  |\n|                           | (Dutch Chamber of Commerce) registered organisation.              |\n| `leerbedrijf_id`          | Dutch registration/accreditation id for organisations offering    |\n|                           | internships for vocational education students.                    |\n| `national_identity_number`| Government-assigned personal identifier (e.g. NI number in the UK,|\n|                           | or *personnummer* in Sweden).                                     |\n| `offering_code`           | Identifier for a specific offering (programme, course or          |\n|                           | component).                                                       |\n| `organisation_id`         | Identifier for an organisation.                                   |\n| `orcid`                   | Open Researcher and Contributor ID.                               |\n| `product_id`              | Identifier for a product.                                         |\n| `programme_code`          | Identifier of a programme (a recognised collection of courses).   |\n|                           | In the Netherlands, the former CREBO and CROHO codes have been    |\n|                           | replaced by the programme code as registered in RIO, under the    |\n|                           | authority of OCW.                                                 |\n| `room_code`               | Identifier for a room.                                            |\n| `schac_home`              | Home organisation represented by its domain name.                 |\n| `student_number`          | Identifier for a student.                                         |\n| `studielink_number`       | Identifier assigned to a student by Studielink (Dutch central     |\n|                           | enrolment system).                                                |\n| `system_id`               | Identifier used within a specific system.                         |\n| `username`                | User login name.                                                  |\n| `uuid`                    | Universally unique identifier.                                    |\n\nThis is an *extensible enumeration*. Use the prefix `x-` for custom values.\n",
      "x-ooapi-extensible-enum": [
        "account_id",
        "bag_id",
        "building_id",
        "component_code",
        "eckid",
        "email_address",
        "esi",
        "group_code",
        "group_type_code",
        "identifier",
        "institution_code",
        "isbn",
        "issn",
        "kvk_organisation_id",
        "kvk_establishment_id",
        "leerbedrijf_id",
        "offering_code",
        "organisation_id",
        "orcid",
        "product_id",
        "programme_code",
        "room_code",
        "schac_home",
        "student_number",
        "studielink_number",
        "system_id",
        "username",
        "uuid",
        "national_identity_number"
      ]
    },
    "organisationType": {
      "type": "string",
      "description": "The type of this organisation. When using non-root organisation types, make sure that there is always a parent organisation of type root available.\n\n- root: The top-level organisation, representing the organisation itself\n- institute: A subdivision of the root organisation, typically focused on a broad field of study\n- department: An organisational unit within an organisation or one of the subdivisions of an organisation, focused on a specific discipline\n- faculty: A major academic division within an institution, often overseeing multiple departments\n- branch: A geographically separate location or campus of an organisation\n- academy: A specialised academic unit, often focused on applied or artistic disciplines\n- school: An organisational unit typically used in primary, secondary, or specialised higher education contexts\n\nThis is an extensible enumeration. Use the prefix `x-` for custom values.\n",
      "x-ooapi-extensible-enum": [
        "root",
        "institute",
        "department",
        "faculty",
        "branch",
        "academy",
        "school"
      ]
    }
  }
}