{
  "openapi": "3.1.0",
  "info": {
    "title": "Treffpunkt Rif — offene Termin-API",
    "version": "1.0.0",
    "description": "Öffentliche, lesende Schnittstelle zu den Veranstaltungen und Kursen des Vereins Treffpunkt Rif (Hallein-Rif, Salzburg). Ohne Anmeldung nutzbar, JSON und XML. Sie enthält keine Bestell-, Ticket- oder Personendaten und keine Zahlen zum Verkaufsstand — nur das Merkmal „ausgebucht“.",
    "contact": {
      "name": "Verein Treffpunkt Rif",
      "email": "info@treffpunkt-rif.at",
      "url": "https://treffpunkt-rif.sumware.at/kontakt"
    },
    "license": {
      "name": "CC BY 4.0",
      "url": "https://creativecommons.org/licenses/by/4.0/"
    }
  },
  "servers": [
    {
      "url": "https://treffpunkt-rif.sumware.at/api/v1",
      "description": "Produktion"
    }
  ],
  "externalDocs": {
    "description": "Dokumentation",
    "url": "https://treffpunkt-rif.sumware.at/api"
  },
  "paths": {
    "/events": {
      "get": {
        "summary": "Terminliste",
        "description": "Kommende Veranstaltungen und Kurse. Standardzeitraum: heute bis in einem Jahr.",
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "description": "Beginn des Zeitraums (YYYY-MM-DD)",
            "schema": {
              "type": "string"
            },
            "required": false
          },
          {
            "name": "to",
            "in": "query",
            "description": "Ende des Zeitraums (YYYY-MM-DD)",
            "schema": {
              "type": "string"
            },
            "required": false
          },
          {
            "name": "includePast",
            "in": "query",
            "description": "1 = auch vergangene Termine",
            "schema": {
              "type": "string",
              "enum": [
                "0",
                "1"
              ]
            },
            "required": false
          },
          {
            "name": "kind",
            "in": "query",
            "description": "event oder course",
            "schema": {
              "type": "string",
              "enum": [
                "event",
                "course"
              ]
            },
            "required": false
          },
          {
            "name": "category",
            "in": "query",
            "description": "Kategorie-Slug (veranstaltung, kurs, kinderkurse)",
            "schema": {
              "type": "string"
            },
            "required": false
          },
          {
            "name": "tags",
            "in": "query",
            "description": "Schlagwort-Slugs, kommagetrennt (ODER-Verknüpfung)",
            "schema": {
              "type": "string"
            },
            "required": false
          },
          {
            "name": "partner",
            "in": "query",
            "description": "Nur Termine dieses Partners",
            "schema": {
              "type": "string"
            },
            "required": false
          },
          {
            "name": "own",
            "in": "query",
            "description": "1 = nur Termine des Vereins ohne Partnertermine",
            "schema": {
              "type": "string",
              "enum": [
                "0",
                "1"
              ]
            },
            "required": false
          },
          {
            "name": "venue",
            "in": "query",
            "description": "Ort-Slug",
            "schema": {
              "type": "string"
            },
            "required": false
          },
          {
            "name": "q",
            "in": "query",
            "description": "Volltextsuche",
            "schema": {
              "type": "string"
            },
            "required": false
          },
          {
            "name": "status",
            "in": "query",
            "description": "scheduled | cancelled | moved | all",
            "schema": {
              "type": "string"
            },
            "required": false
          },
          {
            "name": "updatedSince",
            "in": "query",
            "description": "Nur seither geänderte Termine (ISO-8601); liefert zusätzlich `removed`",
            "schema": {
              "type": "string"
            },
            "required": false
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Seitengröße, höchstens 200",
            "schema": {
              "type": "integer",
              "default": 50
            },
            "required": false
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Cursor aus `nextCursor`",
            "schema": {
              "type": "string"
            },
            "required": false
          },
          {
            "name": "sort",
            "in": "query",
            "description": "start | updated",
            "schema": {
              "type": "string",
              "enum": [
                "start",
                "updated"
              ]
            },
            "required": false
          },
          {
            "name": "ref",
            "in": "query",
            "description": "Partnercode; hängt ?tr= an alle Links für die Klickauswertung",
            "schema": {
              "type": "string"
            },
            "required": false
          },
          {
            "name": "expand",
            "in": "query",
            "description": "description und/oder occurrences, kommagetrennt",
            "schema": {
              "type": "string"
            },
            "required": false
          },
          {
            "name": "format",
            "in": "query",
            "description": "json | xml | csv",
            "schema": {
              "type": "string",
              "enum": [
                "json",
                "xml",
                "csv"
              ]
            },
            "required": false
          }
        ],
        "responses": {
          "200": {
            "description": "Terminliste",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EventList"
                }
              },
              "application/xml": {
                "schema": {
                  "type": "string",
                  "description": "XML im Namensraum https://www.treffpunkt-rif.at/schema/events/v1"
                }
              },
              "text/csv": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "description": "Ungültige Parameter"
          },
          "429": {
            "description": "Zu viele Anfragen (120/min/IP)"
          }
        }
      }
    },
    "/events/{slug}": {
      "get": {
        "summary": "Einzelner Termin",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ref",
            "in": "query",
            "description": "Partnercode",
            "schema": {
              "type": "string"
            },
            "required": false
          }
        ],
        "responses": {
          "200": {
            "description": "Termin",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          },
          "404": {
            "description": "Unbekannt"
          }
        }
      }
    },
    "/events/{slug}.ics": {
      "get": {
        "summary": "Einzelner Termin als iCalendar",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "iCalendar"
          }
        }
      }
    },
    "/tags": {
      "get": {
        "summary": "Schlagwortkatalog",
        "responses": {
          "200": {
            "description": "Schlagwörter"
          }
        }
      }
    },
    "/venues": {
      "get": {
        "summary": "Veranstaltungsorte",
        "responses": {
          "200": {
            "description": "Orte"
          }
        }
      }
    },
    "/partners": {
      "get": {
        "summary": "Partnerorganisationen",
        "responses": {
          "200": {
            "description": "Partner"
          }
        }
      }
    },
    "/feeds/events.ics": {
      "get": {
        "summary": "Kalender-Abo aller Termine",
        "responses": {
          "200": {
            "description": "iCalendar"
          }
        }
      }
    },
    "/feeds/events.rss": {
      "get": {
        "summary": "RSS-Feed",
        "responses": {
          "200": {
            "description": "RSS 2.0"
          }
        }
      }
    },
    "/feeds/events.jsonld": {
      "get": {
        "summary": "schema.org-Events als JSON-LD",
        "responses": {
          "200": {
            "description": "JSON-LD"
          }
        }
      }
    },
    "/health": {
      "get": {
        "summary": "Statusprüfung",
        "responses": {
          "200": {
            "description": "ok"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Event": {
        "type": "object",
        "required": [
          "id",
          "slug",
          "url",
          "kind",
          "title",
          "status",
          "start",
          "registration",
          "prices",
          "updatedAt"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Stabile Kennung (UUIDv7)"
          },
          "slug": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "kind": {
            "type": "string",
            "enum": [
              "event",
              "course"
            ],
            "description": "Veranstaltung oder Kursreihe"
          },
          "category": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "slug": {
                "type": "string"
              },
              "name": {
                "type": "string"
              }
            }
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "slug": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                }
              }
            }
          },
          "title": {
            "type": "string"
          },
          "subtitle": {
            "type": [
              "string",
              "null"
            ]
          },
          "teaser": {
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "type": "object",
            "description": "Nur mit expand=description",
            "properties": {
              "html": {
                "type": "string"
              },
              "text": {
                "type": "string"
              }
            }
          },
          "status": {
            "type": "string",
            "enum": [
              "scheduled",
              "cancelled",
              "moved"
            ]
          },
          "cancelled": {
            "type": "boolean"
          },
          "cancelReason": {
            "type": [
              "string",
              "null"
            ]
          },
          "moved": {
            "type": "boolean"
          },
          "movedToUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "start": {
            "type": "string",
            "format": "date-time",
            "description": "ISO-8601 mit Offset, Zeitzone Europe/Vienna"
          },
          "end": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "allDay": {
            "type": "boolean"
          },
          "occurrences": {
            "type": "array",
            "description": "Einheiten einer Kursreihe; nur mit expand=occurrences",
            "items": {
              "type": "object",
              "properties": {
                "seq": {
                  "type": "integer"
                },
                "start": {
                  "type": "string",
                  "format": "date-time"
                },
                "end": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "scheduled",
                    "cancelled",
                    "moved"
                  ]
                }
              }
            }
          },
          "venue": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "slug": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "street": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "zip": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "city": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "country": {
                "type": "string"
              },
              "lat": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "lng": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "note": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "organizer": {
            "type": "object",
            "properties": {
              "name": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "url": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "isPartner": {
                "type": "boolean"
              }
            }
          },
          "partner": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "slug": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "url": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "instructor": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "name": {
                "type": "string"
              }
            }
          },
          "performer": {
            "type": [
              "string",
              "null"
            ]
          },
          "images": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "url": {
                  "type": "string"
                },
                "alt": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "credit": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              }
            }
          },
          "registration": {
            "type": "object",
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "none",
                  "external",
                  "tickets",
                  "registration",
                  "door_only"
                ]
              },
              "url": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "externalUrl": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "salesOpenAt": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time"
              },
              "salesCloseAt": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time"
              },
              "soldOut": {
                "type": "boolean",
                "description": "Merkmal, keine Zahl — Restplätze werden nicht veröffentlicht"
              },
              "waitlist": {
                "type": "boolean"
              }
            }
          },
          "prices": {
            "type": "object",
            "properties": {
              "currency": {
                "type": "string",
                "enum": [
                  "EUR"
                ]
              },
              "priceText": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "isFree": {
                "type": "boolean"
              },
              "tickets": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "description": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "price": {
                      "type": "number",
                      "description": "Betrag in Euro"
                    },
                    "memberPrice": {
                      "type": [
                        "number",
                        "null"
                      ],
                      "description": "Preis für Vereinsmitglieder"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "available",
                        "soldOut",
                        "notYetOnSale",
                        "salesEnded"
                      ]
                    }
                  }
                }
              }
            }
          },
          "audience": {
            "type": "object",
            "properties": {
              "minAge": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "maxAge": {
                "type": [
                  "integer",
                  "null"
                ]
              }
            }
          },
          "course": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "units": {
                "type": "integer"
              },
              "weekdays": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "unitDurationMin": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "minParticipants": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "registrationDeadline": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time"
              }
            }
          },
          "publishedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "EventList": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://treffpunkt-rif.sumware.at/api/v1/schema/events.json",
        "title": "Treffpunkt Rif — Termine",
        "description": "Öffentliche Terminliste des Vereins Treffpunkt Rif. Enthält ausschließlich Termindaten; Bestellungen, Tickets und personenbezogene Daten sind nicht Teil dieser Schnittstelle.",
        "type": "object",
        "required": [
          "apiVersion",
          "generatedAt",
          "events"
        ],
        "properties": {
          "apiVersion": {
            "type": "string"
          },
          "generatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "timezone": {
            "type": "string"
          },
          "source": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "url": {
                "type": "string"
              },
              "license": {
                "type": "string"
              }
            }
          },
          "count": {
            "type": "integer"
          },
          "total": {
            "type": "integer"
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ]
          },
          "events": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "slug",
                "url",
                "kind",
                "title",
                "status",
                "start",
                "registration",
                "prices",
                "updatedAt"
              ],
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Stabile Kennung (UUIDv7)"
                },
                "slug": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "kind": {
                  "type": "string",
                  "enum": [
                    "event",
                    "course"
                  ],
                  "description": "Veranstaltung oder Kursreihe"
                },
                "category": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "properties": {
                    "slug": {
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    }
                  }
                },
                "tags": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "slug": {
                        "type": "string"
                      },
                      "name": {
                        "type": "string"
                      }
                    }
                  }
                },
                "title": {
                  "type": "string"
                },
                "subtitle": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "teaser": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "description": {
                  "type": "object",
                  "description": "Nur mit expand=description",
                  "properties": {
                    "html": {
                      "type": "string"
                    },
                    "text": {
                      "type": "string"
                    }
                  }
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "scheduled",
                    "cancelled",
                    "moved"
                  ]
                },
                "cancelled": {
                  "type": "boolean"
                },
                "cancelReason": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "moved": {
                  "type": "boolean"
                },
                "movedToUrl": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "start": {
                  "type": "string",
                  "format": "date-time",
                  "description": "ISO-8601 mit Offset, Zeitzone Europe/Vienna"
                },
                "end": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "allDay": {
                  "type": "boolean"
                },
                "occurrences": {
                  "type": "array",
                  "description": "Einheiten einer Kursreihe; nur mit expand=occurrences",
                  "items": {
                    "type": "object",
                    "properties": {
                      "seq": {
                        "type": "integer"
                      },
                      "start": {
                        "type": "string",
                        "format": "date-time"
                      },
                      "end": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "format": "date-time"
                      },
                      "status": {
                        "type": "string",
                        "enum": [
                          "scheduled",
                          "cancelled",
                          "moved"
                        ]
                      }
                    }
                  }
                },
                "venue": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "properties": {
                    "slug": {
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    },
                    "street": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "zip": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "city": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "country": {
                      "type": "string"
                    },
                    "lat": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "lng": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "note": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  }
                },
                "organizer": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "url": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "isPartner": {
                      "type": "boolean"
                    }
                  }
                },
                "partner": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "properties": {
                    "slug": {
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    },
                    "url": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  }
                },
                "instructor": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "properties": {
                    "name": {
                      "type": "string"
                    }
                  }
                },
                "performer": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "images": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "url": {
                        "type": "string"
                      },
                      "alt": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "credit": {
                        "type": [
                          "string",
                          "null"
                        ]
                      }
                    }
                  }
                },
                "registration": {
                  "type": "object",
                  "properties": {
                    "mode": {
                      "type": "string",
                      "enum": [
                        "none",
                        "external",
                        "tickets",
                        "registration",
                        "door_only"
                      ]
                    },
                    "url": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "externalUrl": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "salesOpenAt": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time"
                    },
                    "salesCloseAt": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time"
                    },
                    "soldOut": {
                      "type": "boolean",
                      "description": "Merkmal, keine Zahl — Restplätze werden nicht veröffentlicht"
                    },
                    "waitlist": {
                      "type": "boolean"
                    }
                  }
                },
                "prices": {
                  "type": "object",
                  "properties": {
                    "currency": {
                      "type": "string",
                      "enum": [
                        "EUR"
                      ]
                    },
                    "priceText": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "isFree": {
                      "type": "boolean"
                    },
                    "tickets": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "name": {
                            "type": "string"
                          },
                          "description": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "price": {
                            "type": "number",
                            "description": "Betrag in Euro"
                          },
                          "memberPrice": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Preis für Vereinsmitglieder"
                          },
                          "status": {
                            "type": "string",
                            "enum": [
                              "available",
                              "soldOut",
                              "notYetOnSale",
                              "salesEnded"
                            ]
                          }
                        }
                      }
                    }
                  }
                },
                "audience": {
                  "type": "object",
                  "properties": {
                    "minAge": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "maxAge": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    }
                  }
                },
                "course": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "properties": {
                    "units": {
                      "type": "integer"
                    },
                    "weekdays": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "unitDurationMin": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "minParticipants": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "registrationDeadline": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time"
                    }
                  }
                },
                "publishedAt": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "updatedAt": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            }
          },
          "removed": {
            "type": "array",
            "description": "Termine, die seit updatedSince zurückgezogen wurden",
            "items": {
              "type": "object",
              "properties": {
                "slug": {
                  "type": "string"
                },
                "at": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            }
          }
        }
      }
    }
  }
}