{
    "openapi": "3.0.3",
    "info": {
        "title": "HOPS24 Partner API",
        "version": "1.0.0",
        "description": "Bouncy castles, event machines, party equipment and kids’ entertainment from local rental companies in Germany, Austria, Switzerland, France, Belgium, the Netherlands, Luxembourg, Spain and Italy. Sandbox: use a hk_test_… key; real listings from 20 Oct 2026."
    },
    "servers": [
        {
            "url": "https://hops24.net/api/v1"
        }
    ],
    "components": {
        "securitySchemes": {
            "bearer": {
                "type": "http",
                "scheme": "bearer"
            }
        }
    },
    "security": [
        {
            "bearer": []
        }
    ],
    "paths": {
        "/status": {
            "get": {
                "summary": "Checks the key and shows plan, scopes and usage for the current month.",
                "description": "Prüft den Schlüssel und zeigt Paket, Rechte und Verbrauch im laufenden Monat.",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "OK – {\"data\": …, \"meta\": …}"
                    },
                    "201": {
                        "description": "Created"
                    },
                    "422": {
                        "description": "invalid / consent_required / publication_requirements"
                    },
                    "400": {
                        "description": "invalid_parameter"
                    },
                    "401": {
                        "description": "unauthorized"
                    },
                    "403": {
                        "description": "insufficient_scope / no_provider_account / provider_approval_required / origin_not_allowed / client_suspended"
                    },
                    "404": {
                        "description": "not_found"
                    },
                    "409": {
                        "description": "idempotency_conflict"
                    },
                    "412": {
                        "description": "version_conflict"
                    },
                    "428": {
                        "description": "precondition_required"
                    },
                    "503": {
                        "description": "temporarily_unavailable (Retry-After; mit demselben Idempotency-Key wiederholen)"
                    },
                    "429": {
                        "description": "rate_limited / quota_exceeded"
                    }
                }
            }
        },
        "/categories": {
            "get": {
                "summary": "All categories with translations (de, en, es, fr, nl, it, pt).",
                "description": "Alle Kategorien mit Übersetzungen (de, en, es, fr, nl, it, pt). (Scope: listings:read)",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "OK – {\"data\": …, \"meta\": …}"
                    },
                    "201": {
                        "description": "Created"
                    },
                    "422": {
                        "description": "invalid / consent_required / publication_requirements"
                    },
                    "400": {
                        "description": "invalid_parameter"
                    },
                    "401": {
                        "description": "unauthorized"
                    },
                    "403": {
                        "description": "insufficient_scope / no_provider_account / provider_approval_required / origin_not_allowed / client_suspended"
                    },
                    "404": {
                        "description": "not_found"
                    },
                    "409": {
                        "description": "idempotency_conflict"
                    },
                    "412": {
                        "description": "version_conflict"
                    },
                    "428": {
                        "description": "precondition_required"
                    },
                    "503": {
                        "description": "temporarily_unavailable (Retry-After; mit demselben Idempotency-Key wiederholen)"
                    },
                    "429": {
                        "description": "rate_limited / quota_exceeded"
                    }
                }
            }
        },
        "/changes": {
            "get": {
                "summary": "Public changes and removals after a cursor. Poll about every 60 seconds; reload details. Events are kept for 90 days – if your cursor is older, meta.resync_required asks for a full resync.",
                "description": "Öffentliche Änderungen und Rücknahmen seit einem Cursor. Abruf etwa alle 60 Sekunden; Details erneut laden. Ereignisse werden 90 Tage aufbewahrt – liegt dein Cursor davor, meldet meta.resync_required einen vollständigen Neuabgleich. (Scope: listings:read)",
                "parameters": [
                    {
                        "name": "after",
                        "in": "query",
                        "required": false,
                        "description": "Last processed change ID, initially 0",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "limit",
                        "in": "query",
                        "required": false,
                        "description": "Up to 200 changes",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK – {\"data\": …, \"meta\": …}"
                    },
                    "201": {
                        "description": "Created"
                    },
                    "422": {
                        "description": "invalid / consent_required / publication_requirements"
                    },
                    "400": {
                        "description": "invalid_parameter"
                    },
                    "401": {
                        "description": "unauthorized"
                    },
                    "403": {
                        "description": "insufficient_scope / no_provider_account / provider_approval_required / origin_not_allowed / client_suspended"
                    },
                    "404": {
                        "description": "not_found"
                    },
                    "409": {
                        "description": "idempotency_conflict"
                    },
                    "412": {
                        "description": "version_conflict"
                    },
                    "428": {
                        "description": "precondition_required"
                    },
                    "503": {
                        "description": "temporarily_unavailable (Retry-After; mit demselben Idempotency-Key wiederholen)"
                    },
                    "429": {
                        "description": "rate_limited / quota_exceeded"
                    }
                }
            }
        },
        "/listings": {
            "get": {
                "summary": "Search public listings. Same logic as the search on hops24.de.",
                "description": "Suche nach öffentlichen Angeboten. Gleiche Logik wie die Suche auf hops24.de. (Scope: listings:read)",
                "parameters": [
                    {
                        "name": "q",
                        "in": "query",
                        "required": false,
                        "description": "Free text (title, city, description)",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "country",
                        "in": "query",
                        "required": false,
                        "description": "Country (US, MX, BR, AR); default US. Returns listings of providers in or serving this country",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "postal_code",
                        "in": "query",
                        "required": false,
                        "description": "Postcode or city; respects delivery areas (venues: location of the venue)",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "lat",
                        "in": "query",
                        "required": false,
                        "description": "Coordinates; finds providers whose delivery radius covers the point and venues within 25 km",
                        "schema": {
                            "type": "number"
                        }
                    },
                    {
                        "name": "lng",
                        "in": "query",
                        "required": false,
                        "description": "Coordinates; finds providers whose delivery radius covers the point and venues within 25 km",
                        "schema": {
                            "type": "number"
                        }
                    },
                    {
                        "name": "category",
                        "in": "query",
                        "required": false,
                        "description": "Category key from /categories",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "date",
                        "in": "query",
                        "required": false,
                        "description": "Only listings available on this day",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "max_price",
                        "in": "query",
                        "required": false,
                        "description": "Maximum “from” price in the listing currency",
                        "schema": {
                            "type": "number"
                        }
                    },
                    {
                        "name": "placement",
                        "in": "query",
                        "required": false,
                        "description": "Only listings offering long-term placement",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "self_pickup",
                        "in": "query",
                        "required": false,
                        "description": "Only with self pickup",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "sort",
                        "in": "query",
                        "required": false,
                        "description": "newest (default), price, distance (requires lat/lng)",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Page (from 1) and results per page (1–50, default 20)",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Page (from 1) and results per page (1–50, default 20)",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK – {\"data\": …, \"meta\": …}"
                    },
                    "201": {
                        "description": "Created"
                    },
                    "422": {
                        "description": "invalid / consent_required / publication_requirements"
                    },
                    "400": {
                        "description": "invalid_parameter"
                    },
                    "401": {
                        "description": "unauthorized"
                    },
                    "403": {
                        "description": "insufficient_scope / no_provider_account / provider_approval_required / origin_not_allowed / client_suspended"
                    },
                    "404": {
                        "description": "not_found"
                    },
                    "409": {
                        "description": "idempotency_conflict"
                    },
                    "412": {
                        "description": "version_conflict"
                    },
                    "428": {
                        "description": "precondition_required"
                    },
                    "503": {
                        "description": "temporarily_unavailable (Retry-After; mit demselben Idempotency-Key wiederholen)"
                    },
                    "429": {
                        "description": "rate_limited / quota_exceeded"
                    }
                }
            }
        },
        "/listings/{id}": {
            "get": {
                "summary": "Listing details incl. description, all images and technical details.",
                "description": "Details eines Angebots inkl. Beschreibung, aller Bilder und technischer Angaben. (Scope: listings:read)",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK – {\"data\": …, \"meta\": …}"
                    },
                    "201": {
                        "description": "Created"
                    },
                    "422": {
                        "description": "invalid / consent_required / publication_requirements"
                    },
                    "400": {
                        "description": "invalid_parameter"
                    },
                    "401": {
                        "description": "unauthorized"
                    },
                    "403": {
                        "description": "insufficient_scope / no_provider_account / provider_approval_required / origin_not_allowed / client_suspended"
                    },
                    "404": {
                        "description": "not_found"
                    },
                    "409": {
                        "description": "idempotency_conflict"
                    },
                    "412": {
                        "description": "version_conflict"
                    },
                    "428": {
                        "description": "precondition_required"
                    },
                    "503": {
                        "description": "temporarily_unavailable (Retry-After; mit demselben Idempotency-Key wiederholen)"
                    },
                    "429": {
                        "description": "rate_limited / quota_exceeded"
                    }
                }
            }
        },
        "/listings/{id}/availability": {
            "get": {
                "summary": "Unavailable days of a listing from today. If the provider has several identical units for the listing, a day is only unavailable once no unit is free.",
                "description": "Nicht verfügbare Tage eines Angebots ab heute. Hat der Anbieter mehrere gleiche Geräte für das Angebot, ist ein Tag erst belegt, wenn kein Gerät mehr frei ist. (Scope: availability:read)",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "months",
                        "in": "query",
                        "required": false,
                        "description": "Period in months (1–12, default 3)",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK – {\"data\": …, \"meta\": …}"
                    },
                    "201": {
                        "description": "Created"
                    },
                    "422": {
                        "description": "invalid / consent_required / publication_requirements"
                    },
                    "400": {
                        "description": "invalid_parameter"
                    },
                    "401": {
                        "description": "unauthorized"
                    },
                    "403": {
                        "description": "insufficient_scope / no_provider_account / provider_approval_required / origin_not_allowed / client_suspended"
                    },
                    "404": {
                        "description": "not_found"
                    },
                    "409": {
                        "description": "idempotency_conflict"
                    },
                    "412": {
                        "description": "version_conflict"
                    },
                    "428": {
                        "description": "precondition_required"
                    },
                    "503": {
                        "description": "temporarily_unavailable (Retry-After; mit demselben Idempotency-Key wiederholen)"
                    },
                    "429": {
                        "description": "rate_limited / quota_exceeded"
                    }
                }
            }
        },
        "/inquiries": {
            "post": {
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "listing_id": {
                                        "type": "integer",
                                        "description": "Listing (required)"
                                    },
                                    "name": {
                                        "type": "string",
                                        "description": "Customer name and email (required)"
                                    },
                                    "email": {
                                        "type": "string",
                                        "description": "Customer name and email (required)"
                                    },
                                    "event_date": {
                                        "type": "string",
                                        "description": "Requested date or placement start (required)"
                                    },
                                    "event_end_date": {
                                        "type": "string",
                                        "description": "End date for multi-day events"
                                    },
                                    "request_type": {
                                        "type": "string",
                                        "description": "event (default) or placement (only if placement_available)"
                                    },
                                    "placement_location": {
                                        "type": "string",
                                        "description": "Placement location (required for placement)"
                                    },
                                    "phone": {
                                        "type": "string",
                                        "description": "Optional"
                                    },
                                    "message": {
                                        "type": "string",
                                        "description": "Optional"
                                    },
                                    "lang": {
                                        "type": "string",
                                        "description": "Language of the confirmation email to the customer: de, en, es, fr, nl, it, pt (default: language of the instance)"
                                    },
                                    "consent": {
                                        "type": "boolean",
                                        "description": "Must be true: the customer agreed to the submission"
                                    },
                                    "review_consent": {
                                        "type": "boolean",
                                        "description": "Optional: the customer agrees to be asked once by email for a review after the date"
                                    }
                                }
                            }
                        }
                    }
                },
                "summary": "Submit a customer enquiry to the provider. It arrives in the provider’s HOPS24 inbox; the customer receives a confirmation. Returns 201. The Idempotency-Key header is required (also in the sandbox): retries with the same key return the same response for 30 days.",
                "description": "Kundenanfrage an den Anbieter übermitteln. Landet im HOPS24-Posteingang des Anbieters; der Kunde erhält eine Bestätigung. Antwort 201. Header Idempotency-Key ist Pflicht (auch in der Sandbox): Wiederholungen mit demselben Schlüssel liefern 30 Tage lang dieselbe Antwort. (Scope: inquiries:create)",
                "parameters": [
                    {
                        "name": "Idempotency-Key",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "minLength": 8,
                            "maxLength": 128
                        },
                        "description": "Stable unique key for each request; retries use the same key and body. Required (also in the sandbox)."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK – {\"data\": …, \"meta\": …}"
                    },
                    "201": {
                        "description": "Created"
                    },
                    "422": {
                        "description": "invalid / consent_required / publication_requirements"
                    },
                    "400": {
                        "description": "invalid_parameter"
                    },
                    "401": {
                        "description": "unauthorized"
                    },
                    "403": {
                        "description": "insufficient_scope / no_provider_account / provider_approval_required / origin_not_allowed / client_suspended"
                    },
                    "404": {
                        "description": "not_found"
                    },
                    "409": {
                        "description": "idempotency_conflict"
                    },
                    "412": {
                        "description": "version_conflict"
                    },
                    "428": {
                        "description": "precondition_required"
                    },
                    "503": {
                        "description": "temporarily_unavailable (Retry-After; mit demselben Idempotency-Key wiederholen)"
                    },
                    "429": {
                        "description": "rate_limited / quota_exceeded"
                    }
                }
            }
        },
        "/webhooks": {
            "get": {
                "summary": "Your webhooks with delivery status.",
                "description": "Eigene Webhooks mit Zustellstatus. (Scope: webhooks)",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "OK – {\"data\": …, \"meta\": …}"
                    },
                    "201": {
                        "description": "Created"
                    },
                    "422": {
                        "description": "invalid / consent_required / publication_requirements"
                    },
                    "400": {
                        "description": "invalid_parameter"
                    },
                    "401": {
                        "description": "unauthorized"
                    },
                    "403": {
                        "description": "insufficient_scope / no_provider_account / provider_approval_required / origin_not_allowed / client_suspended"
                    },
                    "404": {
                        "description": "not_found"
                    },
                    "409": {
                        "description": "idempotency_conflict"
                    },
                    "412": {
                        "description": "version_conflict"
                    },
                    "428": {
                        "description": "precondition_required"
                    },
                    "503": {
                        "description": "temporarily_unavailable (Retry-After; mit demselben Idempotency-Key wiederholen)"
                    },
                    "429": {
                        "description": "rate_limited / quota_exceeded"
                    }
                }
            },
            "post": {
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "url": {
                                        "type": "string",
                                        "description": "Target URL (https only, publicly reachable)"
                                    },
                                    "events": {
                                        "type": "array",
                                        "description": "inquiry.created, listing.updated, availability.changed, listing.removed (inquiry.replied discontinued since 2026-10-05)",
                                        "items": {
                                            "type": "string"
                                        }
                                    }
                                }
                            }
                        }
                    }
                },
                "summary": "Create a webhook. The signing secret is only shown in this response.",
                "description": "Webhook anlegen. Das Secret zur Signaturprüfung wird nur in dieser Antwort angezeigt. (Scope: webhooks)",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "OK – {\"data\": …, \"meta\": …}"
                    },
                    "201": {
                        "description": "Created"
                    },
                    "422": {
                        "description": "invalid / consent_required / publication_requirements"
                    },
                    "400": {
                        "description": "invalid_parameter"
                    },
                    "401": {
                        "description": "unauthorized"
                    },
                    "403": {
                        "description": "insufficient_scope / no_provider_account / provider_approval_required / origin_not_allowed / client_suspended"
                    },
                    "404": {
                        "description": "not_found"
                    },
                    "409": {
                        "description": "idempotency_conflict"
                    },
                    "412": {
                        "description": "version_conflict"
                    },
                    "428": {
                        "description": "precondition_required"
                    },
                    "503": {
                        "description": "temporarily_unavailable (Retry-After; mit demselben Idempotency-Key wiederholen)"
                    },
                    "429": {
                        "description": "rate_limited / quota_exceeded"
                    }
                }
            }
        },
        "/webhooks/{id}/test": {
            "post": {
                "summary": "Send a webhook.test event.",
                "description": "Testereignis webhook.test senden. (Scope: webhooks)",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK – {\"data\": …, \"meta\": …}"
                    },
                    "201": {
                        "description": "Created"
                    },
                    "422": {
                        "description": "invalid / consent_required / publication_requirements"
                    },
                    "400": {
                        "description": "invalid_parameter"
                    },
                    "401": {
                        "description": "unauthorized"
                    },
                    "403": {
                        "description": "insufficient_scope / no_provider_account / provider_approval_required / origin_not_allowed / client_suspended"
                    },
                    "404": {
                        "description": "not_found"
                    },
                    "409": {
                        "description": "idempotency_conflict"
                    },
                    "412": {
                        "description": "version_conflict"
                    },
                    "428": {
                        "description": "precondition_required"
                    },
                    "503": {
                        "description": "temporarily_unavailable (Retry-After; mit demselben Idempotency-Key wiederholen)"
                    },
                    "429": {
                        "description": "rate_limited / quota_exceeded"
                    }
                }
            }
        },
        "/webhooks/{id}": {
            "delete": {
                "summary": "Delete a webhook.",
                "description": "Webhook löschen. (Scope: webhooks)",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK – {\"data\": …, \"meta\": …}"
                    },
                    "201": {
                        "description": "Created"
                    },
                    "422": {
                        "description": "invalid / consent_required / publication_requirements"
                    },
                    "400": {
                        "description": "invalid_parameter"
                    },
                    "401": {
                        "description": "unauthorized"
                    },
                    "403": {
                        "description": "insufficient_scope / no_provider_account / provider_approval_required / origin_not_allowed / client_suspended"
                    },
                    "404": {
                        "description": "not_found"
                    },
                    "409": {
                        "description": "idempotency_conflict"
                    },
                    "412": {
                        "description": "version_conflict"
                    },
                    "428": {
                        "description": "precondition_required"
                    },
                    "503": {
                        "description": "temporarily_unavailable (Retry-After; mit demselben Idempotency-Key wiederholen)"
                    },
                    "429": {
                        "description": "rate_limited / quota_exceeded"
                    }
                }
            }
        },
        "/me/listings": {
            "get": {
                "summary": "Provider integration: your own listings incl. inactive ones, with external_ref (key must be linked to a provider account).",
                "description": "Anbieter-Integration: eigene Angebote inkl. inaktiver, mit external_ref (Schlüssel muss mit einem Anbieterkonto verknüpft sein). (Scope: own:listings:write | own:inquiries:read | own:listings:sync)",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "OK – {\"data\": …, \"meta\": …}"
                    },
                    "201": {
                        "description": "Created"
                    },
                    "422": {
                        "description": "invalid / consent_required / publication_requirements"
                    },
                    "400": {
                        "description": "invalid_parameter"
                    },
                    "401": {
                        "description": "unauthorized"
                    },
                    "403": {
                        "description": "insufficient_scope / no_provider_account / provider_approval_required / origin_not_allowed / client_suspended"
                    },
                    "404": {
                        "description": "not_found"
                    },
                    "409": {
                        "description": "idempotency_conflict"
                    },
                    "412": {
                        "description": "version_conflict"
                    },
                    "428": {
                        "description": "precondition_required"
                    },
                    "503": {
                        "description": "temporarily_unavailable (Retry-After; mit demselben Idempotency-Key wiederholen)"
                    },
                    "429": {
                        "description": "rate_limited / quota_exceeded"
                    }
                }
            }
        },
        "/me/listings/sync": {
            "post": {
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "listings": {
                                        "type": "array",
                                        "description": "1–200 listings: external_ref (required, max. 100 chars), title (3–150, required to create), description, category (key from /categories), city, prices {from, daily, weekend, delivery, setup, deposit, placement_monthly, hourly}, sale {price, condition (new|used|demo), quantity, shipping (pickup|shipping|both), shipping_price, delivery_time, year, warranty} or false, details {dimensions, age_group, power_required, setup_duration, turnaround_days, cancellation_policy, weather_guarantee, self_pickup_allowed, deposit_cash_allowed, service_duration}, placement_available, images (list of https URLs; an empty list removes the source’s photos), active (bool)",
                                        "items": {
                                            "type": "string"
                                        }
                                    },
                                    "mode": {
                                        "type": "string",
                                        "description": "partial (default: only the listings sent) or full (full sync: missing listings of this connection go offline; safeguard: if a full sync delivers less than half, nothing is taken offline)"
                                    },
                                    "sync_session": {
                                        "type": "integer",
                                        "description": "For mode full in parts: value of meta.sync_session from the first response (valid for 24 hours)"
                                    },
                                    "complete": {
                                        "type": "boolean",
                                        "description": "Last part of a full sync (default true)"
                                    }
                                }
                            }
                        }
                    }
                },
                "summary": "Create and sync your own listings from your software (free on all plans, one call counts once). Matched by external_ref (SKU): create, update, and with mode full take listings no longer sent offline – never deleted. Only fields you send are changed. New listings go online once the minimum details are met (otherwise draft, see problems), unless active: false. Photos are loaded by URL (once per address, max. 5 per listing, 200 new per day). The Idempotency-Key header is required. More than 200 listings: send mode full in parts, pass sync_session from the first response and set complete: true in the last part.",
                "description": "Eigene Angebote aus deiner Software anlegen und abgleichen (in allen Tarifen kostenlos, ein Aufruf zählt einmal). Zuordnung über external_ref (Artikelnummer): neu anlegen, ändern, mit mode full nicht mehr gelieferte offline nehmen – nie löschen. Nur gelieferte Felder werden geändert. Neue Angebote gehen online, sobald die Mindestangaben erfüllt sind (sonst Entwurf, siehe problems), außer mit active: false. Fotos werden per URL geladen (je Adresse einmal, max. 5 je Angebot, 200 neue je Tag). Header Idempotency-Key ist Pflicht. Mehr als 200 Angebote: mode full in Teilen senden, sync_session aus der ersten Antwort mitschicken und im letzten Teil complete: true setzen. (Scope: own:listings:sync)",
                "parameters": [
                    {
                        "name": "Idempotency-Key",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "minLength": 8,
                            "maxLength": 128
                        },
                        "description": "Stable unique key for each request; retries use the same key and body (kept 30 days)."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK – {\"data\": …, \"meta\": …}"
                    },
                    "201": {
                        "description": "Created"
                    },
                    "422": {
                        "description": "invalid / consent_required / publication_requirements"
                    },
                    "400": {
                        "description": "invalid_parameter"
                    },
                    "401": {
                        "description": "unauthorized"
                    },
                    "403": {
                        "description": "insufficient_scope / no_provider_account / provider_approval_required / origin_not_allowed / client_suspended"
                    },
                    "404": {
                        "description": "not_found"
                    },
                    "409": {
                        "description": "idempotency_conflict"
                    },
                    "412": {
                        "description": "version_conflict"
                    },
                    "428": {
                        "description": "precondition_required"
                    },
                    "503": {
                        "description": "temporarily_unavailable (Retry-After; mit demselben Idempotency-Key wiederholen)"
                    },
                    "429": {
                        "description": "rate_limited / quota_exceeded"
                    }
                }
            }
        },
        "/me/listings/by-ref/{external_ref}": {
            "put": {
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "title": {
                                        "type": "object",
                                        "description": "as for /me/listings/sync"
                                    },
                                    "description": {
                                        "type": "object",
                                        "description": "as for /me/listings/sync"
                                    },
                                    "category": {
                                        "type": "object",
                                        "description": "as for /me/listings/sync"
                                    },
                                    "city": {
                                        "type": "object",
                                        "description": "as for /me/listings/sync"
                                    },
                                    "prices": {
                                        "type": "object",
                                        "description": "as for /me/listings/sync"
                                    },
                                    "sale": {
                                        "type": "object",
                                        "description": "as for /me/listings/sync"
                                    },
                                    "details": {
                                        "type": "object",
                                        "description": "as for /me/listings/sync"
                                    },
                                    "images": {
                                        "type": "object",
                                        "description": "as for /me/listings/sync"
                                    },
                                    "active": {
                                        "type": "object",
                                        "description": "as for /me/listings/sync"
                                    }
                                }
                            }
                        }
                    }
                },
                "summary": "Create or update one listing by its reference (same fields as an entry of /me/listings/sync). Returns 201 when created, otherwise 200, with ETag. If-Match is optional; when set and the listing has changed meanwhile, 412 follows.",
                "description": "Ein Angebot über seine Kennung anlegen oder ändern (gleiche Felder wie ein Eintrag von /me/listings/sync). Antwort 201 beim Anlegen, sonst 200, mit ETag. If-Match ist optional; ist er gesetzt und das Angebot inzwischen geändert, folgt 412. (Scope: own:listings:sync)",
                "parameters": [
                    {
                        "name": "external_ref",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "maxLength": 100
                        }
                    },
                    {
                        "name": "If-Match",
                        "in": "header",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Optional quoted version; stale: 412."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK – {\"data\": …, \"meta\": …}"
                    },
                    "201": {
                        "description": "Created"
                    },
                    "422": {
                        "description": "invalid / consent_required / publication_requirements"
                    },
                    "400": {
                        "description": "invalid_parameter"
                    },
                    "401": {
                        "description": "unauthorized"
                    },
                    "403": {
                        "description": "insufficient_scope / no_provider_account / provider_approval_required / origin_not_allowed / client_suspended"
                    },
                    "404": {
                        "description": "not_found"
                    },
                    "409": {
                        "description": "idempotency_conflict"
                    },
                    "412": {
                        "description": "version_conflict"
                    },
                    "428": {
                        "description": "precondition_required"
                    },
                    "503": {
                        "description": "temporarily_unavailable (Retry-After; mit demselben Idempotency-Key wiederholen)"
                    },
                    "429": {
                        "description": "rate_limited / quota_exceeded"
                    }
                }
            }
        },
        "/me/sync/runs": {
            "get": {
                "summary": "The last 20 syncs of this connection with counts and notes (codes per external_ref). Reports are kept for 90 days.",
                "description": "Die letzten 20 Abgleiche dieser Verbindung mit Zählungen und Hinweisen (Codes je external_ref). Berichte werden 90 Tage aufbewahrt. (Scope: own:listings:sync)",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "OK – {\"data\": …, \"meta\": …}"
                    },
                    "201": {
                        "description": "Created"
                    },
                    "422": {
                        "description": "invalid / consent_required / publication_requirements"
                    },
                    "400": {
                        "description": "invalid_parameter"
                    },
                    "401": {
                        "description": "unauthorized"
                    },
                    "403": {
                        "description": "insufficient_scope / no_provider_account / provider_approval_required / origin_not_allowed / client_suspended"
                    },
                    "404": {
                        "description": "not_found"
                    },
                    "409": {
                        "description": "idempotency_conflict"
                    },
                    "412": {
                        "description": "version_conflict"
                    },
                    "428": {
                        "description": "precondition_required"
                    },
                    "503": {
                        "description": "temporarily_unavailable (Retry-After; mit demselben Idempotency-Key wiederholen)"
                    },
                    "429": {
                        "description": "rate_limited / quota_exceeded"
                    }
                }
            }
        },
        "/me/listings/{id}": {
            "patch": {
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "title": {
                                        "type": "string",
                                        "description": "Title (3–150 chars), description"
                                    },
                                    "description": {
                                        "type": "string",
                                        "description": "Title (3–150 chars), description"
                                    },
                                    "prices": {
                                        "type": "object",
                                        "description": "from, daily, weekend, delivery, setup, deposit, placement_monthly, hourly (in the listing currency, null clears; hourly only for services)"
                                    },
                                    "is_active": {
                                        "type": "boolean",
                                        "description": "Activate/deactivate the listing"
                                    }
                                }
                            }
                        }
                    }
                },
                "summary": "Update your own listing using If-Match (version from GET /me/listings). Provider approval required. Activation requires the same minimum details as in the dashboard.",
                "description": "Eigenes Angebot mit If-Match ändern (version aus GET /me/listings). Anbieterfreigabe erforderlich. Beim Aktivieren gelten dieselben Mindestanforderungen wie im Dashboard. (Scope: own:listings:write)",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "If-Match",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Quoted version from GET /me/listings. Stale: 412; absent: 428."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK – {\"data\": …, \"meta\": …}"
                    },
                    "201": {
                        "description": "Created"
                    },
                    "422": {
                        "description": "invalid / consent_required / publication_requirements"
                    },
                    "400": {
                        "description": "invalid_parameter"
                    },
                    "401": {
                        "description": "unauthorized"
                    },
                    "403": {
                        "description": "insufficient_scope / no_provider_account / provider_approval_required / origin_not_allowed / client_suspended"
                    },
                    "404": {
                        "description": "not_found"
                    },
                    "409": {
                        "description": "idempotency_conflict"
                    },
                    "412": {
                        "description": "version_conflict"
                    },
                    "428": {
                        "description": "precondition_required"
                    },
                    "503": {
                        "description": "temporarily_unavailable (Retry-After; mit demselben Idempotency-Key wiederholen)"
                    },
                    "429": {
                        "description": "rate_limited / quota_exceeded"
                    }
                }
            }
        },
        "/me/inquiries": {
            "get": {
                "summary": "Your enquiries with status (new, open, booked, closed) and customer details. Since 2026-10-05 open replaces the former values waiting and answered (still accepted as filters).",
                "description": "Eigene Anfragen mit Status (new, open, booked, closed) und Kundendaten. Seit 05.10.2026 ersetzt open die früheren Werte waiting und answered (als Filter weiter angenommen). (Scope: own:inquiries:read)",
                "parameters": [
                    {
                        "name": "status",
                        "in": "query",
                        "required": false,
                        "description": "Filter by status",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK – {\"data\": …, \"meta\": …}"
                    },
                    "201": {
                        "description": "Created"
                    },
                    "422": {
                        "description": "invalid / consent_required / publication_requirements"
                    },
                    "400": {
                        "description": "invalid_parameter"
                    },
                    "401": {
                        "description": "unauthorized"
                    },
                    "403": {
                        "description": "insufficient_scope / no_provider_account / provider_approval_required / origin_not_allowed / client_suspended"
                    },
                    "404": {
                        "description": "not_found"
                    },
                    "409": {
                        "description": "idempotency_conflict"
                    },
                    "412": {
                        "description": "version_conflict"
                    },
                    "428": {
                        "description": "precondition_required"
                    },
                    "503": {
                        "description": "temporarily_unavailable (Retry-After; mit demselben Idempotency-Key wiederholen)"
                    },
                    "429": {
                        "description": "rate_limited / quota_exceeded"
                    }
                }
            }
        },
        "/me/bookings": {
            "get": {
                "summary": "Your orders within a period.",
                "description": "Eigene Aufträge in einem Zeitraum. (Scope: own:inquiries:read)",
                "parameters": [
                    {
                        "name": "from",
                        "in": "query",
                        "required": false,
                        "description": "Period (default: today to +12 months)",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "to",
                        "in": "query",
                        "required": false,
                        "description": "Period (default: today to +12 months)",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK – {\"data\": …, \"meta\": …}"
                    },
                    "201": {
                        "description": "Created"
                    },
                    "422": {
                        "description": "invalid / consent_required / publication_requirements"
                    },
                    "400": {
                        "description": "invalid_parameter"
                    },
                    "401": {
                        "description": "unauthorized"
                    },
                    "403": {
                        "description": "insufficient_scope / no_provider_account / provider_approval_required / origin_not_allowed / client_suspended"
                    },
                    "404": {
                        "description": "not_found"
                    },
                    "409": {
                        "description": "idempotency_conflict"
                    },
                    "412": {
                        "description": "version_conflict"
                    },
                    "428": {
                        "description": "precondition_required"
                    },
                    "503": {
                        "description": "temporarily_unavailable (Retry-After; mit demselben Idempotency-Key wiederholen)"
                    },
                    "429": {
                        "description": "rate_limited / quota_exceeded"
                    }
                }
            }
        },
        "/me/blocked-dates": {
            "get": {
                "summary": "Blocked days from today with source (manual, calendar_import, api) and deletable.",
                "description": "Gesperrte Tage ab heute mit Herkunft (manual, calendar_import, api) und deletable. (Scope: own:calendar:write)",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "OK – {\"data\": …, \"meta\": …}"
                    },
                    "201": {
                        "description": "Created"
                    },
                    "422": {
                        "description": "invalid / consent_required / publication_requirements"
                    },
                    "400": {
                        "description": "invalid_parameter"
                    },
                    "401": {
                        "description": "unauthorized"
                    },
                    "403": {
                        "description": "insufficient_scope / no_provider_account / provider_approval_required / origin_not_allowed / client_suspended"
                    },
                    "404": {
                        "description": "not_found"
                    },
                    "409": {
                        "description": "idempotency_conflict"
                    },
                    "412": {
                        "description": "version_conflict"
                    },
                    "428": {
                        "description": "precondition_required"
                    },
                    "503": {
                        "description": "temporarily_unavailable (Retry-After; mit demselben Idempotency-Key wiederholen)"
                    },
                    "429": {
                        "description": "rate_limited / quota_exceeded"
                    }
                }
            },
            "post": {
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "dates": {
                                        "type": "array",
                                        "description": "List of dates YYYY-MM-DD (max. 366)",
                                        "items": {
                                            "type": "string"
                                        }
                                    },
                                    "listing_id": {
                                        "type": "integer",
                                        "description": "Optional; omitted = all listings"
                                    },
                                    "reason": {
                                        "type": "string",
                                        "description": "Optional reason"
                                    }
                                }
                            }
                        }
                    }
                },
                "summary": "Block days (for one listing or all).",
                "description": "Tage sperren (für ein Angebot oder alle). (Scope: own:calendar:write)",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "OK – {\"data\": …, \"meta\": …}"
                    },
                    "201": {
                        "description": "Created"
                    },
                    "422": {
                        "description": "invalid / consent_required / publication_requirements"
                    },
                    "400": {
                        "description": "invalid_parameter"
                    },
                    "401": {
                        "description": "unauthorized"
                    },
                    "403": {
                        "description": "insufficient_scope / no_provider_account / provider_approval_required / origin_not_allowed / client_suspended"
                    },
                    "404": {
                        "description": "not_found"
                    },
                    "409": {
                        "description": "idempotency_conflict"
                    },
                    "412": {
                        "description": "version_conflict"
                    },
                    "428": {
                        "description": "precondition_required"
                    },
                    "503": {
                        "description": "temporarily_unavailable (Retry-After; mit demselben Idempotency-Key wiederholen)"
                    },
                    "429": {
                        "description": "rate_limited / quota_exceeded"
                    }
                }
            },
            "delete": {
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "dates": {
                                        "type": "array",
                                        "description": "List of dates YYYY-MM-DD",
                                        "items": {
                                            "type": "string"
                                        }
                                    },
                                    "listing_id": {
                                        "type": "integer",
                                        "description": "Optional"
                                    }
                                }
                            }
                        }
                    }
                },
                "summary": "Release only API blocks created by this connection; manual and imported blocks stay.",
                "description": "Nur die von dieser Verbindung erzeugten API-Sperrtage freigeben; manuelle Sperren und Kalender-Importe bleiben. (Scope: own:calendar:write)",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "OK – {\"data\": …, \"meta\": …}"
                    },
                    "201": {
                        "description": "Created"
                    },
                    "422": {
                        "description": "invalid / consent_required / publication_requirements"
                    },
                    "400": {
                        "description": "invalid_parameter"
                    },
                    "401": {
                        "description": "unauthorized"
                    },
                    "403": {
                        "description": "insufficient_scope / no_provider_account / provider_approval_required / origin_not_allowed / client_suspended"
                    },
                    "404": {
                        "description": "not_found"
                    },
                    "409": {
                        "description": "idempotency_conflict"
                    },
                    "412": {
                        "description": "version_conflict"
                    },
                    "428": {
                        "description": "precondition_required"
                    },
                    "503": {
                        "description": "temporarily_unavailable (Retry-After; mit demselben Idempotency-Key wiederholen)"
                    },
                    "429": {
                        "description": "rate_limited / quota_exceeded"
                    }
                }
            }
        }
    }
}