RecraHub Public API

Preview. The v1 contract may change before general release. Pin integrations to openapi.json and monitor this page.

OpenAPI schema · https://www.recrahub.nl/api/v1

GET /properties/{property-id}/programmes/current-or-next

Returns the published programme that covers the selection date, or the next upcoming published programme when none is active that day.

Query parameters

Parameter Description
lang Optional. Supported values depend on the property languages. Translatable fields include nl, en, de, fr, and localized. Localized uses the requested language when available and falls back to Dutch.
date Optional. Selection date as YYYY-MM-DD. Defaults to today (application timezone).

Example requests

Current or next programme

GET /properties/{property-id}/programmes/current-or-next

Current or next programme for a date

GET /properties/{property-id}/programmes/current-or-next?date=2026-07-01

English localized values

GET /properties/{property-id}/programmes/current-or-next?lang=en

Responses

200 OK

Programme payload with programme fields, days, highlights, and more_info.

Response

{
  "id": 48,
  "name": "Week 27",
  "title": {
    "nl": "Recreatieprogramma",
    "en": "Recreation programme",
    "de": null,
    "fr": null,
    "localized": "Recreation programme"
  },
  "start_date": "2026-07-06",
  "end_date": "2026-07-12",
  "urls": { "api": "https://example.com/api/v1/properties/12/programmes/48" },
  "theme": {
    "id": 7,
    "name": {
      "nl": "Zomer",
      "en": "Summer",
      "de": null,
      "fr": null,
      "localized": "Summer"
    },
    "description": {
      "nl": "Zomerse week",
      "en": "Summer week",
      "de": null,
      "fr": null,
      "localized": "Summer week"
    },
    "image_url": "https://example.com/storage/themes/summer.jpg",
    "highlighted": true
  },
  "days": [
    {
      "day": 1,
      "date": "2026-07-06",
      "activities": [
        {
          "id": 901,
          "name": {
            "nl": "Kinderdisco",
            "en": "Kids disco",
            "de": null,
            "fr": null,
            "localized": "Kids disco"
          },
          "starts_at": "2026-07-06T10:00:00+02:00",
          "category": {
            "id": 3,
            "name": {
              "nl": "Sport",
              "en": "Sport",
              "de": null,
              "fr": null,
              "localized": "Sport"
            },
            "explanation": {
              "nl": "Activiteiten waarbij je actief beweegt.",
              "en": "Activities where you move actively.",
              "de": null,
              "fr": null,
              "localized": "Activities where you move actively."
            },
            "cta": {
              "nl": "Doe mee",
              "en": "Join",
              "de": null,
              "fr": null,
              "localized": "Join"
            },
            "image_url": "https://example.com/storage/categories/sport.png"
          },
          "signup": { "enabled": true, "status": "open" }
        }
      ]
    }
  ],
  "highlights": [
    {
      "type": "activity",
      "id": 34,
      "name": {
        "nl": "Disco avond",
        "en": "Disco night",
        "de": null,
        "fr": null,
        "localized": "Disco night"
      },
      "header": {
        "nl": "Vandaag uitgelicht",
        "en": "Highlighted today",
        "de": null,
        "fr": null,
        "localized": "Highlighted today"
      },
      "description": {
        "nl": "Kom dansen met het animatieteam.",
        "en": "Come dance with the entertainment team.",
        "de": null,
        "fr": null,
        "localized": "Come dance with the entertainment team."
      },
      "image_url": "https://example.com/storage/highlights/disco.jpg",
      "program_activity_id": 901
    }
  ],
  "more_info": {
    "explanation_categories": [
      {
        "id": 3,
        "name": {
          "nl": "Sport",
          "en": "Sport",
          "de": null,
          "fr": null,
          "localized": "Sport"
        },
        "explanation": {
          "nl": "Activiteiten waarbij je actief beweegt.",
          "en": "Activities where you move actively.",
          "de": null,
          "fr": null,
          "localized": "Activities where you move actively."
        },
        "cta": {
          "nl": "Doe mee",
          "en": "Join",
          "de": null,
          "fr": null,
          "localized": "Join"
        },
        "image_url": "https://example.com/storage/categories/sport.png"
      }
    ],
    "explanation_footer_text": {
      "nl": "Programma onder voorbehoud.",
      "en": "Programme subject to change.",
      "de": null,
      "fr": null,
      "localized": "Programme subject to change."
    },
    "online": {
      "enabled": true,
      "url": "https://example.com/demo-park",
      "show_recrateam_logo": true,
      "recrateam_logo_url": "https://example.com/images/logo-recrateam.svg"
    },
    "practical_information": [
      {
        "icon": "info",
        "text": {
          "nl": "Verzamelen bij de receptie.",
          "en": "Meet at reception.",
          "de": null,
          "fr": null,
          "localized": "Meet at reception."
        }
      }
    ]
  }
}
404 Not found

