{
  "openapi": "3.1.0",
  "info": {
    "title": "Goa-/Psytrance Events from goabase.net",
    "version": "1.1.1",
    "description": "Daily new Psytrance Events from all over the World",
    "contact": {
      "email": "api@goabase.net"
    },
    "x-timezone-notes": [
      "All datetime values in the API are handled as follows:",
      "1. Times are stored internally in Europe/Berlin timezone",
      "2. Times are returned in ISO 8601 format with +02:00 offset (Berlin time)",
      "3. The 'timezone' field indicates the actual event location timezone",
      "4. Clients should convert the times from Berlin time to the event's local timezone using the 'timezone' field",
      "5. The offset (+02:00) changes with DST in Europe/Berlin"
    ],
    "x-change-log" : {
      "1.0.0": "2025-05-21: Initial release. There are also 0.1.0 and 0.2.0 versions available, but they are not documented here.",
      "1.1.0": "2025-05-25: Changed partylist in CountryListResponse to countriesSum with empty partylist again in that case.\nNew optional urlImageLarge in EventJson.",
      "1.1.1": "2025-10-24: Added offset filter for pagination."
    }
  },
  "externalDocs": {
    "description": "Find out more about the Goabase API",
    "url": "https://www.goabase.net/api/party/"
  },
  "servers": [
    {
      "url": "https://www.goabase.net/api/party",
      "description": "Goabase Party Events API Server"
    }
  ],
  "paths": {
    "/json": {
      "get": {
        "summary": "Get list of parties in JSON format",
        "description": "Returns a list of parties/events based on specified filters",
        "parameters": [
          {
            "name": "country",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Filter by country. Accepts either:\n- ISO alpha-2 code (e.g., 'DE')\n- English country name (e.g., 'Germany')\n- Special value 'list' to get all countries with events",
            "required": false
          },
          {
            "name": "eventtype",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "festival",
                "openair",
                "indoor",
                "club",
                "indoor_outdoor",
                "virtual"
              ]
            },
            "description": "Filter by event type",
            "required": false
          },
          {
            "name": "flyer",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "Filter events with flyer",
            "required": false
          },
          {
            "name": "geoloc",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "Filter events with geolocation. Default radius 100km.",
            "required": false
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500
            },
            "description": "Limit number of results. Default: 40",
            "required": false
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 40
            },
            "description": "Offset for pagination",
            "required": false
          },
          {
            "name": "ll",
            "in": "query",
            "schema": {
              "type": "string",
              "pattern": "^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?),\\s*[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$"
            },
            "description": "Latitude,Longitude coordinates for location-based search. Default radius 100km.",
            "required": false
          },
          {
            "name": "radius",
            "in": "query",
            "schema": {
              "type": "number",
              "minimum": 50,
              "maximum": 500,
              "default": 100
            },
            "description": "Search radius in kilometers from given coordinates. Valid range: 50-500 km, default value 100km",
            "required": false
          },
          {
            "name": "search",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Search term",
            "required": false
          },
          {
            "name": "searchdate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Filter events by date, Format in ISO-8601: YYYY-MM-DD for a day or YYYY-MM for a month.",
            "required": false
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "new",
                "update",
                "canceled",
                "new_loc",
                "postponed"
              ]
            },
            "description": "Filter events by status",
            "required": false
          },
          {
            "name": "tag",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Search for events by a single keyword/tag (e.g., 'Progressive', 'Darkpsy', 'Forest')",
            "required": false
          }
        ],
        "responses": {
          "400": {
            "description": "Invalid parameter value",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    },
                    "details": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "No events found matching the criteria"
          },
          "200": {
            "description": "List of events",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/EventListResponse"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/json/country/list": {
      "get": {
        "summary": "Get list of countries with events",
        "responses": {
          "200": {
            "description": "Country list with event counts",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CountryListResponse"
                }
              }
            }
          }
        }
      }
    },
    "/json/{id}": {
      "get": {
        "summary": "Get single event in JSON format",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Event ID"
          }
        ],
        "responses": {
          "200": {
            "description": "Single event details",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EventJson"
                }
              }
            }
          }
        }
      }
    },
    "/jsonld/{id}": {
      "get": {
        "summary": "Get single event in JSON-LD format",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Event ID"
          }
        ],
        "responses": {
          "200": {
            "description": "Single event details in JSON-LD format",
            "content": {
              "application/ld+json": {
                "schema": {
                  "$ref": "#/components/schemas/EventJsonLD"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "CountryListResponse": {
        "type": "object",
        "required": [
          "partylist",
          "countriesSum",
          "countrylist"
        ],
        "properties": {
          "partylist": {
            "type": "object",
            "description": "Empty in that case"
          },
          "countriesSum": {
            "type": "object",
            "description": "Summary statistics about events and countries",
            "required": [
              "numCountries",
              "numParties"
            ],
            "properties": {
              "numCountries": {
                "type": "integer",
                "description": "Total number of countries with events",
                "minimum": 0,
                "example": 35
              },
              "numParties": {
                "type": "integer",
                "description": "Total number of events across all countries",
                "minimum": 0,
                "example": 267
              }
            },
            "additionalProperties": false
          },
          "countrylist": {
            "type": "array",
            "description": "List of countries with event information",
            "items": {
              "type": "object",
              "required": [
                "nameCountry",
                "isoCountry",
                "numParties",
                "urlCountry"
              ],
              "properties": {
                "nameCountry": {
                  "type": "string",
                  "description": "Country name in English"
                },
                "isoCountry": {
                  "type": "string",
                  "pattern": "^[A-Z]{2}$",
                  "description": "ISO 3166-1 alpha-2 country code"
                },
                "numParties": {
                  "type": "integer",
                  "minimum": 0,
                  "description": "Number of events in this country"
                },
                "urlCountry": {
                  "type": "string",
                  "format": "uri",
                  "description": "API endpoint URL for events in this country"
                }
              },
              "additionalProperties": false
            },
            "minItems": 0
          }
        },
        "additionalProperties": false
      },
      "EventBase": {
        "type": "object",
        "description": "Base event properties shared across different representations",
        "required": [
          "id",
          "nameParty",
          "dateStart",
          "dateEnd",
          "nameCountry",
          "isoCountry"
        ],
        "properties": {
          "id": {
            "type": "integer"
          },
          "nameParty": {
            "type": "string"
          },
          "dateStart": {
            "type": "string",
            "format": "date-time",
            "description": "Event start time in ISO 8601 format. All times are stored in Europe/Berlin timezone but displayed with their local UTC offset. Example: '2025-05-22T10:00:00+02:00'",
            "example": "2025-05-22T10:00:00+02:00"
          },
          "dateEnd": {
            "type": "string",
            "format": "date-time",
            "description": "Event end time in ISO 8601 format. All times are stored in Europe/Berlin timezone but displayed with their local UTC offset. Example: '2025-05-25T03:00:00+02:00'",
            "example": "2025-05-25T03:00:00+02:00"
          },
          "nameType": {
            "type": "string",
            "enum": [
              "Festival",
              "Open Air",
              "Indoor",
              "Club",
              "In- & Outdoor"
            ]
          },
          "nameCountry": {
            "type": "string"
          },
          "isoCountry": {
            "type": "string",
            "pattern": "^[A-Z]{2}$"
          },
          "nameTown": {
            "type": "string"
          },
          "geoLat": {
            "type": "number",
            "minimum": -90,
            "maximum": 90
          },
          "geoLon": {
            "type": "number",
            "minimum": -180,
            "maximum": 180
          },
          "nameOrganizer": {
            "type": "string"
          },
          "timezone": {
            "type": "string",
            "description": "The timezone identifier for the event location. While dates are stored in Europe/Berlin, this field indicates the actual event timezone",
            "example": "Europe/London"
          },
          "urlOrganizer": {
            "type": "string"
          },
          "urlImageSmall": {
            "type": "string",
            "description": "Flyer event image, max. 160x160px"
          },
          "urlImageMedium": {
            "type": "string",
            "description": "Flyer event image, max. 260x260px"
          },
          "urlImageLarge": {
            "type": "string",
            "description": "Flyer event image, max. 640x640px"
          },
          "urlImageFull": {
            "type": "string",
            "description": "Flyer event image, max. 1280x1280px"
          },
          "dateCreated": {
            "type": "string",
            "format": "date-time"
          },
          "dateModified": {
            "type": "string",
            "format": "date-time"
          },
          "nameStatus": {
            "type": "string",
            "enum": [
              "Scheduled",
              "Cancelled",
              "Postponed"
            ]
          },
          "urlParty": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "EventListResponse": {
        "type": "object",
        "description": "Response format for event listings, containing main information needed for list views",
        "required": [
          "partylist"
        ],
        "properties": {
          "partylist": {
            "type": "object",
            "required": [
              "id",
              "nameParty",
              "dateStart",
              "dateEnd",
              "nameCountry",
              "isoCountry"
            ],
            "properties": {
              "urlPartyJson": {
                "type": "string",
                "format": "uri"
              },
              "urlPartyJsonLD": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        },
        "allOf": [
          {
            "$ref": "#/components/schemas/EventBase"
          }
        ]
      },
      "EventJson": {
        "type": "object",
        "description": "Detailed event information format with extended text fields",
        "required": [
          "party"
        ],
        "properties": {
          "party": {
            "type": "object",
            "required": [
              "id",
              "nameParty",
              "dateStart",
              "dateEnd",
              "nameCountry",
              "isoCountry"
            ],
            "properties": {
              "textLineUp": {
                "type": "string"
              },
              "textLocation": {
                "type": "string"
              },
              "textEntryFee": {
                "type": "string"
              },
              "textMore": {
                "type": "string"
              },
              "textOrganizer": {
                "type": "string"
              }
            },
            "allOf": [
              {
                "$ref": "#/components/schemas/EventBase"
              }
            ]
          }
        }
      },
      "EventJsonLD": {
        "type": "object",
        "required": [
          "@context",
          "@type",
          "name",
          "startDate",
          "endDate",
          "location"
        ],
        "properties": {
          "@context": {
            "type": "string",
            "const": "https://schema.org/"
          },
          "@type": {
            "type": "string",
            "enum": [
              "Festival",
              "DanceEvent"
            ],
            "description": "Type of the event. Can be either 'Festival' for multi-day/large events or 'DanceEvent' for club events and parties"
          },
          "@id": {
            "type": "string",
            "format": "uri"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "inLanguage": {
            "type": "string",
            "pattern": "^[a-z]{2}$"
          },
          "sameAs": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uri"
            }
          },
          "name": {
            "type": "string"
          },
          "startDate": {
            "type": "string",
            "format": "date-time",
            "description": "Event start time in ISO 8601 format. All times are stored in Europe/Berlin timezone but displayed with their local UTC offset. Example: '2025-05-22T10:00:00+02:00'",
            "example": "2025-05-22T10:00:00+02:00"
          },
          "endDate": {
            "type": "string",
            "format": "date-time",
            "description": "Event end time in ISO 8601 format. All times are stored in Europe/Berlin timezone but displayed with their local UTC offset. Example: '2025-05-25T03:00:00+02:00'",
            "example": "2025-05-25T03:00:00+02:00"
          },
          "duration": {
            "type": "string",
            "pattern": "^P(\\d{1,2}D)?(T\\d{1,2}H)?$"
          },
          "timeZone": {
            "type": "string",
            "description": "The timezone identifier for the event location. While dates are stored in Europe/Berlin, this field indicates the actual event timezone",
            "example": "Europe/London"
          },
          "eventAttendanceMode": {
            "type": "string",
            "const": "https://schema.org/OfflineEventAttendanceMode"
          },
          "eventStatus": {
            "type": "string",
            "enum": [
              "https://schema.org/EventScheduled",
              "https://schema.org/EventCancelled",
              "https://schema.org/EventPostponed"
            ]
          },
          "description": {
            "type": "string"
          },
          "performers": {
            "type": "string"
          },
          "image": {
            "$ref": "#/components/schemas/ImageObject"
          },
          "offers": {
            "$ref": "#/components/schemas/Offer"
          },
          "location": {
            "$ref": "#/components/schemas/Place"
          },
          "organizer": {
            "$ref": "#/components/schemas/Organization"
          },
          "accessibilityHazard": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "flashing",
                "sound",
                "noiseIntense",
                "visualEffect",
                "crowded"
              ]
            }
          },
          "mainEntityOfPage": {
            "$ref": "#/components/schemas/WebPage"
          }
        }
      },
      "Place": {
        "type": "object",
        "properties": {
          "@type": {
            "type": "string",
            "const": "Place"
          },
          "name": {
            "type": "string"
          },
          "address": {
            "$ref": "#/components/schemas/PostalAddress"
          },
          "geo": {
            "$ref": "#/components/schemas/GeoCoordinates"
          },
          "hasMap": {
            "$ref": "#/components/schemas/VirtualLocation"
          }
        }
      },
      "PostalAddress": {
        "type": "object",
        "properties": {
          "@type": {
            "type": "string",
            "const": "PostalAddress"
          },
          "addressCountry": {
            "type": "string"
          },
          "streetAddress": {
            "type": "string"
          },
          "addressLocality": {
            "type": "string"
          },
          "postalCode": {
            "type": "string"
          }
        }
      },
      "GeoCoordinates": {
        "type": "object",
        "properties": {
          "@type": {
            "type": "string",
            "const": "GeoCoordinates"
          },
          "latitude": {
            "type": "number",
            "minimum": -90,
            "maximum": 90
          },
          "longitude": {
            "type": "number",
            "minimum": -180,
            "maximum": 180
          }
        }
      },
      "ImageObject": {
        "type": "object",
        "properties": {
          "@type": {
            "type": "string",
            "const": "ImageObject"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "thumbnailUrl": {
            "type": "string",
            "format": "uri"
          },
          "width": {
            "type": "integer"
          },
          "height": {
            "type": "integer"
          },
          "caption": {
            "type": "string"
          }
        }
      },
      "Organization": {
        "type": "object",
        "properties": {
          "@type": {
            "type": "string",
            "const": "Organization"
          },
          "name": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "Offer": {
        "type": "object",
        "properties": {
          "@type": {
            "type": "string",
            "const": "Offer"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "price": {
            "type": "number"
          },
          "priceCurrency": {
            "type": "string",
            "pattern": "^[A-Z]{3}$"
          },
          "availability": {
            "type": "string",
            "enum": [
              "https://schema.org/InStock",
              "https://schema.org/SoldOut"
            ]
          },
          "validFrom": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "VirtualLocation": {
        "type": "object",
        "properties": {
          "@type": {
            "type": "string",
            "const": "VirtualLocation"
          },
          "url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "WebPage": {
        "type": "object",
        "properties": {
          "@type": {
            "type": "string",
            "const": "WebPage"
          },
          "@id": {
            "type": "string",
            "format": "uri"
          },
          "workTranslation": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "@type": {
                  "type": "string",
                  "const": "WebPage"
                },
                "@id": {
                  "type": "string",
                  "format": "uri"
                },
                "inLanguage": {
                  "type": "string",
                  "pattern": "^[a-z]{2}$"
                }
              }
            }
          }
        }
      },
      "WeatherForecast": {
        "type": "object",
        "properties": {
          "@type": {
            "type": "string",
            "const": "WeatherForecast"
          },
          "id": {
            "type": "string"
          },
          "temperature": {
            "type": "object",
            "properties": {
              "@type": {
                "type": "string",
                "const": "QuantitativeValue"
              },
              "value": {
                "type": "number"
              },
              "unitCode": {
                "type": "string",
                "enum": [
                  "CEL"
                ]
              }
            }
          },
          "feelsLikeTemperature": {
            "type": "object",
            "properties": {
              "@type": {
                "type": "string",
                "const": "QuantitativeValue"
              },
              "value": {
                "type": "number"
              },
              "unitCode": {
                "type": "string",
                "enum": [
                  "CEL"
                ]
              }
            }
          },
          "windSpeed": {
            "type": "object",
            "properties": {
              "@type": {
                "type": "string",
                "const": "QuantitativeValue"
              },
              "value": {
                "type": "number"
              },
              "unitCode": {
                "type": "string",
                "enum": [
                  "KMH"
                ]
              }
            }
          },
          "relativeHumidity": {
            "type": "object",
            "properties": {
              "@type": {
                "type": "string",
                "const": "QuantitativeValue"
              },
              "value": {
                "type": "number",
                "minimum": 0,
                "maximum": 100
              }
            }
          },
          "weatherType": {
            "type": "string"
          },
          "validFrom": {
            "type": "string",
            "format": "date-time"
          },
          "validUntil": {
            "type": "string",
            "format": "date-time"
          },
          "dataProvider": {
            "$ref": "#/components/schemas/Organization"
          }
        }
      }
    }
  }
}