No published programme matches the property and selection date (and no later programme exists).

422 Validation error

Invalid lang or date query value.

GET /properties/{property-id}/programmes/{program-id}

Returns one published programme by id. The programme must belong to the property in the path.

Query parameters

Parameter Description
lang Optional. Supported values depend on the property languages. Translatable fields include nl, en, de, fr, and localized. Localized uses the requested language when available and falls back to Dutch.

Example requests

Programme by ID

GET /properties/{property-id}/programmes/{program-id}

Programme by ID with localized values

GET /properties/{property-id}/programmes/{program-id}?lang=de

Responses

200 OK

Programme payload with programme fields, days, highlights, and more_info.

Response

{
  "id": 48,
  "name": "Week 27",
  "title": {
    "nl": "Recreatieprogramma",
    "en": "Recreation programme",
    "de": null,
    "fr": null,
    "localized": "Recreation programme"
  },
  "start_date": "2026-07-06",
  "end_date": "2026-07-12",
  "urls": { "api": "https://example.com/api/v1/properties/12/programmes/48" },
  "theme": {
    "id": 7,
    "name": {
      "nl": "Zomer",
      "en": "Summer",
      "de": null,
      "fr": null,
      "localized": "Summer"
    },
    "description": {
      "nl": "Zomerse week",
      "en": "Summer week",
      "de": null,
      "fr": null,
      "localized": "Summer week"
    },
    "image_url": "https://example.com/storage/themes/summer.jpg",
    "highlighted": true
  },
  "days": [
    {
      "day": 1,
      "date": "2026-07-06",
      "activities": [
        {
          "id": 901,
          "name": {
            "nl": "Kinderdisco",
            "en": "Kids disco",
            "de": null,
            "fr": null,
            "localized": "Kids disco"
          },
          "starts_at": "2026-07-06T10:00:00+02:00",
          "category": {
            "id": 3,
            "name": {
              "nl": "Sport",
              "en": "Sport",
              "de": null,
              "fr": null,
              "localized": "Sport"
            },
            "explanation": {
              "nl": "Activiteiten waarbij je actief beweegt.",
              "en": "Activities where you move actively.",
              "de": null,
              "fr": null,
              "localized": "Activities where you move actively."
            },
            "cta": {
              "nl": "Doe mee",
              "en": "Join",
              "de": null,
              "fr": null,
              "localized": "Join"
            },
            "image_url": "https://example.com/storage/categories/sport.png"
          },
          "signup": { "enabled": true, "status": "open" }
        }
      ]
    }
  ],
  "highlights": [
    {
      "type": "activity",
      "id": 34,
      "name": {
        "nl": "Disco avond",
        "en": "Disco night",
        "de": null,
        "fr": null,
        "localized": "Disco night"
      },
      "header": {
        "nl": "Vandaag uitgelicht",
        "en": "Highlighted today",
        "de": null,
        "fr": null,
        "localized": "Highlighted today"
      },
      "description": {
        "nl": "Kom dansen met het animatieteam.",
        "en": "Come dance with the entertainment team.",
        "de": null,
        "fr": null,
        "localized": "Come dance with the entertainment team."
      },
      "image_url": "https://example.com/storage/highlights/disco.jpg",
      "program_activity_id": 901
    }
  ],
  "more_info": {
    "explanation_categories": [
      {
        "id": 3,
        "name": {
          "nl": "Sport",
          "en": "Sport",
          "de": null,
          "fr": null,
          "localized": "Sport"
        },
        "explanation": {
          "nl": "Activiteiten waarbij je actief beweegt.",
          "en": "Activities where you move actively.",
          "de": null,
          "fr": null,
          "localized": "Activities where you move actively."
        },
        "cta": {
          "nl": "Doe mee",
          "en": "Join",
          "de": null,
          "fr": null,
          "localized": "Join"
        },
        "image_url": "https://example.com/storage/categories/sport.png"
      }
    ],
    "explanation_footer_text": {
      "nl": "Programma onder voorbehoud.",
      "en": "Programme subject to change.",
      "de": null,
      "fr": null,
      "localized": "Programme subject to change."
    },
    "online": {
      "enabled": true,
      "url": "https://example.com/demo-park",
      "show_recrateam_logo": true,
      "recrateam_logo_url": "https://example.com/images/logo-recrateam.svg"
    },
    "practical_information": [
      {
        "icon": "info",
        "text": {
          "nl": "Verzamelen bij de receptie.",
          "en": "Meet at reception.",
          "de": null,
          "fr": null,
          "localized": "Meet at reception."
        }
      }
    ]
  }
}
404 Not found

Programme does not exist, is not published, or belongs to another property.

422 Validation error

Invalid lang query value.

GET /properties/{property-id}/age-tags

Returns age tags actually used by published programmes for a public property.

Query parameters

Parameter Description
lang Optional. Supported values depend on the property languages. Translatable fields include nl, en, de, fr, and localized. Localized uses the requested language when available and falls back to Dutch.

Example requests

Used age tags

GET /properties/{property-id}/age-tags

English localized values

GET /properties/{property-id}/age-tags?lang=en

Responses

200 OK

JSON array of age tag objects with the same text structure as programme activity age_tag values.

Response

[
  {
    "id": 5,
    "name": {
      "nl": "Alle leeftijden",
      "en": "All ages",
      "de": null,
      "fr": null,
      "localized": "All ages"
    }
  }
]
404 Not found

Property does not exist or is not public.

422 Validation error

Invalid lang query value.

GET /properties/{property-id}/areas

Returns areas actually used by published programmes for a public property.

Query parameters

Parameter Description
lang Optional. Supported values depend on the property languages. Translatable fields include nl, en, de, fr, and localized. Localized uses the requested language when available and falls back to Dutch.

Example requests

Used areas

GET /properties/{property-id}/areas

German localized values

GET /properties/{property-id}/areas?lang=de

Responses

200 OK

JSON array of area objects with the same text structure as programme activity area values.

Response

[
  {
    "id": 8,
    "name": {
      "nl": "Sportveld",
      "en": "Sports field",
      "de": "Sportplatz",
      "fr": null,
      "localized": "Sportplatz"
    }
  }
]
404 Not found

Property does not exist or is not public.

422 Validation error

Invalid lang query value.

GET /properties

Returns all properties with show_on_website enabled. Intended for integration setup and public maps.

Example requests

List public properties

GET /properties

Responses

200 OK

JSON array of public property objects with id, slug, name, formatted address, coordinates, public URL, logo URL, and header image URL.

Response

[
  {
    "id": 12,
    "slug": "demo-park",
    "name": "Demo Park",
    "formatted_address": "Example Street 1, 1234 AB Amsterdam",
    "coordinates": { "lat": 52.37, "lng": 4.89 },
    "url": "https://example.com/demo-park",
    "logo_url": "https://example.com/storage/properties/logos/demo.png",
    "header_image_url": "https://example.com/storage/properties/headers/demo.jpg"
  }
]

GET /properties/{property-id}

Returns public property details by id. Prefer this endpoint for saved integrations because ids do not change when a slug changes.

Example requests

Property by ID

GET /properties/{property-id}

Responses

200 OK

Public property object with id, slug, name, formatted address, coordinates, public URL, logo URL, and header image URL.

Response

{
  "id": 12,
  "slug": "demo-park",
  "name": "Demo Park",
  "formatted_address": "Example Street 1, 1234 AB Amsterdam",
  "coordinates": { "lat": 52.37, "lng": 4.89 },
  "url": "https://example.com/demo-park",
  "logo_url": "https://example.com/storage/properties/logos/demo.png",
  "header_image_url": "https://example.com/storage/properties/headers/demo.jpg"
}
404 Not found

Property does not exist or is not public.

GET /properties/by-slug/{property-slug}

Returns public property details by slug. Use this for discovery or user-facing links; prefer id for saved integrations.

Example requests

Property by slug

GET /properties/by-slug/{property-slug}

Responses

200 OK

Public property object with id, slug, name, formatted address, coordinates, public URL, logo URL, and header image URL.

Response

{
  "id": 12,
  "slug": "demo-park",
  "name": "Demo Park",
  "formatted_address": "Example Street 1, 1234 AB Amsterdam",
  "coordinates": { "lat": 52.37, "lng": 4.89 },
  "url": "https://example.com/demo-park",
  "logo_url": "https://example.com/storage/properties/logos/demo.png",
  "header_image_url": "https://example.com/storage/properties/headers/demo.jpg"
}
404 Not found

Property does not exist or is not public.