{
  "openapi": "3.1.1",
  "info": {
    "title": "Paydro organizer API",
    "version": "2.3.0",
    "description": "Existing Paydro organizer HTTP resources: reads, configuration writes, waiting-list invitations, attendee/order management, promotions, check-in, analytics and file downloads. Paths, model envelopes and legacy response formats are preserved. Only event detail has an explicit /api/v2 route; do not infer other v2 endpoints. Authenticate on your organizer origin, not the developer host. See /en-us/docs/writing-data for success/error handling, permissions, side effects and retry rules. Successful writes were source-reviewed, not executed against customer records; selected local synthetic reads and rejected writes were probed. UI/session-dependent flows and malformed promo-list JSON are described in guides rather than advertised as stable JSON contracts. Stage reads/SSE are explicitly public; organizer state writes and bulk event-note reads retain their existing authorization. See /en-us/docs/api-coverage for organizer-only workflows.",
    "contact": {
      "name": "Paydro integration support",
      "url": "https://developer.paydro.com/en-us/support"
    }
  },
  "servers": [
    {
      "url": "https://shop.paydro.com",
      "description": "Configured organizer/company API origin"
    }
  ],
  "security": [
    {
      "organizerBasic": []
    }
  ],
  "tags": [
    {
      "name": "Events",
      "description": "Discover events, create and update configuration, and manage shop status."
    },
    {
      "name": "Products",
      "description": "Create and manage ticket products, pricing and availability."
    },
    {
      "name": "Categories",
      "description": "Ticket groups: read, create, update, hide and delete event categories."
    },
    {
      "name": "Category questions",
      "description": "Read and manage registration question definitions and ticket snapshots."
    },
    {
      "name": "Orders",
      "description": "Order details, reservations, invoice actions, compact snapshots and changes."
    },
    {
      "name": "Attendees",
      "description": "Registration data, answers, ticket products, compact snapshots and changes."
    },
    {
      "name": "Waitinglists",
      "description": "List entries, issue invitations, remove entries and manage settings."
    },
    {
      "name": "Promo codes",
      "description": "Event promo codes and email invitations."
    },
    {
      "name": "Checkin",
      "description": "Active ticket check-in and scan management."
    },
    {
      "name": "Analytics",
      "description": "Event traffic projections."
    },
    {
      "name": "Supportingdata",
      "description": "Notes, favorites, company and organizer directories."
    },
    {
      "name": "Stages",
      "description": "Public display state reads and SSE; authenticated event-editor state replacement."
    },
    {
      "name": "Files",
      "description": "Event file uploads, attachment removal and document downloads."
    },
    {
      "name": "Exports",
      "description": "Download order, attendee, waiting-list, check-in and no-show CSV/Excel data."
    }
  ],
  "paths": {
    "/events/my.json": {
      "get": {
        "operationId": "listMyEvents",
        "summary": "List accessible events",
        "tags": ["Events"],
        "description": "Discover events through live company membership. Event names containing \"test\" are excluded. With no year the current and previous year are returned, capped at 2,000 events. Use a known test-event UUID for detail requests.",
        "parameters": [
          {
            "$ref": "#/components/parameters/year"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful JSON response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EventList"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; optional legacy fields are omitted.",
                    "value": {
                      "events": [
                        {
                          "Event": {
                            "id": "11111111-1111-4111-8111-111111111111",
                            "name": "Example conference",
                            "slug": "example-conference",
                            "currency": "EUR",
                            "timezone": "Europe/Amsterdam",
                            "start_date": "2026-11-20 09:00:00",
                            "end_date": "2026-11-20 18:00:00"
                          },
                          "Company": {
                            "name": "Example organization"
                          }
                        }
                      ],
                      "photo_info": [],
                      "oldest_available_year": 2026,
                      "loaded_years": [2026]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "description": "Invalid year parameter.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; optional legacy fields are omitted.",
                    "value": {
                      "error": "invalid_year",
                      "detail": "Year must be a four-digit number."
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/events/my.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/events/my.json');\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_HTTPHEADER => ['Accept: application/json'], CURLOPT_RETURNTRANSFER => true]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status !== 200) throw new RuntimeException('Paydro request failed');\n$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\ncurl_close($ch);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/events/my.json`, { headers: { Authorization: `Basic ${auth}`, Accept: 'application/json' }, redirect: 'error' });\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconsole.log(await response.json());"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.get(f\"{os.environ['PAYDRO_ORIGIN']}/events/my.json\", auth=(os.environ['PAYDRO_EMAIL'], os.environ['PAYDRO_PASSWORD']), headers={'Accept': 'application/json'}, allow_redirects=False, timeout=30)\nif response.status_code != 200:\n    raise RuntimeError(f'Paydro HTTP {response.status_code}')\ndata = response.json()"
          }
        ]
      }
    },
    "/api/v2/events/{event_id}": {
      "get": {
        "operationId": "getEvent",
        "summary": "Retrieve an event",
        "tags": ["Events"],
        "description": "The explicitly versioned event detail route returns a flattened Event object plus legacy settings. It is not a paginated event-list endpoint.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful JSON response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EventDetail"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; optional legacy fields are omitted.",
                    "value": {
                      "Event": {
                        "id": "11111111-1111-4111-8111-111111111111",
                        "name": "Example conference",
                        "slug": "example-conference",
                        "currency": "EUR",
                        "timezone": "Europe/Amsterdam",
                        "start_date": "2026-11-20 09:00:00",
                        "end_date": "2026-11-20 18:00:00"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/api/v2/events/$EVENT_ID\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/api/v2/events/' . getenv('EVENT_ID') . '');\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_HTTPHEADER => ['Accept: application/json'], CURLOPT_RETURNTRANSFER => true]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status !== 200) throw new RuntimeException('Paydro request failed');\n$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\ncurl_close($ch);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/api/v2/events/${process.env.EVENT_ID}`, { headers: { Authorization: `Basic ${auth}`, Accept: 'application/json' }, redirect: 'error' });\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconsole.log(await response.json());"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.get(f\"{os.environ['PAYDRO_ORIGIN']}/api/v2/events/{os.environ['EVENT_ID']}\", auth=(os.environ['PAYDRO_EMAIL'], os.environ['PAYDRO_PASSWORD']), headers={'Accept': 'application/json'}, allow_redirects=False, timeout=30)\nif response.status_code != 200:\n    raise RuntimeError(f'Paydro HTTP {response.status_code}')\ndata = response.json()"
          }
        ]
      }
    },
    "/{event_id}/products/index.json": {
      "get": {
        "operationId": "listProducts",
        "summary": "List ticket products",
        "tags": ["Products"],
        "description": "Array of serialized products, without a Category envelope. Price uses event currency; stock does not reserve a ticket. This resource is not paginated.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful JSON response.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Product"
                  }
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; optional legacy fields are omitted.",
                    "value": [
                      {
                        "id": "22222222-2222-4222-8222-222222222222",
                        "category_id": "11111111-1111-4111-8111-111111111111",
                        "title": "Day ticket",
                        "price": "25.00",
                        "stock": 100,
                        "visible": 1,
                        "repeating": false,
                        "package_flag": 0,
                        "connected_with_package": false
                      }
                    ]
                  }
                }
              }
            }
          },
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/$EVENT_ID/products/index.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/products/index.json');\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_HTTPHEADER => ['Accept: application/json'], CURLOPT_RETURNTRANSFER => true]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status !== 200) throw new RuntimeException('Paydro request failed');\n$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\ncurl_close($ch);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/products/index.json`, { headers: { Authorization: `Basic ${auth}`, Accept: 'application/json' }, redirect: 'error' });\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconsole.log(await response.json());"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.get(f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/products/index.json\", auth=(os.environ['PAYDRO_EMAIL'], os.environ['PAYDRO_PASSWORD']), headers={'Accept': 'application/json'}, allow_redirects=False, timeout=30)\nif response.status_code != 200:\n    raise RuntimeError(f'Paydro HTTP {response.status_code}')\ndata = response.json()"
          }
        ]
      }
    },
    "/{event_id}/orders/index/{filter}.json": {
      "get": {
        "operationId": "listOrders",
        "summary": "List orders",
        "tags": ["Orders"],
        "description": "Standard list returns 50 records per page by default. payment_state and is_paid are authoritative derived fields. Some numeric-looking strings are serialized as JSON numbers. No cursor or total envelope.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "name": "filter",
            "in": "path",
            "required": true,
            "description": "all: finalized/invoiced; recent: last year; pi: paid invoices; upi: unpaid invoices; op: online paid; nco: not cancelled; co: cancelled/credit; unfinished: unfinished or failed; reservation: reservations.",
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "recent",
                "failed",
                "pi",
                "upi",
                "op",
                "nco",
                "co",
                "unfinished",
                "reservation"
              ],
              "default": "all"
            }
          },
          {
            "$ref": "#/components/parameters/page"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful JSON response.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/OrderRecord"
                  }
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; optional legacy fields are omitted.",
                    "value": [
                      {
                        "Order": {
                          "id": "33333333-3333-4333-8333-333333333333",
                          "email": "alex@example.com",
                          "is_paid": true,
                          "payment_method": "online",
                          "payment_state": {
                            "channel": "provider",
                            "is_paid": true,
                            "settlement": "paid",
                            "lifecycle": "active"
                          }
                        }
                      }
                    ]
                  }
                }
              }
            }
          },
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/$EVENT_ID/orders/index/all.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/orders/index/all.json');\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_HTTPHEADER => ['Accept: application/json'], CURLOPT_RETURNTRANSFER => true]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status !== 200) throw new RuntimeException('Paydro request failed');\n$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\ncurl_close($ch);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/orders/index/all.json`, { headers: { Authorization: `Basic ${auth}`, Accept: 'application/json' }, redirect: 'error' });\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconsole.log(await response.json());"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.get(f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/orders/index/all.json\", auth=(os.environ['PAYDRO_EMAIL'], os.environ['PAYDRO_PASSWORD']), headers={'Accept': 'application/json'}, allow_redirects=False, timeout=30)\nif response.status_code != 200:\n    raise RuntimeError(f'Paydro HTTP {response.status_code}')\ndata = response.json()"
          }
        ]
      }
    },
    "/{event_id}/orders/index/{filter}/{filter_on_id}.json": {
      "get": {
        "operationId": "listOrdersByResource",
        "summary": "Filter orders by product or promocode",
        "tags": ["Orders"],
        "description": "Use a product UUID with product, or a promocode UUID with promocode/noncanceledpromocode. noncanceledpromocode excludes cancelled credit records.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "name": "filter",
            "in": "path",
            "required": true,
            "description": "Choose the related resource filter.",
            "schema": {
              "type": "string",
              "enum": ["product", "promocode", "noncanceledpromocode"],
              "default": "product"
            }
          },
          {
            "name": "filter_on_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Product or promocode UUID."
          },
          {
            "$ref": "#/components/parameters/page"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful JSON response.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/OrderRecord"
                  }
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; optional legacy fields are omitted.",
                    "value": [
                      {
                        "Order": {
                          "id": "33333333-3333-4333-8333-333333333333",
                          "email": "alex@example.com",
                          "is_paid": true,
                          "payment_method": "online",
                          "payment_state": {
                            "channel": "provider",
                            "is_paid": true,
                            "settlement": "paid",
                            "lifecycle": "active"
                          }
                        }
                      }
                    ]
                  }
                }
              }
            }
          },
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/$EVENT_ID/orders/index/product/$FILTER_ID.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/orders/index/product/' . getenv('FILTER_ID') . '.json');\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_HTTPHEADER => ['Accept: application/json'], CURLOPT_RETURNTRANSFER => true]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status !== 200) throw new RuntimeException('Paydro request failed');\n$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\ncurl_close($ch);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/orders/index/product/${process.env.FILTER_ID}.json`, { headers: { Authorization: `Basic ${auth}`, Accept: 'application/json' }, redirect: 'error' });\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconsole.log(await response.json());"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.get(f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/orders/index/product/{os.environ['FILTER_ID']}.json\", auth=(os.environ['PAYDRO_EMAIL'], os.environ['PAYDRO_PASSWORD']), headers={'Accept': 'application/json'}, allow_redirects=False, timeout=30)\nif response.status_code != 200:\n    raise RuntimeError(f'Paydro HTTP {response.status_code}')\ndata = response.json()"
          }
        ]
      }
    },
    "/{event_id}/orders/view/{order_id}.json": {
      "get": {
        "operationId": "getOrder",
        "summary": "Retrieve an order",
        "tags": ["Orders"],
        "description": "Order and related OrderLine records. Includes optional voucher/payment objects and event-specific registration fields. The detail serializer preserves more decimal strings than the list serializer.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/order_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful JSON response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrderDetail"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; optional legacy fields are omitted.",
                    "value": {
                      "Order": {
                        "id": "33333333-3333-4333-8333-333333333333",
                        "email": "alex@example.com",
                        "is_paid": true,
                        "payment_method": "online",
                        "payment_state": {
                          "channel": "provider",
                          "is_paid": true,
                          "settlement": "paid",
                          "lifecycle": "active"
                        }
                      },
                      "OrderLine": [
                        {
                          "id": "44444444-4444-4444-8444-444444444444",
                          "product_id": "22222222-2222-4222-8222-222222222222",
                          "firstname": "Alex",
                          "lastname": "Example",
                          "email": "alex@example.com"
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/$EVENT_ID/orders/view/$ORDER_ID.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/orders/view/' . getenv('ORDER_ID') . '.json');\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_HTTPHEADER => ['Accept: application/json'], CURLOPT_RETURNTRANSFER => true]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status !== 200) throw new RuntimeException('Paydro request failed');\n$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\ncurl_close($ch);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/orders/view/${process.env.ORDER_ID}.json`, { headers: { Authorization: `Basic ${auth}`, Accept: 'application/json' }, redirect: 'error' });\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconsole.log(await response.json());"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.get(f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/orders/view/{os.environ['ORDER_ID']}.json\", auth=(os.environ['PAYDRO_EMAIL'], os.environ['PAYDRO_PASSWORD']), headers={'Accept': 'application/json'}, allow_redirects=False, timeout=30)\nif response.status_code != 200:\n    raise RuntimeError(f'Paydro HTTP {response.status_code}')\ndata = response.json()"
          }
        ]
      }
    },
    "/{event_id}/order_lines/index/{filter}.json": {
      "get": {
        "operationId": "listAttendees",
        "summary": "List attendees",
        "tags": ["Attendees"],
        "description": "Attendees are order lines. 100 rows per page by default. index excludes cancelled credit records and package containers and includes confirmed/invoiced orders or reservations. include=scan adds a numeric scanned flag.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "name": "filter",
            "in": "path",
            "required": true,
            "description": "index: confirmed/invoiced or reservation, excludes credit records and package containers, last eight years; recent: last year; deleted: cancelled rows with deleted timestamp.",
            "schema": {
              "type": "string",
              "enum": ["index", "recent", "deleted"],
              "default": "index"
            }
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/include"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful JSON response.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AttendeeRecord"
                  }
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; optional legacy fields are omitted.",
                    "value": [
                      {
                        "OrderLine": {
                          "id": "44444444-4444-4444-8444-444444444444",
                          "product_id": "22222222-2222-4222-8222-222222222222",
                          "firstname": "Alex",
                          "lastname": "Example",
                          "email": "alex@example.com"
                        }
                      }
                    ]
                  }
                }
              }
            }
          },
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/$EVENT_ID/order_lines/index/index.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/order_lines/index/index.json');\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_HTTPHEADER => ['Accept: application/json'], CURLOPT_RETURNTRANSFER => true]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status !== 200) throw new RuntimeException('Paydro request failed');\n$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\ncurl_close($ch);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/order_lines/index/index.json`, { headers: { Authorization: `Basic ${auth}`, Accept: 'application/json' }, redirect: 'error' });\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconsole.log(await response.json());"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.get(f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/order_lines/index/index.json\", auth=(os.environ['PAYDRO_EMAIL'], os.environ['PAYDRO_PASSWORD']), headers={'Accept': 'application/json'}, allow_redirects=False, timeout=30)\nif response.status_code != 200:\n    raise RuntimeError(f'Paydro HTTP {response.status_code}')\ndata = response.json()"
          }
        ]
      }
    },
    "/{event_id}/order_lines/index/{filter}/{filter_on_id}.json": {
      "get": {
        "operationId": "listAttendeesByResource",
        "summary": "Filter attendees by product or promocode",
        "tags": ["Attendees"],
        "description": "ticket expects a product UUID; promocode expects a promocode UUID. Uses the ordinary paginated attendee serializer.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "name": "filter",
            "in": "path",
            "required": true,
            "description": "Related product or promocode filter.",
            "schema": {
              "type": "string",
              "enum": ["ticket", "promocode"],
              "default": "ticket"
            }
          },
          {
            "name": "filter_on_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/include"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful JSON response.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AttendeeRecord"
                  }
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; optional legacy fields are omitted.",
                    "value": [
                      {
                        "OrderLine": {
                          "id": "44444444-4444-4444-8444-444444444444",
                          "product_id": "22222222-2222-4222-8222-222222222222",
                          "firstname": "Alex",
                          "lastname": "Example",
                          "email": "alex@example.com"
                        }
                      }
                    ]
                  }
                }
              }
            }
          },
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/$EVENT_ID/order_lines/index/ticket/$FILTER_ID.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/order_lines/index/ticket/' . getenv('FILTER_ID') . '.json');\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_HTTPHEADER => ['Accept: application/json'], CURLOPT_RETURNTRANSFER => true]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status !== 200) throw new RuntimeException('Paydro request failed');\n$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\ncurl_close($ch);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/order_lines/index/ticket/${process.env.FILTER_ID}.json`, { headers: { Authorization: `Basic ${auth}`, Accept: 'application/json' }, redirect: 'error' });\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconsole.log(await response.json());"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.get(f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/order_lines/index/ticket/{os.environ['FILTER_ID']}.json\", auth=(os.environ['PAYDRO_EMAIL'], os.environ['PAYDRO_PASSWORD']), headers={'Accept': 'application/json'}, allow_redirects=False, timeout=30)\nif response.status_code != 200:\n    raise RuntimeError(f'Paydro HTTP {response.status_code}')\ndata = response.json()"
          }
        ]
      }
    },
    "/{event_id}/order_lines/edit_data/{attendee_id}.json": {
      "get": {
        "operationId": "getAttendee",
        "summary": "Retrieve attendee registration details",
        "tags": ["Attendees"],
        "description": "Read attendee registration detail: orderLine.answers, current/historical question definitions, product/order context and organizer action capabilities. Use the documented save (PUT), edit_product (POST) and question actions (POST) to mutate the attendee. Missing/inaccessible IDs return 404. The retired view JSON serializer is excluded.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/attendee_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful JSON response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttendeeDetail"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; optional legacy fields are omitted.",
                    "value": {
                      "ok": true,
                      "data": {
                        "order": {
                          "id": "33333333-3333-4333-8333-333333333333"
                        },
                        "orderLine": {
                          "id": "44444444-4444-4444-8444-444444444444",
                          "productId": "22222222-2222-4222-8222-222222222222",
                          "firstname": "Alex",
                          "lastname": "Example",
                          "email": "alex@example.com",
                          "answers": []
                        },
                        "currentQuestions": [],
                        "historicalQuestions": []
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "Missing attendee or attendee belongs to another event.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; optional legacy fields are omitted.",
                    "value": {
                      "ok": false,
                      "error": "no_valid_order_line_id",
                      "detail": "Invalid attendee"
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/$EVENT_ID/order_lines/edit_data/$ATTENDEE_ID.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/order_lines/edit_data/' . getenv('ATTENDEE_ID') . '.json');\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_HTTPHEADER => ['Accept: application/json'], CURLOPT_RETURNTRANSFER => true]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status !== 200) throw new RuntimeException('Paydro request failed');\n$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\ncurl_close($ch);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/order_lines/edit_data/${process.env.ATTENDEE_ID}.json`, { headers: { Authorization: `Basic ${auth}`, Accept: 'application/json' }, redirect: 'error' });\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconsole.log(await response.json());"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.get(f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/order_lines/edit_data/{os.environ['ATTENDEE_ID']}.json\", auth=(os.environ['PAYDRO_EMAIL'], os.environ['PAYDRO_PASSWORD']), headers={'Accept': 'application/json'}, allow_redirects=False, timeout=30)\nif response.status_code != 200:\n    raise RuntimeError(f'Paydro HTTP {response.status_code}')\ndata = response.json()"
          }
        ]
      }
    },
    "/orders/all_data.json": {
      "get": {
        "operationId": "getOrdersSnapshot",
        "summary": "Retrieve order snapshot",
        "tags": ["Orders"],
        "description": "Company-scoped compact order records grouped by event. Maximum 75,000 combined rows, newest orders first, without pagination. Full weekly history snapshot. Combine with changed_data for a current view; a snapshot alone can be cached. Store the ETag for conditional requests.",
        "parameters": [
          {
            "$ref": "#/components/parameters/IfNoneMatch"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful JSON response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrdersSnapshot"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; optional legacy fields are omitted.",
                    "value": {
                      "events": {
                        "11111111-1111-4111-8111-111111111111": {
                          "name": "Example conference",
                          "currency": "EUR",
                          "company_id": "11111111-1111-4111-8111-111111111111"
                        }
                      },
                      "orders": {
                        "11111111-1111-4111-8111-111111111111": [
                          {
                            "id": "33333333-3333-4333-8333-333333333333",
                            "d": 1795161600,
                            "n": "Alex Example",
                            "e": "alex@example.com",
                            "b": 1001,
                            "p": 1,
                            "t": 25.0
                          }
                        ]
                      },
                      "event_scope": "all",
                      "event_ids": ["11111111-1111-4111-8111-111111111111"]
                    }
                  }
                }
              }
            },
            "headers": {
              "ETag": {
                "description": "Snapshot cache validator.",
                "schema": {
                  "type": "string"
                }
              },
              "Content-Encoding": {
                "description": "Bulk snapshots may be gzip encoded.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "304": {
            "description": "Full snapshot unchanged; no response body.",
            "headers": {
              "ETag": {
                "description": "Snapshot cache validator.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/orders/all_data.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/orders/all_data.json');\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_HTTPHEADER => ['Accept: application/json'], CURLOPT_RETURNTRANSFER => true]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status !== 200) throw new RuntimeException('Paydro request failed');\n$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\ncurl_close($ch);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/orders/all_data.json`, { headers: { Authorization: `Basic ${auth}`, Accept: 'application/json' }, redirect: 'error' });\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconsole.log(await response.json());"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.get(f\"{os.environ['PAYDRO_ORIGIN']}/orders/all_data.json\", auth=(os.environ['PAYDRO_EMAIL'], os.environ['PAYDRO_PASSWORD']), headers={'Accept': 'application/json'}, allow_redirects=False, timeout=30)\nif response.status_code != 200:\n    raise RuntimeError(f'Paydro HTTP {response.status_code}')\ndata = response.json()"
          }
        ]
      }
    },
    "/{event_id}/order_lines/all_data/2.json": {
      "get": {
        "operationId": "getEventAttendeesSnapshot",
        "summary": "Retrieve event attendee snapshot",
        "tags": ["Attendees"],
        "description": "Compact attendees grouped by event UUID. Maximum 10,000 rows per event; no next cursor. Excludes cancelled credit records and orders with a blank email. Unlike the ordinary attendee list, bulk snapshots can include unfinished orders and package lines. An explicit event scope includes older events. Weekly cached history. Merge changed_data for current rows. Use ETag/304 to avoid downloading unchanged history. The path segment 2 is the established compact format.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/IfNoneMatch"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful JSON response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttendeesSnapshot"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; optional legacy fields are omitted.",
                    "value": {
                      "11111111-1111-4111-8111-111111111111": {
                        "event": {
                          "name": "Example conference",
                          "vat": 21,
                          "currency": "EUR",
                          "company_id": "11111111-1111-4111-8111-111111111111"
                        },
                        "orderlines": [
                          {
                            "id": "44444444-4444-4444-8444-444444444444",
                            "oid": "33333333-3333-4333-8333-333333333333",
                            "pid": "22222222-2222-4222-8222-222222222222",
                            "d": "2026-11-20 10:00:00",
                            "od": 1795161600,
                            "n": "Alex, Example",
                            "e": "alex@example.com",
                            "b": 1001
                          }
                        ],
                        "products": {
                          "22222222-2222-4222-8222-222222222222": "Day ticket"
                        }
                      }
                    }
                  }
                }
              }
            },
            "headers": {
              "ETag": {
                "description": "Snapshot cache validator.",
                "schema": {
                  "type": "string"
                }
              },
              "Content-Encoding": {
                "description": "Bulk snapshots may be gzip encoded.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "304": {
            "description": "Full snapshot unchanged; no response body.",
            "headers": {
              "ETag": {
                "description": "Snapshot cache validator.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/$EVENT_ID/order_lines/all_data/2.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/order_lines/all_data/2.json');\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_HTTPHEADER => ['Accept: application/json'], CURLOPT_RETURNTRANSFER => true]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status !== 200) throw new RuntimeException('Paydro request failed');\n$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\ncurl_close($ch);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/order_lines/all_data/2.json`, { headers: { Authorization: `Basic ${auth}`, Accept: 'application/json' }, redirect: 'error' });\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconsole.log(await response.json());"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.get(f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/order_lines/all_data/2.json\", auth=(os.environ['PAYDRO_EMAIL'], os.environ['PAYDRO_PASSWORD']), headers={'Accept': 'application/json'}, allow_redirects=False, timeout=30)\nif response.status_code != 200:\n    raise RuntimeError(f'Paydro HTTP {response.status_code}')\ndata = response.json()"
          }
        ]
      }
    },
    "/order_lines/all_data/2.json": {
      "get": {
        "operationId": "getAllAttendeesSnapshot",
        "summary": "Retrieve company attendee snapshot",
        "tags": ["Attendees"],
        "description": "Compact attendees grouped by event UUID. Maximum 10,000 rows per event; no next cursor. Excludes cancelled credit records and orders with a blank email. Unlike the ordinary attendee list, bulk snapshots can include unfinished orders and package lines. Unscoped access limits events to starts within the last two years. Weekly cached history. Merge changed_data for current rows. Use ETag/304 to avoid downloading unchanged history. The path segment 2 is the established compact format.",
        "parameters": [
          {
            "$ref": "#/components/parameters/IfNoneMatch"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful JSON response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttendeesSnapshot"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; optional legacy fields are omitted.",
                    "value": {
                      "11111111-1111-4111-8111-111111111111": {
                        "event": {
                          "name": "Example conference",
                          "vat": 21,
                          "currency": "EUR",
                          "company_id": "11111111-1111-4111-8111-111111111111"
                        },
                        "orderlines": [
                          {
                            "id": "44444444-4444-4444-8444-444444444444",
                            "oid": "33333333-3333-4333-8333-333333333333",
                            "pid": "22222222-2222-4222-8222-222222222222",
                            "d": "2026-11-20 10:00:00",
                            "od": 1795161600,
                            "n": "Alex, Example",
                            "e": "alex@example.com",
                            "b": 1001
                          }
                        ],
                        "products": {
                          "22222222-2222-4222-8222-222222222222": "Day ticket"
                        }
                      }
                    }
                  }
                }
              }
            },
            "headers": {
              "ETag": {
                "description": "Snapshot cache validator.",
                "schema": {
                  "type": "string"
                }
              },
              "Content-Encoding": {
                "description": "Bulk snapshots may be gzip encoded.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "304": {
            "description": "Full snapshot unchanged; no response body.",
            "headers": {
              "ETag": {
                "description": "Snapshot cache validator.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/order_lines/all_data/2.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/order_lines/all_data/2.json');\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_HTTPHEADER => ['Accept: application/json'], CURLOPT_RETURNTRANSFER => true]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status !== 200) throw new RuntimeException('Paydro request failed');\n$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\ncurl_close($ch);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/order_lines/all_data/2.json`, { headers: { Authorization: `Basic ${auth}`, Accept: 'application/json' }, redirect: 'error' });\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconsole.log(await response.json());"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.get(f\"{os.environ['PAYDRO_ORIGIN']}/order_lines/all_data/2.json\", auth=(os.environ['PAYDRO_EMAIL'], os.environ['PAYDRO_PASSWORD']), headers={'Accept': 'application/json'}, allow_redirects=False, timeout=30)\nif response.status_code != 200:\n    raise RuntimeError(f'Paydro HTTP {response.status_code}')\ndata = response.json()"
          }
        ]
      }
    },
    "/orders/changed_data.json": {
      "get": {
        "operationId": "getOrdersChanges",
        "summary": "Retrieve order changes",
        "tags": ["Orders"],
        "description": "Company-scoped compact order records grouped by event. Maximum 75,000 combined rows, newest orders first, without pagination. Changes cover modified records since last Sunday at server-local midnight and pending provider payments. deleted_items contains removal IDs from the existing deletion window (up to ten days); it may contain order or attendee IDs.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful JSON response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrdersSnapshot"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; optional legacy fields are omitted.",
                    "value": {
                      "events": {
                        "11111111-1111-4111-8111-111111111111": {
                          "name": "Example conference",
                          "currency": "EUR",
                          "company_id": "11111111-1111-4111-8111-111111111111"
                        }
                      },
                      "orders": {
                        "11111111-1111-4111-8111-111111111111": [
                          {
                            "id": "33333333-3333-4333-8333-333333333333",
                            "d": 1795161600,
                            "n": "Alex Example",
                            "e": "alex@example.com",
                            "b": 1001,
                            "p": 1,
                            "t": 25.0
                          }
                        ]
                      },
                      "event_scope": "all",
                      "event_ids": ["11111111-1111-4111-8111-111111111111"],
                      "deleted_items": []
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/orders/changed_data.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/orders/changed_data.json');\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_HTTPHEADER => ['Accept: application/json'], CURLOPT_RETURNTRANSFER => true]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status !== 200) throw new RuntimeException('Paydro request failed');\n$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\ncurl_close($ch);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/orders/changed_data.json`, { headers: { Authorization: `Basic ${auth}`, Accept: 'application/json' }, redirect: 'error' });\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconsole.log(await response.json());"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.get(f\"{os.environ['PAYDRO_ORIGIN']}/orders/changed_data.json\", auth=(os.environ['PAYDRO_EMAIL'], os.environ['PAYDRO_PASSWORD']), headers={'Accept': 'application/json'}, allow_redirects=False, timeout=30)\nif response.status_code != 200:\n    raise RuntimeError(f'Paydro HTTP {response.status_code}')\ndata = response.json()"
          }
        ]
      }
    },
    "/{event_id}/order_lines/changed_data/2.json": {
      "get": {
        "operationId": "getEventAttendeesChanges",
        "summary": "Retrieve event attendee changes",
        "tags": ["Attendees"],
        "description": "Compact attendees grouped by event UUID. Maximum 10,000 rows per event; no next cursor. Excludes cancelled credit records and orders with a blank email. Unlike the ordinary attendee list, bulk snapshots can include unfinished orders and package lines. An explicit event scope includes older events. Changes cover the weekly server-local window; deleted_items is a top-level removal list.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful JSON response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttendeesSnapshot"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; optional legacy fields are omitted.",
                    "value": {
                      "11111111-1111-4111-8111-111111111111": {
                        "event": {
                          "name": "Example conference",
                          "vat": 21,
                          "currency": "EUR",
                          "company_id": "11111111-1111-4111-8111-111111111111"
                        },
                        "orderlines": [
                          {
                            "id": "44444444-4444-4444-8444-444444444444",
                            "oid": "33333333-3333-4333-8333-333333333333",
                            "pid": "22222222-2222-4222-8222-222222222222",
                            "d": "2026-11-20 10:00:00",
                            "od": 1795161600,
                            "n": "Alex, Example",
                            "e": "alex@example.com",
                            "b": 1001
                          }
                        ],
                        "products": {
                          "22222222-2222-4222-8222-222222222222": "Day ticket"
                        }
                      },
                      "deleted_items": []
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/$EVENT_ID/order_lines/changed_data/2.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/order_lines/changed_data/2.json');\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_HTTPHEADER => ['Accept: application/json'], CURLOPT_RETURNTRANSFER => true]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status !== 200) throw new RuntimeException('Paydro request failed');\n$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\ncurl_close($ch);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/order_lines/changed_data/2.json`, { headers: { Authorization: `Basic ${auth}`, Accept: 'application/json' }, redirect: 'error' });\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconsole.log(await response.json());"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.get(f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/order_lines/changed_data/2.json\", auth=(os.environ['PAYDRO_EMAIL'], os.environ['PAYDRO_PASSWORD']), headers={'Accept': 'application/json'}, allow_redirects=False, timeout=30)\nif response.status_code != 200:\n    raise RuntimeError(f'Paydro HTTP {response.status_code}')\ndata = response.json()"
          }
        ]
      }
    },
    "/order_lines/changed_data/2.json": {
      "get": {
        "operationId": "getAllAttendeesChanges",
        "summary": "Retrieve company attendee changes",
        "tags": ["Attendees"],
        "description": "Compact attendees grouped by event UUID. Maximum 10,000 rows per event; no next cursor. Excludes cancelled credit records and orders with a blank email. Unlike the ordinary attendee list, bulk snapshots can include unfinished orders and package lines. Unscoped access limits events to starts within the last two years. Changes cover the weekly server-local window; deleted_items is a top-level removal list.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful JSON response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttendeesSnapshot"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; optional legacy fields are omitted.",
                    "value": {
                      "11111111-1111-4111-8111-111111111111": {
                        "event": {
                          "name": "Example conference",
                          "vat": 21,
                          "currency": "EUR",
                          "company_id": "11111111-1111-4111-8111-111111111111"
                        },
                        "orderlines": [
                          {
                            "id": "44444444-4444-4444-8444-444444444444",
                            "oid": "33333333-3333-4333-8333-333333333333",
                            "pid": "22222222-2222-4222-8222-222222222222",
                            "d": "2026-11-20 10:00:00",
                            "od": 1795161600,
                            "n": "Alex, Example",
                            "e": "alex@example.com",
                            "b": 1001
                          }
                        ],
                        "products": {
                          "22222222-2222-4222-8222-222222222222": "Day ticket"
                        }
                      },
                      "deleted_items": []
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/order_lines/changed_data/2.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/order_lines/changed_data/2.json');\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_HTTPHEADER => ['Accept: application/json'], CURLOPT_RETURNTRANSFER => true]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status !== 200) throw new RuntimeException('Paydro request failed');\n$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\ncurl_close($ch);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/order_lines/changed_data/2.json`, { headers: { Authorization: `Basic ${auth}`, Accept: 'application/json' }, redirect: 'error' });\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconsole.log(await response.json());"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.get(f\"{os.environ['PAYDRO_ORIGIN']}/order_lines/changed_data/2.json\", auth=(os.environ['PAYDRO_EMAIL'], os.environ['PAYDRO_PASSWORD']), headers={'Accept': 'application/json'}, allow_redirects=False, timeout=30)\nif response.status_code != 200:\n    raise RuntimeError(f'Paydro HTTP {response.status_code}')\ndata = response.json()"
          }
        ]
      }
    },
    "/{event_id}/products/edit/{product_id}.json": {
      "get": {
        "operationId": "getProductConfiguration",
        "summary": "Read product configuration",
        "tags": ["Products"],
        "description": "Read current configuration before editing: product, pool/volume rows, package members, metadata and event context.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/product_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProductConfiguration"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "Product": {
                        "id": "22222222-2222-4222-8222-222222222222",
                        "title": "General admission",
                        "price": "0.00",
                        "stock": 100
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/products/edit/${PRODUCT_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/products/edit/' . getenv('PRODUCT_ID') . '.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/products/edit/${process.env.PRODUCT_ID}.json`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/products/edit/{os.environ['PRODUCT_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      },
      "put": {
        "operationId": "updateProduct",
        "summary": "Update a ticket product",
        "tags": ["Products"],
        "description": "Route product ID is authoritative. Product.duplicate delegates to creation and can return a new id. Referenced categories/package members must belong to the event. Validation can return submitted data or [data,error] with HTTP 200.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/product_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/MutationResult"
                    },
                    {
                      "type": "object",
                      "properties": {},
                      "additionalProperties": true
                    },
                    {
                      "type": "array",
                      "items": {}
                    }
                  ]
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true
                    }
                  },
                  "validation": {
                    "summary": "Legacy HTTP 200 validation failure; no successful save.",
                    "value": [
                      {
                        "Product": {
                          "title": ""
                        }
                      },
                      {
                        "error": {
                          "title": ["A title is required."]
                        }
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"Product\":{\"title\":\"General admission\",\"category_id\":\"55555555-5555-4555-8555-555555555555\",\"price\":\"0.00\",\"stock\":100,\"max_per_sale\":10,\"visible\":1}}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/products/edit/${PRODUCT_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/products/edit/' . getenv('PRODUCT_ID') . '.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"Product\":{\"title\":\"General admission\",\"category_id\":\"55555555-5555-4555-8555-555555555555\",\"price\":\"0.00\",\"stock\":100,\"max_per_sale\":10,\"visible\":1}}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/products/edit/${process.env.PRODUCT_ID}.json`, {\n  method: \"PUT\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"Product\":{\"title\":\"General admission\",\"category_id\":\"55555555-5555-4555-8555-555555555555\",\"price\":\"0.00\",\"stock\":100,\"max_per_sale\":10,\"visible\":1}})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"Product\":{\"title\":\"General admission\",\"category_id\":\"55555555-5555-4555-8555-555555555555\",\"price\":\"0.00\",\"stock\":100,\"max_per_sale\":10,\"visible\":1}}')\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/products/edit/{os.environ['PRODUCT_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProductUpdateMutation"
              },
              "examples": {
                "example": {
                  "value": {
                    "Product": {
                      "title": "General admission",
                      "category_id": "55555555-5555-4555-8555-555555555555",
                      "price": "0.00",
                      "stock": 100,
                      "visible": 1,
                      "max_per_sale": 10
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/products/add/free.json": {
      "get": {
        "operationId": "getFreeProductDefaults",
        "summary": "Read new free-ticket defaults",
        "tags": ["Products"],
        "description": "Returns form defaults and event context. This GET does not create a product.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "Product": {
                      "type": "object",
                      "properties": {},
                      "additionalProperties": true
                    },
                    "Event": {
                      "type": "object",
                      "properties": {},
                      "additionalProperties": true
                    }
                  },
                  "additionalProperties": true
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "Product": {
                        "price": "0.00"
                      },
                      "Event": {
                        "id": "11111111-1111-4111-8111-111111111111"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/products/add/free.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/products/add/free.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/products/add/free.json`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/products/add/free.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/products/add/{type}.json": {
      "put": {
        "operationId": "createProduct",
        "summary": "Create a ticket product",
        "tags": ["Products"],
        "description": "Use a category in this event or category_new. Route types select the form mode; set Product.package_flag=1 for a package and Product.donation=1 for a donation. Paid tickets require a configured payment provider. Creation is transactional; the first paid ticket may also update event fee/VAT settings. See /en-us/docs/product-management.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery. Package-mode validation/form rendering can return HTML or fail to render a JSON view; check content type as well as ok.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "name": "type",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": ["paid", "free", "donation", "package"]
            },
            "description": "Creation type. Configure the corresponding payload fields."
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/MutationResult"
                    },
                    {
                      "type": "object",
                      "properties": {},
                      "additionalProperties": true
                    },
                    {
                      "type": "array",
                      "items": {}
                    }
                  ]
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true,
                      "id": "22222222-2222-4222-8222-222222222222"
                    }
                  },
                  "validation": {
                    "summary": "Legacy HTTP 200 validation failure; no successful save.",
                    "value": [
                      {
                        "Product": {
                          "title": ""
                        }
                      },
                      {
                        "error": {
                          "title": ["A title is required."]
                        }
                      }
                    ]
                  }
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "description": "Malformed payload or category/package member not in the event; rejected before saving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"Product\":{\"title\":\"General admission\",\"category_id\":\"55555555-5555-4555-8555-555555555555\",\"price\":\"0.00\",\"stock\":100,\"visible\":1}}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/products/add/${TYPE}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/products/add/' . getenv('TYPE') . '.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"Product\":{\"title\":\"General admission\",\"category_id\":\"55555555-5555-4555-8555-555555555555\",\"price\":\"0.00\",\"stock\":100,\"visible\":1}}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/products/add/${process.env.TYPE}.json`, {\n  method: \"PUT\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"Product\":{\"title\":\"General admission\",\"category_id\":\"55555555-5555-4555-8555-555555555555\",\"price\":\"0.00\",\"stock\":100,\"visible\":1}})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"Product\":{\"title\":\"General admission\",\"category_id\":\"55555555-5555-4555-8555-555555555555\",\"price\":\"0.00\",\"stock\":100,\"visible\":1}}')\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/products/add/{os.environ['TYPE']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProductMutation"
              },
              "examples": {
                "example": {
                  "value": {
                    "Product": {
                      "title": "General admission",
                      "category_id": "55555555-5555-4555-8555-555555555555",
                      "price": "0.00",
                      "stock": 100,
                      "visible": 1
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/products/add_package.json": {
      "put": {
        "operationId": "createPackage",
        "summary": "Create a ticket package",
        "tags": ["Products"],
        "description": "Alias that forces Product.package_flag. Package members must belong to this event. Failure/form rendering has not been verified as a reliable JSON contract; use products/add/package.json and check the response carefully.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery. Package-mode validation/form rendering can return HTML or fail to render a JSON view; check content type as well as ok.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/MutationResult"
                    },
                    {
                      "type": "object",
                      "properties": {},
                      "additionalProperties": true
                    },
                    {
                      "type": "array",
                      "items": {}
                    }
                  ]
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true,
                      "id": "22222222-2222-4222-8222-222222222222"
                    }
                  }
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"Product\":{\"title\":\"Bundle\",\"price\":\"0.00\",\"stock\":100,\"package_flag\":1},\"PackagesProduct\":[{\"product_id\":\"22222222-2222-4222-8222-222222222222\",\"amount\":1,\"active\":1}]}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/products/add_package.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/products/add_package.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"Product\":{\"title\":\"Bundle\",\"price\":\"0.00\",\"stock\":100,\"package_flag\":1},\"PackagesProduct\":[{\"product_id\":\"22222222-2222-4222-8222-222222222222\",\"amount\":1,\"active\":1}]}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/products/add_package.json`, {\n  method: \"PUT\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"Product\":{\"title\":\"Bundle\",\"price\":\"0.00\",\"stock\":100,\"package_flag\":1},\"PackagesProduct\":[{\"product_id\":\"22222222-2222-4222-8222-222222222222\",\"amount\":1,\"active\":1}]})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"Product\":{\"title\":\"Bundle\",\"price\":\"0.00\",\"stock\":100,\"package_flag\":1},\"PackagesProduct\":[{\"product_id\":\"22222222-2222-4222-8222-222222222222\",\"amount\":1,\"active\":1}]}')\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/products/add_package.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProductMutation"
              },
              "examples": {
                "example": {
                  "value": {
                    "Product": {
                      "title": "Bundle",
                      "price": "0.00",
                      "stock": 100
                    },
                    "PackagesProduct": [
                      {
                        "product_id": "22222222-2222-4222-8222-222222222222",
                        "amount": 1,
                        "active": 1
                      }
                    ]
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/products/delete/{product_id}.json": {
      "post": {
        "operationId": "deleteProduct",
        "summary": "Delete a ticket product",
        "tags": ["Products"],
        "description": "Deletion is blocked by sold tickets or package/reference constraints. Require ok:true; some failures use HTTP 200.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/product_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request POST \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/products/delete/${PRODUCT_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/products/delete/' . getenv('PRODUCT_ID') . '.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/products/delete/${process.env.PRODUCT_ID}.json`, {\n  method: \"POST\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"POST\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/products/delete/{os.environ['PRODUCT_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/products/order.json": {
      "put": {
        "operationId": "reorderProducts",
        "summary": "Reorder ticket groups and products",
        "tags": ["Products"],
        "description": "Submit a complete category-to-products map. Every event category/product must appear once. An empty category uses [\"empty\"]. Invalid or incomplete maps return 400.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "204": {
            "description": "Saved. No response body."
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"Product\":{\"55555555-5555-4555-8555-555555555555\":[\"22222222-2222-4222-8222-222222222222\"]}}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/products/order.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/products/order.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"Product\":{\"55555555-5555-4555-8555-555555555555\":[\"22222222-2222-4222-8222-222222222222\"]}}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/products/order.json`, {\n  method: \"PUT\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"Product\":{\"55555555-5555-4555-8555-555555555555\":[\"22222222-2222-4222-8222-222222222222\"]}})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"Product\":{\"55555555-5555-4555-8555-555555555555\":[\"22222222-2222-4222-8222-222222222222\"]}}')\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/products/order.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProductOrder"
              },
              "examples": {
                "example": {
                  "value": {
                    "Product": {
                      "55555555-5555-4555-8555-555555555555": [
                        "22222222-2222-4222-8222-222222222222"
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/categories/index.json": {
      "get": {
        "operationId": "listTicketGroups",
        "summary": "List categories and question definitions",
        "tags": ["Categories"],
        "description": "Read category wrappers with current CategoryField question definitions; no standard pagination.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CategoryRecord"
                  }
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": [
                      {
                        "Category": {
                          "id": "55555555-5555-4555-8555-555555555555",
                          "name": "Tickets"
                        },
                        "CategoryField": []
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/categories/index.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/categories/index.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/categories/index.json`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/categories/index.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/categories/edit/{category_id}.json": {
      "put": {
        "operationId": "updateTicketGroup",
        "summary": "Update a category",
        "tags": ["Categories"],
        "description": "Allowed fields are name and order. Route ID and event are server assigned; validation/access responses use legacy result fields.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/category_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Category missing or inaccessible.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": false,
                      "status": 404,
                      "error": "invalid_category"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Category validation failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": false,
                      "status": 400,
                      "error": "validation_failed",
                      "validation_errors": {}
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"Category\":{\"name\":\"Tickets\"}}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/categories/edit/${CATEGORY_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/categories/edit/' . getenv('CATEGORY_ID') . '.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"Category\":{\"name\":\"Tickets\"}}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/categories/edit/${process.env.CATEGORY_ID}.json`, {\n  method: \"PUT\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"Category\":{\"name\":\"Tickets\"}})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"Category\":{\"name\":\"Tickets\"}}')\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/categories/edit/{os.environ['CATEGORY_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CategoryMutation"
              },
              "examples": {
                "example": {
                  "value": {
                    "Category": {
                      "name": "Tickets"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/categories/showhide/{category_id}.json": {
      "post": {
        "operationId": "toggleTicketGroupVisibility",
        "summary": "Toggle category visibility",
        "tags": ["Categories"],
        "description": "Toggles current hide state; repeated requests toggle it again. Read categories afterwards instead of blindly retrying.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/category_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "hidden": {
                      "type": "boolean"
                    },
                    "status": {
                      "type": "integer"
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "additionalProperties": true
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "hidden": true,
                      "status": 200,
                      "title": "ok",
                      "detail": "Action performed"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Category missing or inaccessible.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": false,
                      "status": 404,
                      "error": "invalid_category"
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request POST \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/categories/showhide/${CATEGORY_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/categories/showhide/' . getenv('CATEGORY_ID') . '.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/categories/showhide/${process.env.CATEGORY_ID}.json`, {\n  method: \"POST\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"POST\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/categories/showhide/{os.environ['CATEGORY_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/categories/delete/{category_id}.json": {
      "post": {
        "operationId": "deleteTicketGroup",
        "summary": "Delete a category",
        "tags": ["Categories"],
        "description": "Only deletable groups can be removed; referenced groups return an error. The response is the legacy action message.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/category_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Category missing or inaccessible.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": false,
                      "status": 404,
                      "error": "invalid_category"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Last category or category containing products cannot be deleted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": false,
                      "status": 409,
                      "error": "category_in_use"
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request POST \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/categories/delete/${CATEGORY_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/categories/delete/' . getenv('CATEGORY_ID') . '.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/categories/delete/${process.env.CATEGORY_ID}.json`, {\n  method: \"POST\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"POST\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/categories/delete/{os.environ['CATEGORY_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/waitinglists/list_data.json": {
      "get": {
        "operationId": "listEventWaitinglist",
        "summary": "List an event waiting list",
        "tags": ["Waitinglists"],
        "description": "Returns items,total,page,events, scoped to authorized membership/event. Invalid query types/values are rejected.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Search name/email."
          },
          {
            "name": "company",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Accessible company filter."
          },
          {
            "name": "event",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Accessible event filter."
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": ["", "waiting", "invited"]
            },
            "description": "Invitation state."
          },
          {
            "name": "spotlight",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": ["0", "1"]
            },
            "description": "Spotlight filter."
          },
          {
            "name": "sort",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": ["name", "email", "created", "ticket"],
              "default": "created"
            },
            "description": "Sort field."
          },
          {
            "name": "direction",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": ["asc", "desc"],
              "default": "desc"
            },
            "description": "Sort direction."
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000000,
              "default": 1
            },
            "description": "50 entries per page. Valid excessive pages clamp to the last page."
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WaitinglistPage"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "items": [],
                      "total": 0,
                      "page": 1,
                      "events": []
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/waitinglists/list_data.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/waitinglists/list_data.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/waitinglists/list_data.json`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/waitinglists/list_data.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/waitinglists/list_data.json": {
      "get": {
        "operationId": "listAccessibleWaitinglists",
        "summary": "List accessible waiting lists",
        "tags": ["Waitinglists"],
        "description": "Returns items,total,page,events, scoped to authorized membership/event. Invalid query types/values are rejected.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Search name/email."
          },
          {
            "name": "company",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Accessible company filter."
          },
          {
            "name": "event",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Accessible event filter."
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": ["", "waiting", "invited"]
            },
            "description": "Invitation state."
          },
          {
            "name": "spotlight",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": ["0", "1"]
            },
            "description": "Spotlight filter."
          },
          {
            "name": "sort",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": ["name", "email", "created", "ticket"],
              "default": "created"
            },
            "description": "Sort field."
          },
          {
            "name": "direction",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": ["asc", "desc"],
              "default": "desc"
            },
            "description": "Sort direction."
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000000,
              "default": 1
            },
            "description": "50 entries per page. Valid excessive pages clamp to the last page."
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WaitinglistPage"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "items": [],
                      "total": 0,
                      "page": 1,
                      "events": []
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/waitinglists/list_data.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/waitinglists/list_data.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/waitinglists/list_data.json`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/waitinglists/list_data.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/waitinglists/detail_data/{waitinglist_id}.json": {
      "get": {
        "operationId": "getWaitinglistEntry",
        "summary": "Read a waiting-list entry",
        "tags": ["Waitinglists"],
        "description": "Read entry, invitation/promo context, available products and event. Missing or malformed entry IDs return 404.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/waitinglist_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WaitinglistDetail"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "item": {
                        "Waitinglist": {
                          "id": "66666666-6666-4666-8666-666666666666",
                          "firstname": "Alex",
                          "email": "alex@example.com"
                        },
                        "ProductRegister": {
                          "title": "General admission"
                        }
                      },
                      "invitation": [],
                      "products": [],
                      "event": {
                        "id": "11111111-1111-4111-8111-111111111111"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/waitinglists/detail_data/${WAITINGLIST_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/waitinglists/detail_data/' . getenv('WAITINGLIST_ID') . '.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/waitinglists/detail_data/${process.env.WAITINGLIST_ID}.json`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/waitinglists/detail_data/{os.environ['WAITINGLIST_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/waitinglists/invite.json": {
      "put": {
        "operationId": "inviteWaitinglistEntries",
        "summary": "Invite waiting-list entries",
        "tags": ["Waitinglists"],
        "description": "Replaces/revokes old invitation promo codes and queues email transactionally for the selected entries. All IDs and the invited product must belong to the event. Amount is 1–50; validity is one of the documented hour values (0 means no expiration). A failed batch rolls back. Read status.success even for HTTP 200. Do not automatically replay an uncertain invitation request.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WaitinglistStatus"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "status": {
                        "success": true
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"Waitinglist\":{\"ids\":[\"66666666-6666-4666-8666-666666666666\"],\"product_id_invite\":\"22222222-2222-4222-8222-222222222222\",\"amount\":1,\"invite_valid_for_hours\":48}}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/waitinglists/invite.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/waitinglists/invite.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"Waitinglist\":{\"ids\":[\"66666666-6666-4666-8666-666666666666\"],\"product_id_invite\":\"22222222-2222-4222-8222-222222222222\",\"amount\":1,\"invite_valid_for_hours\":48}}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/waitinglists/invite.json`, {\n  method: \"PUT\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"Waitinglist\":{\"ids\":[\"66666666-6666-4666-8666-666666666666\"],\"product_id_invite\":\"22222222-2222-4222-8222-222222222222\",\"amount\":1,\"invite_valid_for_hours\":48}})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"Waitinglist\":{\"ids\":[\"66666666-6666-4666-8666-666666666666\"],\"product_id_invite\":\"22222222-2222-4222-8222-222222222222\",\"amount\":1,\"invite_valid_for_hours\":48}}')\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/waitinglists/invite.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WaitinglistInvite"
              },
              "examples": {
                "example": {
                  "value": {
                    "Waitinglist": {
                      "ids": ["66666666-6666-4666-8666-666666666666"],
                      "product_id_invite": "22222222-2222-4222-8222-222222222222",
                      "amount": 1,
                      "invite_valid_for_hours": 48
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/waitinglists/index.json": {
      "put": {
        "operationId": "deleteWaitinglistEntries",
        "summary": "Delete waiting-list entries",
        "tags": ["Waitinglists"],
        "description": "Deletes the selected entries and revokes their linked invitation promo codes in one transaction. Only ok:true indicates successful deletion.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"Waitinglist\":{\"delete\":true,\"ids\":[\"66666666-6666-4666-8666-666666666666\"]}}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/waitinglists/index.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/waitinglists/index.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"Waitinglist\":{\"delete\":true,\"ids\":[\"66666666-6666-4666-8666-666666666666\"]}}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/waitinglists/index.json`, {\n  method: \"PUT\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"Waitinglist\":{\"delete\":true,\"ids\":[\"66666666-6666-4666-8666-666666666666\"]}})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"Waitinglist\":{\"delete\":true,\"ids\":[\"66666666-6666-4666-8666-666666666666\"]}}')\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/waitinglists/index.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "Waitinglist": {
                    "type": "object",
                    "properties": {
                      "delete": {
                        "const": true
                      },
                      "ids": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "format": "uuid"
                        },
                        "minItems": 1
                      }
                    },
                    "additionalProperties": false,
                    "required": ["delete", "ids"]
                  }
                },
                "additionalProperties": false,
                "required": ["Waitinglist"]
              },
              "examples": {
                "example": {
                  "value": {
                    "Waitinglist": {
                      "delete": true,
                      "ids": ["66666666-6666-4666-8666-666666666666"]
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/waitinglists/settings.json": {
      "put": {
        "operationId": "updateWaitinglistSettings",
        "summary": "Update waiting-list settings",
        "tags": ["Waitinglists"],
        "description": "Sets the event phone-number requirement for the storefront waiting-list form. Inspect status.success.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WaitinglistStatus"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "status": {
                        "success": true
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"Meta\":{\"waitinglist_phone_mandatory\":1}}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/waitinglists/settings.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/waitinglists/settings.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"Meta\":{\"waitinglist_phone_mandatory\":1}}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/waitinglists/settings.json`, {\n  method: \"PUT\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"Meta\":{\"waitinglist_phone_mandatory\":1}})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"Meta\":{\"waitinglist_phone_mandatory\":1}}')\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/waitinglists/settings.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "Meta": {
                    "type": "object",
                    "properties": {
                      "waitinglist_phone_mandatory": {
                        "type": ["boolean", "integer", "string"],
                        "description": "Legacy checkbox value; use 0 or 1 in new requests."
                      }
                    },
                    "additionalProperties": false,
                    "required": ["waitinglist_phone_mandatory"]
                  }
                },
                "additionalProperties": false,
                "required": ["Meta"]
              },
              "examples": {
                "example": {
                  "value": {
                    "Meta": {
                      "waitinglist_phone_mandatory": 1
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/order_lines/eligible_products.json": {
      "get": {
        "operationId": "listEligibleAttendeeProducts",
        "summary": "List eligible attendee ticket products",
        "tags": ["Attendees"],
        "description": "Read eligible product choices before changing an attendee product; current order-state restrictions still apply to the write.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganizerPanel"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true,
                      "data": []
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/order_lines/eligible_products.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/order_lines/eligible_products.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/order_lines/eligible_products.json`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/order_lines/eligible_products.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/order_lines/save/{attendee_id}.json": {
      "put": {
        "operationId": "updateAttendee",
        "summary": "Update attendee fields and answers",
        "tags": ["Attendees"],
        "description": "Only title,firstname,lastname,email,phone and permitted UUID-keyed question answers are saved. File answers are skipped. A supplied OrderLine.id must match the route. Missing attendee returns 404; non-editable order state 409; validation 400.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/attendee_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttendeeMutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true,
                      "data": {
                        "id": "44444444-4444-4444-8444-444444444444"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Attendee missing or inaccessible.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttendeeMutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": false,
                      "error": "no_valid_order_line_id",
                      "detail": "Invalid attendee"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid attendee or answer data.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttendeeMutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": false,
                      "error": "validation_failed",
                      "validation_errors": {}
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Order state prevents editing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttendeeMutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": false,
                      "error": "attendee_not_editable"
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"OrderLine\":{\"firstname\":\"Alex\",\"lastname\":\"Example\",\"email\":\"alex@example.com\"}}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/order_lines/save/${ATTENDEE_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/order_lines/save/' . getenv('ATTENDEE_ID') . '.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"OrderLine\":{\"firstname\":\"Alex\",\"lastname\":\"Example\",\"email\":\"alex@example.com\"}}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/order_lines/save/${process.env.ATTENDEE_ID}.json`, {\n  method: \"PUT\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"OrderLine\":{\"firstname\":\"Alex\",\"lastname\":\"Example\",\"email\":\"alex@example.com\"}})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"OrderLine\":{\"firstname\":\"Alex\",\"lastname\":\"Example\",\"email\":\"alex@example.com\"}}')\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/order_lines/save/{os.environ['ATTENDEE_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AttendeeMutation"
              },
              "examples": {
                "example": {
                  "value": {
                    "OrderLine": {
                      "firstname": "Alex",
                      "lastname": "Example",
                      "email": "alex@example.com"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/order_lines/edit_product/{attendee_id}.json": {
      "post": {
        "operationId": "changeAttendeeProduct",
        "summary": "Change an attendee ticket product",
        "tags": ["Attendees"],
        "description": "Product must be eligible in the same event. Updates the archived ticket/question snapshot under order locking; applicable order-state/date rules remain in force.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/attendee_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttendeeMutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true,
                      "data": {
                        "id": "44444444-4444-4444-8444-444444444444"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request POST \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"OrderLine\":{\"product_id\":\"22222222-2222-4222-8222-222222222222\"}}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/order_lines/edit_product/${ATTENDEE_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/order_lines/edit_product/' . getenv('ATTENDEE_ID') . '.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"OrderLine\":{\"product_id\":\"22222222-2222-4222-8222-222222222222\"}}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/order_lines/edit_product/${process.env.ATTENDEE_ID}.json`, {\n  method: \"POST\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"OrderLine\":{\"product_id\":\"22222222-2222-4222-8222-222222222222\"}})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"OrderLine\":{\"product_id\":\"22222222-2222-4222-8222-222222222222\"}}')\nresponse = requests.request(\"POST\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/order_lines/edit_product/{os.environ['ATTENDEE_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "OrderLine": {
                    "type": "object",
                    "properties": {
                      "product_id": {
                        "type": "string",
                        "format": "uuid"
                      },
                      "event_date": {
                        "type": ["string", "null"],
                        "description": "Server-local SQL timestamp; no UTC offset is included."
                      }
                    },
                    "additionalProperties": false,
                    "required": ["product_id"]
                  }
                },
                "additionalProperties": false,
                "required": ["OrderLine"]
              },
              "examples": {
                "example": {
                  "value": {
                    "OrderLine": {
                      "product_id": "22222222-2222-4222-8222-222222222222"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/order_lines/add_question/{attendee_id}/{question_id}.json": {
      "post": {
        "operationId": "addquestionForAttendee",
        "summary": "Add an attendee question",
        "tags": ["Attendees"],
        "description": "Changes the archived question/answer definition for this attendee. Event/product/question ownership and editable order state are checked. Refresh uses the current definition; removal changes the attendee snapshot.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/attendee_id"
          },
          {
            "$ref": "#/components/parameters/question_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttendeeMutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true,
                      "data": {
                        "id": "44444444-4444-4444-8444-444444444444"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request POST \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/order_lines/add_question/${ATTENDEE_ID}/${QUESTION_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/order_lines/add_question/' . getenv('ATTENDEE_ID') . '/' . getenv('QUESTION_ID') . '.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/order_lines/add_question/${process.env.ATTENDEE_ID}/${process.env.QUESTION_ID}.json`, {\n  method: \"POST\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"POST\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/order_lines/add_question/{os.environ['ATTENDEE_ID']}/{os.environ['QUESTION_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/order_lines/update_question/{attendee_id}/{question_id}.json": {
      "post": {
        "operationId": "updatequestionForAttendee",
        "summary": "Refresh an attendee question",
        "tags": ["Attendees"],
        "description": "Changes the archived question/answer definition for this attendee. Event/product/question ownership and editable order state are checked. Refresh uses the current definition; removal changes the attendee snapshot.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/attendee_id"
          },
          {
            "$ref": "#/components/parameters/question_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttendeeMutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true,
                      "data": {
                        "id": "44444444-4444-4444-8444-444444444444"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request POST \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/order_lines/update_question/${ATTENDEE_ID}/${QUESTION_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/order_lines/update_question/' . getenv('ATTENDEE_ID') . '/' . getenv('QUESTION_ID') . '.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/order_lines/update_question/${process.env.ATTENDEE_ID}/${process.env.QUESTION_ID}.json`, {\n  method: \"POST\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"POST\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/order_lines/update_question/{os.environ['ATTENDEE_ID']}/{os.environ['QUESTION_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/order_lines/delete_question/{attendee_id}/{question_id}.json": {
      "post": {
        "operationId": "deletequestionForAttendee",
        "summary": "Remove an attendee question",
        "tags": ["Attendees"],
        "description": "Changes the archived question/answer definition for this attendee. Event/product/question ownership and editable order state are checked. Refresh uses the current definition; removal changes the attendee snapshot.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/attendee_id"
          },
          {
            "$ref": "#/components/parameters/question_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttendeeMutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true,
                      "data": {
                        "id": "44444444-4444-4444-8444-444444444444"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request POST \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/order_lines/delete_question/${ATTENDEE_ID}/${QUESTION_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/order_lines/delete_question/' . getenv('ATTENDEE_ID') . '/' . getenv('QUESTION_ID') . '.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/order_lines/delete_question/${process.env.ATTENDEE_ID}/${process.env.QUESTION_ID}.json`, {\n  method: \"POST\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"POST\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/order_lines/delete_question/{os.environ['ATTENDEE_ID']}/{os.environ['QUESTION_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/order_lines/resend_one_ticket/{attendee_id}.json": {
      "post": {
        "operationId": "resendAttendeeTicket",
        "summary": "Resend an attendee ticket",
        "tags": ["Attendees"],
        "description": "Queues an individual ticket email if the ticket/order state permits delivery. Queued mail is not confirmation of final delivery; do not replay blindly.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/attendee_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttendeeMutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request POST \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/order_lines/resend_one_ticket/${ATTENDEE_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/order_lines/resend_one_ticket/' . getenv('ATTENDEE_ID') . '.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/order_lines/resend_one_ticket/${process.env.ATTENDEE_ID}.json`, {\n  method: \"POST\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"POST\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/order_lines/resend_one_ticket/{os.environ['ATTENDEE_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/orders/detail_data/{order_id}.json": {
      "get": {
        "operationId": "getOrganizerOrderPanel",
        "summary": "Read organizer order context",
        "tags": ["Orders"],
        "description": "Read current payment capabilities, order context, pending actions and mail-delivery information. Prefer orders/view for a simpler record projection.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/order_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganizerOrderPanel"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true,
                      "data": {}
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/orders/detail_data/${ORDER_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/orders/detail_data/' . getenv('ORDER_ID') . '.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/orders/detail_data/${process.env.ORDER_ID}.json`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/orders/detail_data/{os.environ['ORDER_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/orders/edit/{order_id}.json": {
      "put": {
        "operationId": "updateOrder",
        "summary": "Update order billing and registration data",
        "tags": ["Orders"],
        "description": "Requires can_edit. An edit can create a replacement order version; follow new_order_created. Older revisions, foreign promo codes and validation errors are rejected using legacy error bodies, sometimes HTTP 200.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/order_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"Order\":{\"firstname\":\"Alex\",\"lastname\":\"Example\",\"email\":\"alex@example.com\"}}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/orders/edit/${ORDER_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/orders/edit/' . getenv('ORDER_ID') . '.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"Order\":{\"firstname\":\"Alex\",\"lastname\":\"Example\",\"email\":\"alex@example.com\"}}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/orders/edit/${process.env.ORDER_ID}.json`, {\n  method: \"PUT\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"Order\":{\"firstname\":\"Alex\",\"lastname\":\"Example\",\"email\":\"alex@example.com\"}})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"Order\":{\"firstname\":\"Alex\",\"lastname\":\"Example\",\"email\":\"alex@example.com\"}}')\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/orders/edit/{os.environ['ORDER_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OrderMutation"
              },
              "examples": {
                "example": {
                  "value": {
                    "Order": {
                      "firstname": "Alex",
                      "lastname": "Example",
                      "email": "alex@example.com"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/orders/confirm_reservation/{order_id}.json": {
      "put": {
        "operationId": "confirmReservation",
        "summary": "Confirm a reservation",
        "tags": ["Orders"],
        "description": "Requires can_confirm_reservation and finalizes through the checkout lifecycle. Mail is queued by default. Presence of Order.dont_email suppresses mail regardless of its value; omit it to send. Require ok:true.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/order_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"Order\":{\"dont_email\":1}}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/orders/confirm_reservation/${ORDER_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/orders/confirm_reservation/' . getenv('ORDER_ID') . '.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"Order\":{\"dont_email\":1}}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/orders/confirm_reservation/${process.env.ORDER_ID}.json`, {\n  method: \"PUT\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"Order\":{\"dont_email\":1}})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"Order\":{\"dont_email\":1}}')\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/orders/confirm_reservation/{os.environ['ORDER_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "Order": {
                    "type": "object",
                    "properties": {
                      "dont_email": {
                        "const": 1,
                        "description": "Presence suppresses mail; omit the key to send mail."
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false,
                "required": ["Order"]
              },
              "examples": {
                "example": {
                  "value": {
                    "Order": {
                      "dont_email": 1
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/orders/resend_reservation/{order_id}.json": {
      "put": {
        "operationId": "resendreservationOrder",
        "summary": "Resend a reservation",
        "tags": ["Orders"],
        "description": "Requires can_resend_reservation; queues reservation email. State and lifecycle replay gates apply. An HTTP 200 error body is possible; require ok:true.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/order_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/orders/resend_reservation/${ORDER_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/orders/resend_reservation/' . getenv('ORDER_ID') . '.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/orders/resend_reservation/${process.env.ORDER_ID}.json`, {\n  method: \"PUT\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/orders/resend_reservation/{os.environ['ORDER_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/orders/resend/{order_id}.json": {
      "put": {
        "operationId": "resendOrder",
        "summary": "Resend an invoice or order email",
        "tags": ["Orders"],
        "description": "Requires can_resend_invoice and company clearance; queues invoice/order email. State and lifecycle replay gates apply. An HTTP 200 error body is possible; require ok:true.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/order_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/orders/resend/${ORDER_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/orders/resend/' . getenv('ORDER_ID') . '.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/orders/resend/${process.env.ORDER_ID}.json`, {\n  method: \"PUT\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/orders/resend/{os.environ['ORDER_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/orders/pay/{order_id}.json": {
      "put": {
        "operationId": "payOrder",
        "summary": "Mark an invoice paid",
        "tags": ["Orders"],
        "description": "Requires can_mark_invoice_paid; does not force the state of an online provider payment. State and lifecycle replay gates apply. An HTTP 200 error body is possible; require ok:true.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/order_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/orders/pay/${ORDER_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/orders/pay/' . getenv('ORDER_ID') . '.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/orders/pay/${process.env.ORDER_ID}.json`, {\n  method: \"PUT\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/orders/pay/{os.environ['ORDER_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/orders/cancel/{order_id}.json": {
      "put": {
        "operationId": "cancelOrder",
        "summary": "Cancel an eligible order",
        "tags": ["Orders"],
        "description": "Requires can_cancel; can create a credit invoice and queue notifications. Provider-paid orders can return provider_refund_required. Use the organizer refund workflow for provider refunds. State and lifecycle replay gates apply. An HTTP 200 error body is possible; require ok:true.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/order_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/orders/cancel/${ORDER_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/orders/cancel/' . getenv('ORDER_ID') . '.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/orders/cancel/${process.env.ORDER_ID}.json`, {\n  method: \"PUT\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/orders/cancel/{os.environ['ORDER_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/orders/drop_reservation/{order_id}.json": {
      "post": {
        "operationId": "dropreservationOrder",
        "summary": "Drop a reservation",
        "tags": ["Orders"],
        "description": "Requires can_drop_reservation; releases the reservation through the order lifecycle. State and lifecycle replay gates apply. An HTTP 200 error body is possible; require ok:true.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/order_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request POST \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/orders/drop_reservation/${ORDER_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/orders/drop_reservation/' . getenv('ORDER_ID') . '.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/orders/drop_reservation/${process.env.ORDER_ID}.json`, {\n  method: \"POST\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"POST\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/orders/drop_reservation/{os.environ['ORDER_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/events/get_event_data.json": {
      "get": {
        "operationId": "getOrganizerEventConfiguration",
        "summary": "Read full organizer event configuration",
        "tags": ["Events"],
        "description": "Broad internal organizer projection, including sensitive configuration/metadata. Keep it on your server; do not expose this payload to visitors or copy all fields into another system. Prefer the cleaned v2 event resource for ordinary integration reads.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {},
                  "additionalProperties": true
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "Event": {
                        "id": "11111111-1111-4111-8111-111111111111",
                        "name": "Example conference"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/events/get_event_data.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/events/get_event_data.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/events/get_event_data.json`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/events/get_event_data.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/events/add.json": {
      "post": {
        "operationId": "createEvent",
        "summary": "Create an event",
        "tags": ["Events"],
        "description": "Creates an event for the company resolved from the organizer hostname. The server assigns company/defaults and filters protected fields; foreign company_id is rejected. Configure dates and event currency, then read the created event. Creation validation may use legacy HTTP 200 errors.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.\n\nPermissions: company manager/editor or administrator (membership type >=1), plus operation-specific state/clearance rules.",
        "parameters": [],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true,
                      "event_id": "11111111-1111-4111-8111-111111111111"
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request POST \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"Event\":{\"name\":\"Example conference\",\"start_date\":\"2026-11-20 09:00:00\",\"end_date\":\"2026-11-20 18:00:00\",\"currency\":\"EUR\",\"timezone\":\"Europe/Amsterdam\"}}' \\\n  \"$PAYDRO_ORIGIN/events/add.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/events/add.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"Event\":{\"name\":\"Example conference\",\"start_date\":\"2026-11-20 09:00:00\",\"end_date\":\"2026-11-20 18:00:00\",\"currency\":\"EUR\",\"timezone\":\"Europe/Amsterdam\"}}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/events/add.json`, {\n  method: \"POST\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"Event\":{\"name\":\"Example conference\",\"start_date\":\"2026-11-20 09:00:00\",\"end_date\":\"2026-11-20 18:00:00\",\"currency\":\"EUR\",\"timezone\":\"Europe/Amsterdam\"}})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"Event\":{\"name\":\"Example conference\",\"start_date\":\"2026-11-20 09:00:00\",\"end_date\":\"2026-11-20 18:00:00\",\"currency\":\"EUR\",\"timezone\":\"Europe/Amsterdam\"}}')\nresponse = requests.request(\"POST\", f\"{os.environ['PAYDRO_ORIGIN']}/events/add.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EventMutation"
              },
              "examples": {
                "example": {
                  "value": {
                    "Event": {
                      "name": "Example conference",
                      "start_date": "2026-11-20 09:00:00",
                      "end_date": "2026-11-20 18:00:00",
                      "currency": "EUR",
                      "timezone": "Europe/Amsterdam"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/events/edit.json": {
      "put": {
        "operationId": "updateEvent",
        "summary": "Update event settings",
        "tags": ["Events"],
        "description": "Updates allowed Event fields and metadata transactionally. Submit both start_date and end_date for date changes; existing-sales/protected-date rules apply. Metadata is filtered by server policy.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.\n\nPermissions: company manager/editor or administrator (membership type >=1), plus operation-specific state/clearance rules.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true,
                      "event_id": "11111111-1111-4111-8111-111111111111"
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"Event\":{\"name\":\"Example conference\"}}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/events/edit.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/events/edit.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"Event\":{\"name\":\"Example conference\"}}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/events/edit.json`, {\n  method: \"PUT\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"Event\":{\"name\":\"Example conference\"}})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"Event\":{\"name\":\"Example conference\"}}')\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/events/edit.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EventMutation"
              },
              "examples": {
                "example": {
                  "value": {
                    "Event": {
                      "name": "Example conference"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/events/duplicate/{event_id}.json": {
      "post": {
        "operationId": "duplicateEvent",
        "summary": "Duplicate an event",
        "tags": ["Events"],
        "description": "Copies authorized configuration and selected related records into a new event. Waiting-list invitation promo codes are excluded. Company creation permissions apply. Success returns id, not event_id.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.\n\nPermissions: company manager/editor or administrator (membership type >=1), plus operation-specific state/clearance rules.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true,
                      "id": "11111111-1111-4111-8111-111111111111"
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request POST \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"Event\":{\"name\":\"Example conference\",\"start_date\":\"2026-11-20 09:00:00\",\"end_date\":\"2026-11-20 18:00:00\",\"currency\":\"EUR\",\"timezone\":\"Europe/Amsterdam\"}}' \\\n  \"$PAYDRO_ORIGIN/events/duplicate/${EVENT_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/events/duplicate/' . getenv('EVENT_ID') . '.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"Event\":{\"name\":\"Example conference\",\"start_date\":\"2026-11-20 09:00:00\",\"end_date\":\"2026-11-20 18:00:00\",\"currency\":\"EUR\",\"timezone\":\"Europe/Amsterdam\"}}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/events/duplicate/${process.env.EVENT_ID}.json`, {\n  method: \"POST\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"Event\":{\"name\":\"Example conference\",\"start_date\":\"2026-11-20 09:00:00\",\"end_date\":\"2026-11-20 18:00:00\",\"currency\":\"EUR\",\"timezone\":\"Europe/Amsterdam\"}})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"Event\":{\"name\":\"Example conference\",\"start_date\":\"2026-11-20 09:00:00\",\"end_date\":\"2026-11-20 18:00:00\",\"currency\":\"EUR\",\"timezone\":\"Europe/Amsterdam\"}}')\nresponse = requests.request(\"POST\", f\"{os.environ['PAYDRO_ORIGIN']}/events/duplicate/{os.environ['EVENT_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EventMutation"
              },
              "examples": {
                "example": {
                  "value": {
                    "Event": {
                      "name": "Example conference",
                      "start_date": "2026-11-20 09:00:00",
                      "end_date": "2026-11-20 18:00:00",
                      "currency": "EUR",
                      "timezone": "Europe/Amsterdam"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/events/status/{status}.json": {
      "put": {
        "operationId": "changeEventStatus",
        "summary": "Change event shop status",
        "tags": ["Events"],
        "description": "Set open,close or sold_out. Opening requires company clearance. Transitioning a concept/test event cleans concept test state inside the transaction. This changes visitor-facing sales availability; review before execution.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.\n\nPermissions: company manager/editor or administrator (membership type >=1), plus operation-specific state/clearance rules.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/status"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "integer"
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    },
                    "Event": {
                      "type": "object",
                      "properties": {},
                      "additionalProperties": true
                    }
                  },
                  "additionalProperties": true
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "status": 200,
                      "title": "status changed",
                      "detail": "The status of the event is changed.",
                      "Event": {
                        "id": "11111111-1111-4111-8111-111111111111"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/events/status/${STATUS}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/events/status/' . getenv('STATUS') . '.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/events/status/${process.env.STATUS}.json`, {\n  method: \"PUT\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/events/status/{os.environ['STATUS']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/dashboard/shop_status.json": {
      "get": {
        "operationId": "getShopStatusMessages",
        "summary": "Read shop status messages",
        "tags": ["Events"],
        "description": "Returns organizer-facing status/availability messages. This UI projection does not replace stock and checkout validation.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean"
                    },
                    "messages": {
                      "type": "array",
                      "items": {}
                    }
                  },
                  "additionalProperties": true
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "success": true,
                      "messages": []
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/dashboard/shop_status.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/dashboard/shop_status.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/dashboard/shop_status.json`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/dashboard/shop_status.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/promocodes/all_data.json": {
      "get": {
        "operationId": "listEventUsedPromoCodes",
        "summary": "Read event promo-code labels",
        "tags": ["Promo codes"],
        "description": "Cached ID-to-code map for codes referenced by orders, scoped to authorized event/company access. Empty map can serialize as []; does not list every configured promotion.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/IfNoneMatch"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PromoCodeMap"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": []
                  }
                }
              }
            }
          },
          "304": {
            "description": "Unchanged cached map; no body."
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/promocodes/all_data.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/promocodes/all_data.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/promocodes/all_data.json`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/promocodes/all_data.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/promocodes/all_data.json": {
      "get": {
        "operationId": "listAccessibleUsedPromoCodes",
        "summary": "Read accessible promo-code labels",
        "tags": ["Promo codes"],
        "description": "Cached ID-to-code map for codes referenced by orders, scoped to authorized event/company access. Empty map can serialize as []; does not list every configured promotion.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "$ref": "#/components/parameters/IfNoneMatch"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PromoCodeMap"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": []
                  }
                }
              }
            }
          },
          "304": {
            "description": "Unchanged cached map; no body."
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/promocodes/all_data.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/promocodes/all_data.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/promocodes/all_data.json`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/promocodes/all_data.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/promocodes/add/{type}.json": {
      "post": {
        "operationId": "createPromoCode",
        "summary": "Create a promo code",
        "tags": ["Promo codes"],
        "description": "Create one products (product-specific price) or prd_prct (percentage) promotion. Product associations must belong to this event. For percentage codes, supply Promocode.discount. Batch creation through code_amount uses an unverified legacy redirect response and is excluded from this single-code contract.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "name": "type",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": ["products", "prd_prct"]
            },
            "description": "Creation type. Configure the corresponding payload fields."
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true,
                      "id": "77777777-7777-4777-8777-777777777777"
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request POST \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"Promocode\":{\"code\":\"WELCOME\",\"active\":1,\"stock\":100},\"ProductsPromocode\":[{\"product_id\":\"22222222-2222-4222-8222-222222222222\",\"active\":1,\"max\":1,\"price\":\"0.00\"}]}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/promocodes/add/${TYPE}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/promocodes/add/' . getenv('TYPE') . '.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"Promocode\":{\"code\":\"WELCOME\",\"active\":1,\"stock\":100},\"ProductsPromocode\":[{\"product_id\":\"22222222-2222-4222-8222-222222222222\",\"active\":1,\"max\":1,\"price\":\"0.00\"}]}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/promocodes/add/${process.env.TYPE}.json`, {\n  method: \"POST\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"Promocode\":{\"code\":\"WELCOME\",\"active\":1,\"stock\":100},\"ProductsPromocode\":[{\"product_id\":\"22222222-2222-4222-8222-222222222222\",\"active\":1,\"max\":1,\"price\":\"0.00\"}]})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"Promocode\":{\"code\":\"WELCOME\",\"active\":1,\"stock\":100},\"ProductsPromocode\":[{\"product_id\":\"22222222-2222-4222-8222-222222222222\",\"active\":1,\"max\":1,\"price\":\"0.00\"}]}')\nresponse = requests.request(\"POST\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/promocodes/add/{os.environ['TYPE']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PromoMutation"
              },
              "examples": {
                "example": {
                  "value": {
                    "Promocode": {
                      "code": "WELCOME",
                      "active": 1,
                      "stock": 100
                    },
                    "ProductsPromocode": [
                      {
                        "product_id": "22222222-2222-4222-8222-222222222222",
                        "active": 1,
                        "max": 1,
                        "price": "0.00"
                      }
                    ]
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/promocodes/edit/{promocode_id}.json": {
      "put": {
        "operationId": "updatePromoCode",
        "summary": "Update a promo code",
        "tags": ["Promo codes"],
        "description": "Updates allowed promo fields and event-scoped product associations. Validation/save errors have explicit JSON handling. A code referenced by orders can have editing restrictions.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/promocode_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true,
                      "id": "77777777-7777-4777-8777-777777777777"
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"Promocode\":{\"code\":\"WELCOME\",\"active\":1,\"stock\":100},\"ProductsPromocode\":[{\"product_id\":\"22222222-2222-4222-8222-222222222222\",\"active\":1,\"max\":1,\"price\":\"0.00\"}]}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/promocodes/edit/${PROMOCODE_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/promocodes/edit/' . getenv('PROMOCODE_ID') . '.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"Promocode\":{\"code\":\"WELCOME\",\"active\":1,\"stock\":100},\"ProductsPromocode\":[{\"product_id\":\"22222222-2222-4222-8222-222222222222\",\"active\":1,\"max\":1,\"price\":\"0.00\"}]}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/promocodes/edit/${process.env.PROMOCODE_ID}.json`, {\n  method: \"PUT\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"Promocode\":{\"code\":\"WELCOME\",\"active\":1,\"stock\":100},\"ProductsPromocode\":[{\"product_id\":\"22222222-2222-4222-8222-222222222222\",\"active\":1,\"max\":1,\"price\":\"0.00\"}]})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"Promocode\":{\"code\":\"WELCOME\",\"active\":1,\"stock\":100},\"ProductsPromocode\":[{\"product_id\":\"22222222-2222-4222-8222-222222222222\",\"active\":1,\"max\":1,\"price\":\"0.00\"}]}')\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/promocodes/edit/{os.environ['PROMOCODE_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PromoMutation"
              },
              "examples": {
                "example": {
                  "value": {
                    "Promocode": {
                      "code": "WELCOME",
                      "active": 1,
                      "stock": 100
                    },
                    "ProductsPromocode": [
                      {
                        "product_id": "22222222-2222-4222-8222-222222222222",
                        "active": 1,
                        "max": 1,
                        "price": "0.00"
                      }
                    ]
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/promocodes/activate/{promocode_id}.json": {
      "put": {
        "operationId": "activatePromoCode",
        "summary": "Activate a promo code",
        "tags": ["Promo codes"],
        "description": "Requires an authorized event code. Deletion is blocked when referenced. Read ok/error even on HTTP 200.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/promocode_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/promocodes/activate/${PROMOCODE_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/promocodes/activate/' . getenv('PROMOCODE_ID') . '.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/promocodes/activate/${process.env.PROMOCODE_ID}.json`, {\n  method: \"PUT\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/promocodes/activate/{os.environ['PROMOCODE_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/promocodes/deactivate/{promocode_id}.json": {
      "put": {
        "operationId": "deactivatePromoCode",
        "summary": "Deactivate a promo code",
        "tags": ["Promo codes"],
        "description": "Requires an authorized event code. Deletion is blocked when referenced. Read ok/error even on HTTP 200.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/promocode_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/promocodes/deactivate/${PROMOCODE_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/promocodes/deactivate/' . getenv('PROMOCODE_ID') . '.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/promocodes/deactivate/${process.env.PROMOCODE_ID}.json`, {\n  method: \"PUT\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/promocodes/deactivate/{os.environ['PROMOCODE_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/promocodes/delete/{promocode_id}.json": {
      "put": {
        "operationId": "deletePromoCode",
        "summary": "Delete a promo code",
        "tags": ["Promo codes"],
        "description": "Requires an authorized event code. Deletion is blocked when referenced. Read ok/error even on HTTP 200.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/promocode_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": true
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/promocodes/delete/${PROMOCODE_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/promocodes/delete/' . getenv('PROMOCODE_ID') . '.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/promocodes/delete/${process.env.PROMOCODE_ID}.json`, {\n  method: \"PUT\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/promocodes/delete/{os.environ['PROMOCODE_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/promocode_invites/view/{promocode_id}.json": {
      "get": {
        "operationId": "getPromoInvitationHistory",
        "summary": "Read promo invitation history",
        "tags": ["Promo codes"],
        "description": "Returns MailQues (up to 500 history rows), limit and remaining allowance. Request limit is 100; a restricted company can have a smaller organization-wide allowance.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/promocode_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "MailQues": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {},
                        "additionalProperties": true
                      }
                    },
                    "limit": {
                      "type": "integer"
                    },
                    "remaining": {
                      "type": ["integer", "null"]
                    }
                  },
                  "additionalProperties": true
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "MailQues": [],
                      "limit": 100,
                      "remaining": null
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/promocode_invites/view/${PROMOCODE_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/promocode_invites/view/' . getenv('PROMOCODE_ID') . '.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/promocode_invites/view/${process.env.PROMOCODE_ID}.json`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/promocode_invites/view/{os.environ['PROMOCODE_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/promocode_invites/add/{promocode_id}.json": {
      "post": {
        "operationId": "sendPromoInvitations",
        "summary": "Send promo invitations",
        "tags": ["Promo codes"],
        "description": "Queues mail for valid recipients, with per-row validation and duplicate-address/request/company limits. Firstname and email are required. Partial acceptance is possible: use queued_indices and rejected; resend only corrected rejected rows. Queuing is not proof of delivery.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/promocode_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PromoInvitationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "status": "ok",
                      "queued": 1,
                      "queued_indices": [0],
                      "rejected": [],
                      "message": "1 invitation queued.",
                      "limit": 100,
                      "remaining": null
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "All submitted recipients were rejected by validation/limits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PromoInvitationResult"
                }
              }
            }
          },
          "500": {
            "description": "The mail queue transaction failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PromoInvitationResult"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request POST \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"invites\":[{\"firstname\":\"Alex\",\"lastname\":\"Example\",\"email\":\"alex@example.com\"}]}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/promocode_invites/add/${PROMOCODE_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/promocode_invites/add/' . getenv('PROMOCODE_ID') . '.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"invites\":[{\"firstname\":\"Alex\",\"lastname\":\"Example\",\"email\":\"alex@example.com\"}]}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/promocode_invites/add/${process.env.PROMOCODE_ID}.json`, {\n  method: \"POST\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"invites\":[{\"firstname\":\"Alex\",\"lastname\":\"Example\",\"email\":\"alex@example.com\"}]})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"invites\":[{\"firstname\":\"Alex\",\"lastname\":\"Example\",\"email\":\"alex@example.com\"}]}')\nresponse = requests.request(\"POST\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/promocode_invites/add/{os.environ['PROMOCODE_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PromoInvitationRequest"
              },
              "examples": {
                "example": {
                  "value": {
                    "invites": [
                      {
                        "firstname": "Alex",
                        "lastname": "Example",
                        "email": "alex@example.com"
                      }
                    ]
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/acs/scan.json": {
      "post": {
        "operationId": "checkInTicket",
        "summary": "Check in a ticket",
        "tags": ["Checkin"],
        "description": "POST JSON only. Requires an organizer with event access or an established event-scoped access-code session. Do not submit access_code here; its exchange belongs to the rate-limited check-in UI. Returns [] when no eligible ticket is found; scanned reports prior check-in and checkedin=1 reports the resulting state.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Missing event permission/access-code session, raw access_code submission, or invalid Basic credentials.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    },
                    "status": {
                      "type": "integer"
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "additionalProperties": true
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "error": "authentication_failed"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScanResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": [
                      {
                        "id": "44444444-4444-4444-8444-444444444444",
                        "scanned": false,
                        "checkedin": 1
                      }
                    ]
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid or missing ticket UUID.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  },
                  "additionalProperties": true,
                  "required": ["error"]
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "error": "invalid_ticket_id"
                    }
                  }
                }
              }
            }
          },
          "415": {
            "description": "Content-Type must be application/json.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  },
                  "additionalProperties": true,
                  "required": ["error"]
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "error": "json_required"
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "Use POST."
          },
          "500": {
            "description": "Check-in failed.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  },
                  "additionalProperties": true,
                  "required": ["error"]
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "error": "scan_failed"
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request POST \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"scan\":\"44444444-4444-4444-8444-444444444444\"}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/acs/scan.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/acs/scan.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"scan\":\"44444444-4444-4444-8444-444444444444\"}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/acs/scan.json`, {\n  method: \"POST\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"scan\":\"44444444-4444-4444-8444-444444444444\"})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"scan\":\"44444444-4444-4444-8444-444444444444\"}')\nresponse = requests.request(\"POST\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/acs/scan.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ScanRequest"
              },
              "examples": {
                "example": {
                  "value": {
                    "scan": "44444444-4444-4444-8444-444444444444"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/acs/delete.json": {
      "post": {
        "operationId": "deleteCheckIn",
        "summary": "Remove a check-in record",
        "tags": ["Checkin"],
        "description": "Remove an event-scoped scan by Acs.id. The legacy success body is not a structured success object; verify the resulting scan state before updating local state.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": ["string", "null"]
                },
                "examples": {
                  "example": {
                    "summary": "Legacy null success body; re-read scan state.",
                    "value": null
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request POST \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"Acs\":{\"id\":\"123\"}}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/acs/delete.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/acs/delete.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"Acs\":{\"id\":\"123\"}}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/acs/delete.json`, {\n  method: \"POST\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"Acs\":{\"id\":\"123\"}})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"Acs\":{\"id\":\"123\"}}')\nresponse = requests.request(\"POST\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/acs/delete.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "Acs": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": ["string", "integer"]
                      }
                    },
                    "additionalProperties": false,
                    "required": ["id"]
                  }
                },
                "additionalProperties": false,
                "required": ["Acs"]
              },
              "examples": {
                "example": {
                  "value": {
                    "Acs": {
                      "id": "123"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/traffic_logs/index.json": {
      "get": {
        "operationId": "getEventTraffic",
        "summary": "Read event traffic analytics",
        "tags": ["Analytics"],
        "description": "Read last-90-day totals, last-24-hour count, last-hour visits, top UTM sources and cities. Treat visitor-level data as personal data; this is a UI-oriented projection.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Traffic"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "totals_last_90_days": [],
                      "total_last_24_hours": 0,
                      "last_hour_logs": [],
                      "top_utm_sources": [],
                      "top_cities": []
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/traffic_logs/index.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/traffic_logs/index.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/traffic_logs/index.json`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/traffic_logs/index.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/comments/index/{parent}/{parent_id}.json": {
      "get": {
        "operationId": "listNotes",
        "summary": "Read organizer notes",
        "tags": ["Supportingdata"],
        "description": "Parent is Event,Order or OrderLine. Parent ownership is checked; original order versions can share notes.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/parent"
          },
          {
            "$ref": "#/components/parameters/parent_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CommentRecord"
                  }
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": []
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/comments/index/${PARENT}/${PARENT_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/comments/index/' . getenv('PARENT') . '/' . getenv('PARENT_ID') . '.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/comments/index/${process.env.PARENT}/${process.env.PARENT_ID}.json`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/comments/index/{os.environ['PARENT']}/{os.environ['PARENT_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/comments/add/{parent}/{parent_id}.json": {
      "put": {
        "operationId": "createNote",
        "summary": "Add an organizer note",
        "tags": ["Supportingdata"],
        "description": "Parent is Event,Order or OrderLine. Server assigns author; checks parent/event membership. Response is a JSON boolean, not an object.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.\n\nPermissions: active organizer with rights to the parent event; edits also require authorship and the 15-minute window. Comment text requires 2–500 characters after trimming.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/parent"
          },
          {
            "$ref": "#/components/parameters/parent_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Validation, author/edit-window, access, missing note/parent or storage failure. Invalid Basic credentials can use the shared legacy error object.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "type": "boolean",
                      "const": false
                    },
                    {
                      "$ref": "#/components/schemas/LegacyError"
                    }
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "boolean"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": true
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validation, author/edit-window, access, missing note/parent or storage failure. Invalid Basic credentials can use the shared legacy error object.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "type": "boolean",
                      "const": false
                    },
                    {
                      "$ref": "#/components/schemas/LegacyError"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Validation, author/edit-window, access, missing note/parent or storage failure. Invalid Basic credentials can use the shared legacy error object.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "type": "boolean",
                      "const": false
                    },
                    {
                      "$ref": "#/components/schemas/LegacyError"
                    }
                  ]
                }
              }
            }
          },
          "500": {
            "description": "Validation, author/edit-window, access, missing note/parent or storage failure. Invalid Basic credentials can use the shared legacy error object.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "type": "boolean",
                      "const": false
                    },
                    {
                      "$ref": "#/components/schemas/LegacyError"
                    }
                  ]
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"Comment\":{\"comment\":\"Follow up with the attendee.\"}}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/comments/add/${PARENT}/${PARENT_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/comments/add/' . getenv('PARENT') . '/' . getenv('PARENT_ID') . '.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"Comment\":{\"comment\":\"Follow up with the attendee.\"}}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/comments/add/${process.env.PARENT}/${process.env.PARENT_ID}.json`, {\n  method: \"PUT\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"Comment\":{\"comment\":\"Follow up with the attendee.\"}})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"Comment\":{\"comment\":\"Follow up with the attendee.\"}}')\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/comments/add/{os.environ['PARENT']}/{os.environ['PARENT_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "Comment": {
                    "type": "object",
                    "properties": {
                      "comment": {
                        "type": "string",
                        "minLength": 2,
                        "maxLength": 500,
                        "description": "Trimmed text, 2–500 characters. Author and creation time are server-assigned."
                      }
                    },
                    "additionalProperties": false,
                    "required": ["comment"]
                  }
                },
                "additionalProperties": false,
                "required": ["Comment"]
              },
              "examples": {
                "example": {
                  "value": {
                    "Comment": {
                      "comment": "Follow up with the attendee."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/comments/edit/{comment_id}.json": {
      "put": {
        "operationId": "updateNote",
        "summary": "Edit an organizer note",
        "tags": ["Supportingdata"],
        "description": "Only the author can edit within 15 minutes of creation. Parent/event permissions are retained. Response is a JSON boolean.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.\n\nPermissions: active organizer with rights to the parent event; edits also require authorship and the 15-minute window. Comment text requires 2–500 characters after trimming.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/comment_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Validation, author/edit-window, access, missing note/parent or storage failure. Invalid Basic credentials can use the shared legacy error object.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "type": "boolean",
                      "const": false
                    },
                    {
                      "$ref": "#/components/schemas/LegacyError"
                    }
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "boolean"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": true
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validation, author/edit-window, access, missing note/parent or storage failure. Invalid Basic credentials can use the shared legacy error object.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "type": "boolean",
                      "const": false
                    },
                    {
                      "$ref": "#/components/schemas/LegacyError"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Validation, author/edit-window, access, missing note/parent or storage failure. Invalid Basic credentials can use the shared legacy error object.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "type": "boolean",
                      "const": false
                    },
                    {
                      "$ref": "#/components/schemas/LegacyError"
                    }
                  ]
                }
              }
            }
          },
          "500": {
            "description": "Validation, author/edit-window, access, missing note/parent or storage failure. Invalid Basic credentials can use the shared legacy error object.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "type": "boolean",
                      "const": false
                    },
                    {
                      "$ref": "#/components/schemas/LegacyError"
                    }
                  ]
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"Comment\":{\"comment\":\"Updated follow-up note.\"}}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/comments/edit/${COMMENT_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/comments/edit/' . getenv('COMMENT_ID') . '.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"Comment\":{\"comment\":\"Updated follow-up note.\"}}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/comments/edit/${process.env.COMMENT_ID}.json`, {\n  method: \"PUT\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"Comment\":{\"comment\":\"Updated follow-up note.\"}})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"Comment\":{\"comment\":\"Updated follow-up note.\"}}')\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/comments/edit/{os.environ['COMMENT_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "Comment": {
                    "type": "object",
                    "properties": {
                      "comment": {
                        "type": "string",
                        "minLength": 2,
                        "maxLength": 500,
                        "description": "Trimmed text, 2–500 characters. Author and creation time are server-assigned."
                      }
                    },
                    "additionalProperties": false,
                    "required": ["comment"]
                  }
                },
                "additionalProperties": false,
                "required": ["Comment"]
              },
              "examples": {
                "example": {
                  "value": {
                    "Comment": {
                      "comment": "Updated follow-up note."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/favorites/check.json": {
      "get": {
        "operationId": "getEventFavorite",
        "summary": "Read event favorite state",
        "tags": ["Supportingdata"],
        "description": "Returns the current organizer favorite state for an accessible event.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean"
                    },
                    "follow": {
                      "type": "boolean"
                    },
                    "status": {
                      "type": "integer"
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "additionalProperties": true
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "success": true,
                      "follow": false
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/favorites/check.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/favorites/check.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/favorites/check.json`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/favorites/check.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/favorites/switcher.json": {
      "post": {
        "operationId": "setEventFavorite",
        "summary": "Set event favorite state",
        "tags": ["Supportingdata"],
        "description": "Sets follow to the submitted boolean; requires event membership.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean"
                    },
                    "follow": {
                      "type": "boolean"
                    },
                    "status": {
                      "type": "integer"
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "additionalProperties": true
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "success": true,
                      "follow": true
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request POST \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"follow\":true}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/favorites/switcher.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/favorites/switcher.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"follow\":true}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/favorites/switcher.json`, {\n  method: \"POST\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"follow\":true})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"follow\":true}')\nresponse = requests.request(\"POST\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/favorites/switcher.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "follow": {
                    "type": "boolean"
                  }
                },
                "additionalProperties": false,
                "required": ["follow"]
              },
              "examples": {
                "example": {
                  "value": {
                    "follow": true
                  }
                }
              }
            }
          }
        }
      }
    },
    "/companies/my.json": {
      "get": {
        "operationId": "listMyCompanies",
        "summary": "List accessible companies",
        "tags": ["Supportingdata"],
        "description": "Returns company wrappers for current live memberships.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "myCompanies": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {},
                        "additionalProperties": true
                      }
                    }
                  },
                  "additionalProperties": true,
                  "required": ["myCompanies"]
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "myCompanies": []
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/companies/my.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/companies/my.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/companies/my.json`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/companies/my.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/users/profile.json": {
      "get": {
        "operationId": "getMyProfile",
        "summary": "Read organizer profile",
        "tags": ["Supportingdata"],
        "description": "Returns the authenticated organizer profile. Keep personal fields private.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "name": {
                      "type": "string"
                    },
                    "last_name": {
                      "type": "string"
                    },
                    "email": {
                      "type": "string"
                    },
                    "photo_id": {
                      "type": ["string", "null"]
                    }
                  },
                  "additionalProperties": true
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "id": "44444444-4444-4444-8444-444444444444",
                      "name": "Alex",
                      "last_name": "Example",
                      "email": "alex@example.com",
                      "photo_id": null
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/users/profile.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/users/profile.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/users/profile.json`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/users/profile.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/users/all_data.json": {
      "get": {
        "operationId": "listOrganizerDirectory",
        "summary": "Read accessible organizer directory",
        "tags": ["Supportingdata"],
        "description": "Membership-scoped directory with private payload caching. Fields are a legacy UI projection; use only required data.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "$ref": "#/components/parameters/IfNoneMatch"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/users/all_data.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/users/all_data.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/users/all_data.json`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/users/all_data.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/files/upload.json": {
      "post": {
        "operationId": "uploadEventFile",
        "summary": "Upload an event file",
        "tags": ["Files"],
        "description": "Use POST for multipart uploads: the current PHP/CakePHP request parser populates uploaded-file data from multipart POST requests.\n\nRequires company administrator file-management rights (company rights=2). Multipart field data[Event][file_upload]. Existing file-format rules apply. Event storage allowance is a soft 25,000,000-byte quota: the crossing upload is accepted, subsequent uploads blocked. Success includes attachment_id and a bearer download URL.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FileResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "success": true,
                      "status": 200,
                      "title": "ok",
                      "detail": "The file was uploaded.",
                      "attachment_id": "22222222-2222-4222-8222-222222222222",
                      "attachment": "https://files.paydro.com/attachments/download/22222222-2222-4222-8222-222222222222"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Missing/invalid upload or validation failure.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FileResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "success": false,
                      "status": 400,
                      "title": "file_required",
                      "detail": "Select a file to upload."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Event file storage allowance reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FileResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "success": false,
                      "status": 409,
                      "title": "storage_quota_reached",
                      "detail": "Maximum storage reached."
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request POST \\\n  --header \"Accept: application/json\" \\\n  --form \"data[Event][file_upload]=@${FILE_PATH}\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/files/upload.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/files/upload.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, ['data[Event][file_upload]' => new CURLFile(getenv('FILE_PATH'))]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst { readFile } = await import('node:fs/promises');\nconst form = new FormData();\nform.append('data[Event][file_upload]', new Blob([await readFile(process.env.FILE_PATH)]), 'example.pdf');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/files/upload.json`, {\n  method: \"POST\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" },\n  body: form\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nwith open(os.environ[\"FILE_PATH\"], \"rb\") as upload:\n    response = requests.request(\"POST\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/files/upload.json\",\n        auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n        headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, files={\"data[Event][file_upload]\": (\"example.pdf\", upload, \"application/pdf\")})\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "data[Event][file_upload]": {
                    "type": "string",
                    "format": "binary"
                  }
                },
                "additionalProperties": false,
                "required": ["data[Event][file_upload]"]
              }
            }
          }
        }
      }
    },
    "/{event_id}/files/delete/{attachment_id}.json": {
      "post": {
        "operationId": "deleteEventFile",
        "summary": "Delete an event file",
        "tags": ["Files"],
        "description": "Requires company administrator file-management rights and attachment ownership in this event. Deletion invalidates the existing file download link.\n\nAuthorization: active organizer with company/event access; additional restrictions are described above. Implementation was reviewed in controllers, models and serializers. Successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/attachment_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Successful response. Inspect the body for operation-specific success and error fields.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FileResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "success": true,
                      "status": 200,
                      "title": "ok",
                      "detail": "The file was deleted."
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request POST \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/files/delete/${ATTACHMENT_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/files/delete/' . getenv('ATTACHMENT_ID') . '.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/files/delete/${process.env.ATTACHMENT_ID}.json`, {\n  method: \"POST\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"POST\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/files/delete/{os.environ['ATTACHMENT_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/attachments/download/{attachment_id}": {
      "get": {
        "operationId": "downloadAttachment",
        "summary": "Download an attachment",
        "tags": ["Files"],
        "description": "Bearer download URL: possession of the unguessable attachment UUID grants access without login. Treat URLs as secrets and share only with intended recipients. This operation uses the files service hostname, not the organizer origin. Source-reviewed download handler.",
        "parameters": [
          {
            "$ref": "#/components/parameters/attachment_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "File download. Inspect Content-Type and Content-Disposition; access failures may return HTML or a redirect.",
            "headers": {
              "Content-Disposition": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/octet-stream": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "image/jpeg": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "image/png": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "text/plain": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body \\\n  --request GET \\\n  --header \"Accept: application/octet-stream\" \\\n  --output paydro-download.bin \\\n  \"$PAYDRO_FILES_ORIGIN/attachments/download/${ATTACHMENT_ID}\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_FILES_ORIGIN') . '/attachments/download/' . getenv('ATTACHMENT_ID') . '');\n$headers = ['Accept: application/octet-stream'];\ncurl_setopt_array($ch, [CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nfile_put_contents('paydro-download.bin', $body);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const response = await fetch(`${process.env.PAYDRO_FILES_ORIGIN}/attachments/download/${process.env.ATTACHMENT_ID}`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Accept: \"application/octet-stream\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconst { writeFile } = await import('node:fs/promises');\nawait writeFile('paydro-download.bin', Buffer.from(await response.arrayBuffer()));"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_FILES_ORIGIN']}/attachments/download/{os.environ['ATTACHMENT_ID']}\",\n    headers={\"Accept\": \"application/octet-stream\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nwith open(\"paydro-download.bin\", \"wb\") as output:\n    output.write(response.content)"
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "security": [],
        "servers": [
          {
            "url": "https://files.{domain}",
            "variables": {
              "domain": {
                "default": "paydro.com",
                "enum": ["paydro.com", "test.test"]
              }
            }
          }
        ]
      }
    },
    "/{event_id}/orders/export_to/csv": {
      "get": {
        "operationId": "exportOrdersCsv",
        "summary": "Export orders as Csv",
        "tags": ["Exports"],
        "description": "Authorized event export. Fields/format follow the current organizer export; includes personal data. Save the file response and verify its content type.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "File download. Inspect Content-Type and Content-Disposition; access failures may return HTML or a redirect.",
            "headers": {
              "Content-Disposition": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/csv": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/octet-stream\" \\\n  --output paydro-download.bin \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/orders/export_to/csv\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/orders/export_to/csv');\n$headers = ['Accept: application/octet-stream'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nfile_put_contents('paydro-download.bin', $body);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/orders/export_to/csv`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/octet-stream\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconst { writeFile } = await import('node:fs/promises');\nawait writeFile('paydro-download.bin', Buffer.from(await response.arrayBuffer()));"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/orders/export_to/csv\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/octet-stream\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nwith open(\"paydro-download.bin\", \"wb\") as output:\n    output.write(response.content)"
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/orders/exportexcel": {
      "get": {
        "operationId": "exportOrdersExcel",
        "summary": "Export orders as Excel",
        "tags": ["Exports"],
        "description": "Authorized event export. Fields/format follow the current organizer export; includes personal data. Save the file response and verify its content type.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "File download. Inspect Content-Type and Content-Disposition; access failures may return HTML or a redirect.",
            "headers": {
              "Content-Disposition": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/octet-stream\" \\\n  --output paydro-download.bin \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/orders/exportexcel\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/orders/exportexcel');\n$headers = ['Accept: application/octet-stream'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nfile_put_contents('paydro-download.bin', $body);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/orders/exportexcel`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/octet-stream\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconst { writeFile } = await import('node:fs/promises');\nawait writeFile('paydro-download.bin', Buffer.from(await response.arrayBuffer()));"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/orders/exportexcel\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/octet-stream\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nwith open(\"paydro-download.bin\", \"wb\") as output:\n    output.write(response.content)"
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/order_lines/export_to/csv": {
      "get": {
        "operationId": "exportOrderlinesCsv",
        "summary": "Export attendees as Csv",
        "tags": ["Exports"],
        "description": "Authorized event export. Fields/format follow the current organizer export; includes personal data. Save the file response and verify its content type.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "File download. Inspect Content-Type and Content-Disposition; access failures may return HTML or a redirect.",
            "headers": {
              "Content-Disposition": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/csv": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/octet-stream\" \\\n  --output paydro-download.bin \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/order_lines/export_to/csv\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/order_lines/export_to/csv');\n$headers = ['Accept: application/octet-stream'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nfile_put_contents('paydro-download.bin', $body);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/order_lines/export_to/csv`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/octet-stream\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconst { writeFile } = await import('node:fs/promises');\nawait writeFile('paydro-download.bin', Buffer.from(await response.arrayBuffer()));"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/order_lines/export_to/csv\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/octet-stream\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nwith open(\"paydro-download.bin\", \"wb\") as output:\n    output.write(response.content)"
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/order_lines/exportexcel": {
      "get": {
        "operationId": "exportOrderlinesExcel",
        "summary": "Export attendees as Excel",
        "tags": ["Exports"],
        "description": "Authorized event export. Fields/format follow the current organizer export; includes personal data. Save the file response and verify its content type.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "File download. Inspect Content-Type and Content-Disposition; access failures may return HTML or a redirect.",
            "headers": {
              "Content-Disposition": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/octet-stream\" \\\n  --output paydro-download.bin \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/order_lines/exportexcel\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/order_lines/exportexcel');\n$headers = ['Accept: application/octet-stream'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nfile_put_contents('paydro-download.bin', $body);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/order_lines/exportexcel`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/octet-stream\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconst { writeFile } = await import('node:fs/promises');\nawait writeFile('paydro-download.bin', Buffer.from(await response.arrayBuffer()));"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/order_lines/exportexcel\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/octet-stream\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nwith open(\"paydro-download.bin\", \"wb\") as output:\n    output.write(response.content)"
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/waitinglists/export_to/csv": {
      "get": {
        "operationId": "exportWaitinglistsCsv",
        "summary": "Export waiting-list entries as Csv",
        "tags": ["Exports"],
        "description": "Authorized event export. Fields/format follow the current organizer export; includes personal data. Save the file response and verify its content type.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "File download. Inspect Content-Type and Content-Disposition; access failures may return HTML or a redirect.",
            "headers": {
              "Content-Disposition": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/csv": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/octet-stream\" \\\n  --output paydro-download.bin \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/waitinglists/export_to/csv\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/waitinglists/export_to/csv');\n$headers = ['Accept: application/octet-stream'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nfile_put_contents('paydro-download.bin', $body);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/waitinglists/export_to/csv`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/octet-stream\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconst { writeFile } = await import('node:fs/promises');\nawait writeFile('paydro-download.bin', Buffer.from(await response.arrayBuffer()));"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/waitinglists/export_to/csv\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/octet-stream\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nwith open(\"paydro-download.bin\", \"wb\") as output:\n    output.write(response.content)"
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/waitinglists/exportexcel": {
      "get": {
        "operationId": "exportWaitinglistsExcel",
        "summary": "Export waiting-list entries as Excel",
        "tags": ["Exports"],
        "description": "Authorized event export. Fields/format follow the current organizer export; includes personal data. Save the file response and verify its content type.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "File download. Inspect Content-Type and Content-Disposition; access failures may return HTML or a redirect.",
            "headers": {
              "Content-Disposition": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/octet-stream\" \\\n  --output paydro-download.bin \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/waitinglists/exportexcel\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/waitinglists/exportexcel');\n$headers = ['Accept: application/octet-stream'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nfile_put_contents('paydro-download.bin', $body);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/waitinglists/exportexcel`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/octet-stream\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconst { writeFile } = await import('node:fs/promises');\nawait writeFile('paydro-download.bin', Buffer.from(await response.arrayBuffer()));"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/waitinglists/exportexcel\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/octet-stream\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nwith open(\"paydro-download.bin\", \"wb\") as output:\n    output.write(response.content)"
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/acs/export_to/csv": {
      "get": {
        "operationId": "exportAcsCsv",
        "summary": "Export check-ins as Csv",
        "tags": ["Exports"],
        "description": "Authorized event export. Fields/format follow the current organizer export; includes personal data. Save the file response and verify its content type.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "File download. Inspect Content-Type and Content-Disposition; access failures may return HTML or a redirect.",
            "headers": {
              "Content-Disposition": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/csv": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/octet-stream\" \\\n  --output paydro-download.bin \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/acs/export_to/csv\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/acs/export_to/csv');\n$headers = ['Accept: application/octet-stream'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nfile_put_contents('paydro-download.bin', $body);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/acs/export_to/csv`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/octet-stream\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconst { writeFile } = await import('node:fs/promises');\nawait writeFile('paydro-download.bin', Buffer.from(await response.arrayBuffer()));"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/acs/export_to/csv\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/octet-stream\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nwith open(\"paydro-download.bin\", \"wb\") as output:\n    output.write(response.content)"
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/acs/noshow_export_to/csv": {
      "get": {
        "operationId": "exportNoShowsCsv",
        "summary": "Export no-shows as CSV",
        "tags": ["Exports"],
        "description": "Authorized event no-show export; includes personal attendee data.\n\nAuthorization: active organizer with company/event access, except documented bearer downloads. Source-reviewed; selected local synthetic reads were also probed. See /en-us/docs/testing.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "File download. Inspect Content-Type and Content-Disposition; access failures may return HTML or a redirect.",
            "headers": {
              "Content-Disposition": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/csv": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/octet-stream\" \\\n  --output paydro-download.bin \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/acs/noshow_export_to/csv\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/acs/noshow_export_to/csv');\n$headers = ['Accept: application/octet-stream'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nfile_put_contents('paydro-download.bin', $body);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/acs/noshow_export_to/csv`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/octet-stream\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconst { writeFile } = await import('node:fs/promises');\nawait writeFile('paydro-download.bin', Buffer.from(await response.arrayBuffer()));"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/acs/noshow_export_to/csv\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/octet-stream\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nwith open(\"paydro-download.bin\", \"wb\") as output:\n    output.write(response.content)"
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/orders/download_invoice/{order_id}": {
      "get": {
        "operationId": "downloadOrderInvoice",
        "summary": "Download an invoice",
        "tags": ["Files"],
        "description": "Customer document bearer download: possession of the unguessable order UUID grants access without login. The order is scoped to the event in the URL; document/payment-state gates apply. Keep these URLs and IDs private. Source-reviewed; download bytes were not probed during discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/order_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "File download. Inspect Content-Type and Content-Disposition; access failures may return HTML or a redirect.",
            "headers": {
              "Content-Disposition": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/octet-stream\" \\\n  --output paydro-download.bin \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/orders/download_invoice/${ORDER_ID}\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/orders/download_invoice/' . getenv('ORDER_ID') . '');\n$headers = ['Accept: application/octet-stream'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nfile_put_contents('paydro-download.bin', $body);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/orders/download_invoice/${process.env.ORDER_ID}`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/octet-stream\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconst { writeFile } = await import('node:fs/promises');\nawait writeFile('paydro-download.bin', Buffer.from(await response.arrayBuffer()));"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/orders/download_invoice/{os.environ['ORDER_ID']}\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/octet-stream\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nwith open(\"paydro-download.bin\", \"wb\") as output:\n    output.write(response.content)"
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "security": []
      }
    },
    "/{event_id}/orders/download_tickets/{order_id}": {
      "get": {
        "operationId": "downloadOrderTickets",
        "summary": "Download order tickets",
        "tags": ["Files"],
        "description": "Customer document bearer download: possession of the unguessable order UUID grants access without login. The order is scoped to the event in the URL; document/payment-state gates apply. Keep these URLs and IDs private. Source-reviewed; download bytes were not probed during discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/order_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "File download. Inspect Content-Type and Content-Disposition; access failures may return HTML or a redirect.",
            "headers": {
              "Content-Disposition": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/octet-stream\" \\\n  --output paydro-download.bin \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/orders/download_tickets/${ORDER_ID}\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/orders/download_tickets/' . getenv('ORDER_ID') . '');\n$headers = ['Accept: application/octet-stream'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nfile_put_contents('paydro-download.bin', $body);"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/orders/download_tickets/${process.env.ORDER_ID}`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/octet-stream\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconst { writeFile } = await import('node:fs/promises');\nawait writeFile('paydro-download.bin', Buffer.from(await response.arrayBuffer()));"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/orders/download_tickets/{os.environ['ORDER_ID']}\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/octet-stream\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nwith open(\"paydro-download.bin\", \"wb\") as output:\n    output.write(response.content)"
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "security": []
      }
    },
    "/{event_id}/category_fields/order/{category_id}.json": {
      "post": {
        "operationId": "reorderTicketQuestions",
        "summary": "Reorder ticket questions",
        "tags": ["Category questions"],
        "description": "POST a complete CategoryField UUID array for the event-owned category. Every current question must appear exactly once; invalid/incomplete selections return 400. Success is 204 without a body. Source-reviewed, successful mutation not executed during discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/category_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "204": {
            "description": "Saved. No response body."
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request POST \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"CategoryField\":[\"77777777-7777-4777-8777-777777777777\"]}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/category_fields/order/${CATEGORY_ID}.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/category_fields/order/' . getenv('CATEGORY_ID') . '.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"CategoryField\":[\"77777777-7777-4777-8777-777777777777\"]}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/category_fields/order/${process.env.CATEGORY_ID}.json`, {\n  method: \"POST\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"CategoryField\":[\"77777777-7777-4777-8777-777777777777\"]})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"CategoryField\":[\"77777777-7777-4777-8777-777777777777\"]}')\nresponse = requests.request(\"POST\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/category_fields/order/{os.environ['CATEGORY_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful."
          }
        ],
        "x-verification": "Source-reviewed; selected JSON reads and rejected writes additionally probed locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "CategoryField": {
                    "type": "array",
                    "minItems": 1,
                    "items": {
                      "type": "string",
                      "format": "uuid"
                    }
                  }
                },
                "required": ["CategoryField"],
                "additionalProperties": false
              },
              "example": {
                "CategoryField": ["77777777-7777-4777-8777-777777777777"]
              }
            }
          }
        }
      }
    },
    "/{event_id}/categories/add.json": {
      "post": {
        "operationId": "createCategory",
        "summary": "Create a category",
        "tags": ["Categories"],
        "description": "Submit Category.name (2–100 characters). The server assigns the event and next order; submitted IDs/order do not control creation. Success is a legacy 302 redirect to categories/index, with no JSON ID result. Re-read the list and reconcile before retrying an uncertain creation.\n\nAuthorization: active organizer with company/event access. Source-reviewed controller, model and JSON template; successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "302": {
            "description": "Legacy redirect. Creation success redirects to the organizer page; inaccessible IDs may also redirect. The generic JSON body can contain invalid_request even after successful creation. Check Location and re-read categories/index.json to confirm; do not follow automatically.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "error": "invalid_request"
                    }
                  }
                }
              }
            },
            "headers": {
              "Location": {
                "description": "Organizer page destination, including the new question UUID after question creation.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "description": "Category validation failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MutationResult"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "ok": false,
                      "status": 400,
                      "error": "validation_failed",
                      "validation_errors": {
                        "name": ["Name is required."]
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --include --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request POST \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"Category\":{\"name\":\"Workshops\"}}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/categories/add.json\"\n# Inspect Location; re-read categories/index.json to confirm the resulting definition."
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/categories/add.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"Category\":{\"name\":\"Workshops\"}}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 400) throw new RuntimeException('Paydro request failed');\n$location = curl_getinfo($ch, CURLINFO_REDIRECT_URL);\ncurl_close($ch);\nif ($status === 200) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful.\n// On 302 inspect $location and re-read categories/index.json; the redirect JSON body is not a creation result."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/categories/add.json`, {\n  method: \"POST\", redirect: \"manual\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"Category\":{\"name\":\"Workshops\"}})\n});\nif (!response.ok && response.status !== 302) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status === 200) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful.\nif (response.status === 302) console.log(response.headers.get(\"location\"));\n// Re-read categories/index.json to confirm the resulting definition."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"Category\":{\"name\":\"Workshops\"}}')\nresponse = requests.request(\"POST\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/categories/add.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 400:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code == 200:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful.\nif response.status_code == 302:\n    location = response.headers.get(\"Location\")\n# Re-read categories/index.json to confirm the resulting definition."
          }
        ],
        "x-verification": "Source-reviewed; selected synthetic reads and rejected writes checked locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "Category": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "string",
                        "minLength": 2,
                        "maxLength": 100
                      }
                    },
                    "additionalProperties": false,
                    "required": ["name"]
                  }
                },
                "additionalProperties": false,
                "required": ["Category"]
              },
              "examples": {
                "example": {
                  "value": {
                    "Category": {
                      "name": "Workshops"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/category_fields/edit/{category_id}/{question_id}.json": {
      "get": {
        "operationId": "getCategoryQuestion",
        "summary": "Read a category question",
        "tags": ["Category questions"],
        "description": "Returns CategoryField form data for an event-owned question in the specified category. For all definitions, use GET categories/index.json. No question list JSON view exists at category_fields/view. Missing or foreign IDs can redirect.\n\nAuthorization: active organizer with company/event access. Source-reviewed controller, model and JSON template; successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/category_id"
          },
          {
            "$ref": "#/components/parameters/question_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Current question definition.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuestionDefinitionRecord"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "CategoryField": {
                        "id": "77777777-7777-4777-8777-777777777777",
                        "category_id": "55555555-5555-4555-8555-555555555555",
                        "name": "Dietary preference",
                        "type": "text",
                        "mandatory": 0,
                        "on_ticket": 1
                      }
                    }
                  }
                }
              }
            }
          },
          "302": {
            "description": "Legacy redirect. Creation success redirects to the organizer page; inaccessible IDs may also redirect. The generic JSON body can contain invalid_request even after successful creation. Check Location and re-read categories/index.json to confirm; do not follow automatically.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "error": "invalid_request"
                    }
                  }
                }
              }
            },
            "headers": {
              "Location": {
                "description": "Organizer page destination, including the new question UUID after question creation.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --include --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/category_fields/edit/${CATEGORY_ID}/${QUESTION_ID}.json\"\n# Inspect Location; re-read categories/index.json to confirm the resulting definition."
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/category_fields/edit/' . getenv('CATEGORY_ID') . '/' . getenv('QUESTION_ID') . '.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 400) throw new RuntimeException('Paydro request failed');\n$location = curl_getinfo($ch, CURLINFO_REDIRECT_URL);\ncurl_close($ch);\nif ($status === 200) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful.\n// On 302 inspect $location and re-read categories/index.json; the redirect JSON body is not a creation result."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/category_fields/edit/${process.env.CATEGORY_ID}/${process.env.QUESTION_ID}.json`, {\n  method: \"GET\", redirect: \"manual\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok && response.status !== 302) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status === 200) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful.\nif (response.status === 302) console.log(response.headers.get(\"location\"));\n// Re-read categories/index.json to confirm the resulting definition."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/category_fields/edit/{os.environ['CATEGORY_ID']}/{os.environ['QUESTION_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 400:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code == 200:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful.\nif response.status_code == 302:\n    location = response.headers.get(\"Location\")\n# Re-read categories/index.json to confirm the resulting definition."
          }
        ],
        "x-verification": "Source-reviewed; selected synthetic reads and rejected writes checked locally. See /en-us/docs/testing."
      },
      "put": {
        "operationId": "updateCategoryQuestion",
        "summary": "Update a category question",
        "tags": ["Category questions"],
        "description": "Submit required name/type and changes in CategoryField. The route question/category IDs are authoritative. Success echoes submitted form data (with assigned IDs), rather than ok:true; re-read definitions to confirm. Changes affect current registration definitions; existing purchased ticket snapshots are updated separately.\n\nAuthorization: active organizer with company/event access. Source-reviewed controller, model and JSON template; successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/category_id"
          },
          {
            "$ref": "#/components/parameters/question_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Submitted form data. No structured success flag; confirm with a new read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuestionDefinitionRecord"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "CategoryField": {
                        "name": "Dietary preference",
                        "type": "text",
                        "mandatory": 0,
                        "on_ticket": 1,
                        "id": "77777777-7777-4777-8777-777777777777",
                        "category_id": "55555555-5555-4555-8555-555555555555"
                      }
                    }
                  }
                }
              }
            }
          },
          "302": {
            "description": "Legacy redirect. Creation success redirects to the organizer page; inaccessible IDs may also redirect. The generic JSON body can contain invalid_request even after successful creation. Check Location and re-read categories/index.json to confirm; do not follow automatically.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "error": "invalid_request"
                    }
                  }
                }
              }
            },
            "headers": {
              "Location": {
                "description": "Organizer page destination, including the new question UUID after question creation.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "description": "Question validation failed; no successful save.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuestionValidationError"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "success": false,
                      "error": "validation_failed",
                      "errors": {
                        "name": ["Name must contain 2–255 characters."]
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --include --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"CategoryField\":{\"name\":\"Dietary preference\",\"type\":\"text\",\"mandatory\":0,\"on_ticket\":1}}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/category_fields/edit/${CATEGORY_ID}/${QUESTION_ID}.json\"\n# Inspect Location; re-read categories/index.json to confirm the resulting definition.\n# No structured success flag: re-read definitions or attendee snapshots after a successful HTTP response."
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/category_fields/edit/' . getenv('CATEGORY_ID') . '/' . getenv('QUESTION_ID') . '.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"CategoryField\":{\"name\":\"Dietary preference\",\"type\":\"text\",\"mandatory\":0,\"on_ticket\":1}}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 400) throw new RuntimeException('Paydro request failed');\n$location = curl_getinfo($ch, CURLINFO_REDIRECT_URL);\ncurl_close($ch);\nif ($status === 200) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful.\n// On 302 inspect $location and re-read categories/index.json; the redirect JSON body is not a creation result.\n// No structured success flag: re-read definitions or attendee snapshots after a successful HTTP response."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/category_fields/edit/${process.env.CATEGORY_ID}/${process.env.QUESTION_ID}.json`, {\n  method: \"PUT\", redirect: \"manual\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"CategoryField\":{\"name\":\"Dietary preference\",\"type\":\"text\",\"mandatory\":0,\"on_ticket\":1}})\n});\nif (!response.ok && response.status !== 302) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status === 200) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful.\nif (response.status === 302) console.log(response.headers.get(\"location\"));\n// Re-read categories/index.json to confirm the resulting definition.\n// No structured success flag: re-read definitions or attendee snapshots after a successful HTTP response."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"CategoryField\":{\"name\":\"Dietary preference\",\"type\":\"text\",\"mandatory\":0,\"on_ticket\":1}}')\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/category_fields/edit/{os.environ['CATEGORY_ID']}/{os.environ['QUESTION_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 400:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code == 200:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful.\nif response.status_code == 302:\n    location = response.headers.get(\"Location\")\n# Re-read categories/index.json to confirm the resulting definition.\n# No structured success flag: re-read definitions or attendee snapshots after a successful HTTP response."
          }
        ],
        "x-verification": "Source-reviewed; selected synthetic reads and rejected writes checked locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QuestionMutation"
              },
              "examples": {
                "example": {
                  "value": {
                    "CategoryField": {
                      "name": "Dietary preference",
                      "type": "text",
                      "mandatory": 0,
                      "on_ticket": 1
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/category_fields/edit/{category_id}.json": {
      "put": {
        "operationId": "createCategoryQuestion",
        "summary": "Create a category question",
        "tags": ["Category questions"],
        "description": "Submit CategoryField.name (2–255 characters) and type, with optional question configuration. The route category belongs to this event; the server assigns category_id and question ID. Success redirects to its organizer edit page with the new UUID and success=1. There is no JSON creation envelope; re-read categories/index.json to confirm and avoid duplicate retries.\n\nAuthorization: active organizer with company/event access. Source-reviewed controller, model and JSON template; successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/category_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "302": {
            "description": "Legacy redirect. Creation success redirects to the organizer page; inaccessible IDs may also redirect. The generic JSON body can contain invalid_request even after successful creation. Check Location and re-read categories/index.json to confirm; do not follow automatically.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "error": "invalid_request"
                    }
                  }
                }
              }
            },
            "headers": {
              "Location": {
                "description": "Organizer page destination, including the new question UUID after question creation.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "description": "Question validation failed; no successful save.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuestionValidationError"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "success": false,
                      "error": "validation_failed",
                      "errors": {
                        "name": ["Name must contain 2–255 characters."]
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --include --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request PUT \\\n  --header \"Accept: application/json\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\"CategoryField\":{\"name\":\"Dietary preference\",\"type\":\"text\",\"mandatory\":0,\"on_ticket\":1}}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/category_fields/edit/${CATEGORY_ID}.json\"\n# Inspect Location; re-read categories/index.json to confirm the resulting definition.\n# No structured success flag: re-read definitions or attendee snapshots after a successful HTTP response."
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/category_fields/edit/' . getenv('CATEGORY_ID') . '.json');\n$headers = ['Accept: application/json'];\n$headers[] = 'Content-Type: application/json';\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"CategoryField\":{\"name\":\"Dietary preference\",\"type\":\"text\",\"mandatory\":0,\"on_ticket\":1}}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 400) throw new RuntimeException('Paydro request failed');\n$location = curl_getinfo($ch, CURLINFO_REDIRECT_URL);\ncurl_close($ch);\nif ($status === 200) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful.\n// On 302 inspect $location and re-read categories/index.json; the redirect JSON body is not a creation result.\n// No structured success flag: re-read definitions or attendee snapshots after a successful HTTP response."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/category_fields/edit/${process.env.CATEGORY_ID}.json`, {\n  method: \"PUT\", redirect: \"manual\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"CategoryField\":{\"name\":\"Dietary preference\",\"type\":\"text\",\"mandatory\":0,\"on_ticket\":1}})\n});\nif (!response.ok && response.status !== 302) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status === 200) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful.\nif (response.status === 302) console.log(response.headers.get(\"location\"));\n// Re-read categories/index.json to confirm the resulting definition.\n// No structured success flag: re-read definitions or attendee snapshots after a successful HTTP response."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nimport json\npayload = json.loads('{\"CategoryField\":{\"name\":\"Dietary preference\",\"type\":\"text\",\"mandatory\":0,\"on_ticket\":1}}')\nresponse = requests.request(\"PUT\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/category_fields/edit/{os.environ['CATEGORY_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30, json=payload)\nif not 200 <= response.status_code < 400:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code == 200:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful.\nif response.status_code == 302:\n    location = response.headers.get(\"Location\")\n# Re-read categories/index.json to confirm the resulting definition.\n# No structured success flag: re-read definitions or attendee snapshots after a successful HTTP response."
          }
        ],
        "x-verification": "Source-reviewed; selected synthetic reads and rejected writes checked locally. See /en-us/docs/testing.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QuestionMutation"
              },
              "examples": {
                "example": {
                  "value": {
                    "CategoryField": {
                      "name": "Dietary preference",
                      "type": "text",
                      "mandatory": 0,
                      "on_ticket": 1
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/category_fields/delete/{question_id}.json": {
      "post": {
        "operationId": "deleteCategoryQuestion",
        "summary": "Delete a category question",
        "tags": ["Category questions"],
        "description": "Delete an event-owned question and compact the remaining order transactionally. Send X-Requested-With: XMLHttpRequest to avoid the organizer redirect. With no request body, JSON success is []; there is no deleted flag. Re-read categories/index.json. Purchased ticket snapshots may retain historical definitions.\n\nAuthorization: active organizer with company/event access. Source-reviewed controller, model and JSON template; successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/question_id"
          },
          {
            "name": "X-Requested-With",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "const": "XMLHttpRequest"
            },
            "description": "Use the JSON/AJAX branch; without this header deletion redirects to the organizer UI."
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Legacy form data; [] with no request body.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "array",
                      "maxItems": 0
                    },
                    {
                      "type": "object",
                      "properties": {},
                      "additionalProperties": true
                    }
                  ],
                  "description": "Legacy submitted form data; [] for an empty body. No success flag. Re-read the affected resource to verify the result."
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": []
                  }
                }
              }
            }
          },
          "404": {
            "description": "Missing/inaccessible resource or failed action. Legacy exception rendering may alternatively return HTML.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "error": "not_found"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Missing/inaccessible resource or failed action. Legacy exception rendering may alternatively return HTML.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "error": "delete_failed"
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --header \"X-Requested-With: XMLHttpRequest\" \\\n  --request POST \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/category_fields/delete/${QUESTION_ID}.json\"\n# No structured success flag: re-read definitions or attendee snapshots after a successful HTTP response."
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/category_fields/delete/' . getenv('QUESTION_ID') . '.json');\n$headers = ['X-Requested-With: XMLHttpRequest', 'Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful.\n// No structured success flag: re-read definitions or attendee snapshots after a successful HTTP response."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/category_fields/delete/${process.env.QUESTION_ID}.json`, {\n  method: \"POST\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { \"X-Requested-With\": \"XMLHttpRequest\", Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful.\n// No structured success flag: re-read definitions or attendee snapshots after a successful HTTP response."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"POST\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/category_fields/delete/{os.environ['QUESTION_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"X-Requested-With\": \"XMLHttpRequest\", \"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful.\n# No structured success flag: re-read definitions or attendee snapshots after a successful HTTP response."
          }
        ],
        "x-verification": "Source-reviewed; selected synthetic reads and rejected writes checked locally. See /en-us/docs/testing."
      }
    },
    "/{event_id}/category_fields/update_all_tickets/{category_id}/{question_id}.json": {
      "post": {
        "operationId": "applyCategoryQuestionsToTickets",
        "summary": "Apply category questions to existing tickets",
        "tags": ["Category questions"],
        "description": "Verifies the selected question/category in this event, then refreshes the archived product/question snapshots of attendees whose products belong to that category. This refresh can include all current category definitions, not just the selected question. Successful JSON rendering returns submitted form data ([] for no body), without a success flag. On failure, earlier tickets may already have been updated: the whole batch is not atomic. Inspect failed_ids and re-read attendees before retrying.\n\nAuthorization: active organizer with company/event access. Source-reviewed controller, model and JSON template; successful writes were not executed during documentation discovery.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/category_id"
          },
          {
            "$ref": "#/components/parameters/question_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Legacy form data; re-read affected attendee snapshots to verify the refresh.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "array",
                      "maxItems": 0
                    },
                    {
                      "type": "object",
                      "properties": {},
                      "additionalProperties": true
                    }
                  ],
                  "description": "Legacy submitted form data; [] for an empty body. No success flag. Re-read the affected resource to verify the result."
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": []
                  }
                }
              }
            }
          },
          "404": {
            "description": "Missing/inaccessible resource or failed action. Legacy exception rendering may alternatively return HTML.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "error": "not_found"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Ticket refresh failed. Earlier attendees may already have been updated.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "const": false
                    },
                    "error": {
                      "const": "ticket_update_failed"
                    },
                    "failed_ids": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "format": "uuid"
                      }
                    }
                  },
                  "additionalProperties": true,
                  "required": ["success", "error", "failed_ids"]
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic example; source-reviewed shape.",
                    "value": {
                      "success": false,
                      "error": "ticket_update_failed",
                      "failed_ids": ["44444444-4444-4444-8444-444444444444"]
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request POST \\\n  --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/category_fields/update_all_tickets/${CATEGORY_ID}/${QUESTION_ID}.json\"\n# No structured success flag: re-read definitions or attendee snapshots after a successful HTTP response."
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . '/' . getenv('EVENT_ID') . '/category_fields/update_all_tickets/' . getenv('CATEGORY_ID') . '/' . getenv('QUESTION_ID') . '.json');\n$headers = ['Accept: application/json'];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\nif ($status !== 204) $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Check the documented success/error fields before treating a write as successful.\n// No structured success flag: re-read definitions or attendee snapshots after a successful HTTP response."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/category_fields/update_all_tickets/${process.env.CATEGORY_ID}/${process.env.QUESTION_ID}.json`, {\n  method: \"POST\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nif (response.status !== 204) console.log(await response.json());\n// Check the documented success/error fields before treating a write as successful.\n// No structured success flag: re-read definitions or attendee snapshots after a successful HTTP response."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"POST\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/category_fields/update_all_tickets/{os.environ['CATEGORY_ID']}/{os.environ['QUESTION_ID']}.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nif response.status_code != 204:\n    data = response.json()\n# Check the documented success/error fields before treating a write as successful.\n# No structured success flag: re-read definitions or attendee snapshots after a successful HTTP response."
          }
        ],
        "x-verification": "Source-reviewed; selected synthetic reads and rejected writes checked locally. See /en-us/docs/testing."
      }
    },
    "/comments/all_data.json": {
      "get": {
        "operationId": "getRecentEventNotes",
        "summary": "Read recent event notes",
        "tags": ["Supportingdata"],
        "description": "Read compact event notes for companies the organizer belongs to. Event notes only: Order/OrderLine notes are excluded. Each partition is capped at 75000 notes, newest first. events and items maps are keyed by event UUID; empty maps can be []. Combine the history and recent partitions for a complete available snapshot. No deletion IDs or cursor are provided. Recent partition: created on/after server-local Sunday midnight. Cache expiry is about one minute. See /en-us/docs/testing for verification boundaries.",
        "parameters": [
          {
            "name": "If-None-Match",
            "in": "header",
            "schema": {
              "type": "string"
            },
            "description": "Send the last ETag to receive an empty 304 when this partition is unchanged."
          },
          {
            "name": "If-Modified-Since",
            "in": "header",
            "schema": {
              "type": "string"
            },
            "description": "Conditional validator; prefer ETag."
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Existing success/error response; inspect the body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EventNotesSnapshot"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic source-reviewed example.",
                    "value": {
                      "events": {},
                      "items": {}
                    }
                  }
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string"
                }
              },
              "Last-Modified": {
                "schema": {
                  "type": "string"
                }
              },
              "X-Cache-Modified-Time": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "304": {
            "description": "Partition unchanged; no body. Retain your cached partition."
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/comments/all_data.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . \"/comments/all_data.json\");\n$headers = [\"Accept: application/json\"];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30, CURLOPT_RETURNTRANSFER => true]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\n$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Inspect the documented success/error fields; HTTP 200 can contain an error."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/comments/all_data.json`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconst data = await response.json();\n// Inspect the documented success/error fields; HTTP 200 can contain an error."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/comments/all_data.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\ndata = response.json()\n# Inspect the documented success/error fields; HTTP 200 can contain an error."
          }
        ],
        "x-verification": "Source-reviewed. See /en-us/docs/testing."
      }
    },
    "/comments/all_data/1.json": {
      "get": {
        "operationId": "getHistoricalEventNotes",
        "summary": "Read historical event notes",
        "tags": ["Supportingdata"],
        "description": "Read compact event notes for companies the organizer belongs to. Event notes only: Order/OrderLine notes are excluded. Each partition is capped at 75000 notes, newest first. events and items maps are keyed by event UUID; empty maps can be []. Combine the history and recent partitions for a complete available snapshot. No deletion IDs or cursor are provided. History partition: created before server-local Sunday midnight. Cache expiry is the next Sunday at 01:00 server time; invalidation can update it earlier. See /en-us/docs/testing for verification boundaries.",
        "parameters": [
          {
            "name": "If-None-Match",
            "in": "header",
            "schema": {
              "type": "string"
            },
            "description": "Send the last ETag to receive an empty 304 when this partition is unchanged."
          },
          {
            "name": "If-Modified-Since",
            "in": "header",
            "schema": {
              "type": "string"
            },
            "description": "Conditional validator; prefer ETag."
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Existing success/error response; inspect the body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EventNotesSnapshot"
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic source-reviewed example.",
                    "value": {
                      "events": {},
                      "items": {}
                    }
                  }
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string"
                }
              },
              "Last-Modified": {
                "schema": {
                  "type": "string"
                }
              },
              "X-Cache-Modified-Time": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "304": {
            "description": "Partition unchanged; no body. Retain your cached partition."
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request GET --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/comments/all_data/1.json\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . \"/comments/all_data/1.json\");\n$headers = [\"Accept: application/json\"];\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30, CURLOPT_RETURNTRANSFER => true]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\n$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Inspect the documented success/error fields; HTTP 200 can contain an error."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/comments/all_data/1.json`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconst data = await response.json();\n// Inspect the documented success/error fields; HTTP 200 can contain an error."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/comments/all_data/1.json\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\ndata = response.json()\n# Inspect the documented success/error fields; HTTP 200 can contain an error."
          }
        ],
        "x-verification": "Source-reviewed. See /en-us/docs/testing."
      }
    },
    "/stages/load_stage/{stage_id}": {
      "get": {
        "operationId": "getStage",
        "summary": "Read public stage state",
        "tags": ["Stages"],
        "description": "Public read; possession of the stage URL allows reading its complete display state. Missing state returns HTTP 200 with error: No stage found. No event prefix or .json suffix is required. See /en-us/docs/stages. See /en-us/docs/testing for verification boundaries.",
        "parameters": [
          {
            "$ref": "#/components/parameters/stage_id"
          }
        ],
        "responses": {
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Existing success/error response; inspect the body.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "stage": {
                          "$ref": "#/components/schemas/StageState"
                        }
                      },
                      "required": ["stage"]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        }
                      },
                      "required": ["error"],
                      "additionalProperties": false
                    }
                  ]
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic source-reviewed example.",
                    "value": {
                      "stage": {
                        "id": "11111111-1111-4111-8111-111111111111",
                        "event_id": "11111111-1111-4111-8111-111111111111",
                        "title": "Main stage"
                      }
                    }
                  },
                  "missing": {
                    "value": {
                      "error": "No stage found"
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body \\\n  --request GET --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/stages/load_stage/${STAGE_ID}\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . \"/stages/load_stage/\" . getenv('STAGE_ID'));\n$headers = [\"Accept: application/json\"];\ncurl_setopt_array($ch, [CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30, CURLOPT_RETURNTRANSFER => true]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\n$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Inspect the documented success/error fields; HTTP 200 can contain an error."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const response = await fetch(`${process.env.PAYDRO_ORIGIN}/stages/load_stage/${process.env.STAGE_ID}`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconst data = await response.json();\n// Inspect the documented success/error fields; HTTP 200 can contain an error."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/stages/load_stage/{os.environ['STAGE_ID']}\",\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\ndata = response.json()\n# Inspect the documented success/error fields; HTTP 200 can contain an error."
          }
        ],
        "x-verification": "Source-reviewed; stage authorization is covered by isolated controller tests. Continuous streaming is not claimed as wire-tested.",
        "security": []
      }
    },
    "/stages/storage/{stage_id}": {
      "get": {
        "operationId": "getStoredStage",
        "summary": "Read public stored stage state",
        "tags": ["Stages"],
        "description": "Public read; possession of the stage URL allows reading its complete display state. Missing state returns HTTP 200 with error: No stage found. No event prefix or .json suffix is required. See /en-us/docs/stages. See /en-us/docs/testing for verification boundaries.",
        "parameters": [
          {
            "$ref": "#/components/parameters/stage_id"
          }
        ],
        "responses": {
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Existing success/error response; inspect the body.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/StageState"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        }
                      },
                      "required": ["error"],
                      "additionalProperties": false
                    }
                  ]
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic source-reviewed example.",
                    "value": {
                      "id": "11111111-1111-4111-8111-111111111111",
                      "event_id": "11111111-1111-4111-8111-111111111111",
                      "title": "Main stage"
                    }
                  },
                  "missing": {
                    "value": {
                      "error": "No stage found"
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body \\\n  --request GET --header \"Accept: application/json\" \\\n  \"$PAYDRO_ORIGIN/stages/storage/${STAGE_ID}\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . \"/stages/storage/\" . getenv('STAGE_ID'));\n$headers = [\"Accept: application/json\"];\ncurl_setopt_array($ch, [CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30, CURLOPT_RETURNTRANSFER => true]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\n$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Inspect the documented success/error fields; HTTP 200 can contain an error."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const response = await fetch(`${process.env.PAYDRO_ORIGIN}/stages/storage/${process.env.STAGE_ID}`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Accept: \"application/json\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconst data = await response.json();\n// Inspect the documented success/error fields; HTTP 200 can contain an error."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/stages/storage/{os.environ['STAGE_ID']}\",\n    headers={\"Accept\": \"application/json\"}, allow_redirects=False, timeout=30)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\ndata = response.json()\n# Inspect the documented success/error fields; HTTP 200 can contain an error."
          }
        ],
        "x-verification": "Source-reviewed; stage authorization is covered by isolated controller tests. Continuous streaming is not claimed as wire-tested.",
        "security": []
      }
    },
    "/{event_id}/stages/ce/{stage_id}": {
      "post": {
        "operationId": "saveStage",
        "summary": "Initialize or replace stage state",
        "tags": ["Stages"],
        "description": "Organizer Basic and company rights >=1 required. Payload id/event_id must match the stage/event route. New default stage ID must equal event UUID; other IDs must already belong to the event. Replaces the full public state in short/long caches, without patch merge, version precondition or locking against another writer. Initializes the default stage when missing. See /en-us/docs/stages. See /en-us/docs/testing for verification boundaries.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/stage_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401. Also returned when the organizer lacks editor rights or stored stage belongs to another event.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Existing success/error response; inspect the body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string",
                      "const": "ok"
                    }
                  },
                  "required": ["status"]
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic source-reviewed example.",
                    "value": {
                      "status": "ok"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Stage ID/event mismatch or unsupported new stage ID; rejected before writing."
          },
          "405": {
            "description": "POST required."
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request POST --header \"Accept: application/json\" \\\n  --header 'Content-Type: application/json' --data '{\"stage\":{\"id\":\"11111111-1111-4111-8111-111111111111\",\"event_id\":\"11111111-1111-4111-8111-111111111111\",\"title\":\"Main stage\"}}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/stages/ce/${STAGE_ID}\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . \"/\" . getenv('EVENT_ID') . \"/stages/ce/\" . getenv('STAGE_ID'));\n$headers = [\"Accept: application/json\"];\n$headers[] = \"Content-Type: application/json\";\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30, CURLOPT_RETURNTRANSFER => true]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"stage\":{\"id\":\"11111111-1111-4111-8111-111111111111\",\"event_id\":\"11111111-1111-4111-8111-111111111111\",\"title\":\"Main stage\"}}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\n$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Inspect the documented success/error fields; HTTP 200 can contain an error."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/stages/ce/${process.env.STAGE_ID}`, {\n  method: \"POST\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"stage\":{\"id\":\"11111111-1111-4111-8111-111111111111\",\"event_id\":\"11111111-1111-4111-8111-111111111111\",\"title\":\"Main stage\"}})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconst data = await response.json();\n// Inspect the documented success/error fields; HTTP 200 can contain an error."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"POST\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/stages/ce/{os.environ['STAGE_ID']}\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\", \"Content-Type\": \"application/json\"}, allow_redirects=False, timeout=30, json={'stage': {'id': '11111111-1111-4111-8111-111111111111', 'event_id': '11111111-1111-4111-8111-111111111111', 'title': 'Main stage'}})\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\ndata = response.json()\n# Inspect the documented success/error fields; HTTP 200 can contain an error."
          }
        ],
        "x-verification": "Source-reviewed; stage authorization is covered by isolated controller tests. Continuous streaming is not claimed as wire-tested.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StageMutation"
              },
              "example": {
                "stage": {
                  "id": "11111111-1111-4111-8111-111111111111",
                  "event_id": "11111111-1111-4111-8111-111111111111",
                  "title": "Main stage"
                }
              }
            }
          }
        }
      }
    },
    "/{event_id}/stages/storage/{stage_id}": {
      "post": {
        "operationId": "replaceStage",
        "summary": "Replace existing stage state",
        "tags": ["Stages"],
        "description": "Organizer Basic and company rights >=1 required. Payload id/event_id must match the stage/event route. New default stage ID must equal event UUID; other IDs must already belong to the event. Replaces the full public state in short/long caches, without patch merge, version precondition or locking against another writer. Missing state returns HTTP 200 error before writing; use ce to initialize. See /en-us/docs/stages. See /en-us/docs/testing for verification boundaries.",
        "parameters": [
          {
            "$ref": "#/components/parameters/event_id"
          },
          {
            "$ref": "#/components/parameters/stage_id"
          }
        ],
        "responses": {
          "403": {
            "description": "Invalid Basic credentials. Paydro currently returns 403 instead of a conventional 401. Also returned when the organizer lacks editor rights or stored stage belongs to another event.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                },
                "example": {
                  "status": 403,
                  "title": "Unauthorized",
                  "detail": "User name and password combination are incorrect"
                }
              }
            }
          },
          "429": {
            "description": "Authentication throttled. Wait for Retry-After before another attempt.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Authentication limiter temporarily unavailable. Retry with bounded backoff."
          },
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Existing success/error response; inspect the body.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/StageState"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "error": {
                          "type": "string"
                        }
                      },
                      "required": ["error"],
                      "additionalProperties": false
                    }
                  ]
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic source-reviewed example.",
                    "value": {
                      "id": "11111111-1111-4111-8111-111111111111",
                      "event_id": "11111111-1111-4111-8111-111111111111",
                      "title": "Main stage"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Stage ID/event mismatch or unsupported new stage ID; rejected before writing."
          },
          "405": {
            "description": "POST required."
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --user \"$PAYDRO_EMAIL:$PAYDRO_PASSWORD\" \\\n  --request POST --header \"Accept: application/json\" \\\n  --header 'Content-Type: application/json' --data '{\"stage\":{\"id\":\"11111111-1111-4111-8111-111111111111\",\"event_id\":\"11111111-1111-4111-8111-111111111111\",\"title\":\"Main stage\"}}' \\\n  \"$PAYDRO_ORIGIN/${EVENT_ID}/stages/storage/${STAGE_ID}\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . \"/\" . getenv('EVENT_ID') . \"/stages/storage/\" . getenv('STAGE_ID'));\n$headers = [\"Accept: application/json\"];\n$headers[] = \"Content-Type: application/json\";\ncurl_setopt_array($ch, [CURLOPT_USERPWD => getenv('PAYDRO_EMAIL') . ':' . getenv('PAYDRO_PASSWORD'), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30, CURLOPT_RETURNTRANSFER => true]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"stage\":{\"id\":\"11111111-1111-4111-8111-111111111111\",\"event_id\":\"11111111-1111-4111-8111-111111111111\",\"title\":\"Main stage\"}}');\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\n$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\n// Inspect the documented success/error fields; HTTP 200 can contain an error."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const auth = Buffer.from(`${process.env.PAYDRO_EMAIL}:${process.env.PAYDRO_PASSWORD}`).toString('base64');\nconst response = await fetch(`${process.env.PAYDRO_ORIGIN}/${process.env.EVENT_ID}/stages/storage/${process.env.STAGE_ID}`, {\n  method: \"POST\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Authorization: `Basic ${auth}`, Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\"stage\":{\"id\":\"11111111-1111-4111-8111-111111111111\",\"event_id\":\"11111111-1111-4111-8111-111111111111\",\"title\":\"Main stage\"}})\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconst data = await response.json();\n// Inspect the documented success/error fields; HTTP 200 can contain an error."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"POST\", f\"{os.environ['PAYDRO_ORIGIN']}/{os.environ['EVENT_ID']}/stages/storage/{os.environ['STAGE_ID']}\",\n    auth=(os.environ[\"PAYDRO_EMAIL\"], os.environ[\"PAYDRO_PASSWORD\"]),\n    headers={\"Accept\": \"application/json\", \"Content-Type\": \"application/json\"}, allow_redirects=False, timeout=30, json={'stage': {'id': '11111111-1111-4111-8111-111111111111', 'event_id': '11111111-1111-4111-8111-111111111111', 'title': 'Main stage'}})\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\ndata = response.json()\n# Inspect the documented success/error fields; HTTP 200 can contain an error."
          }
        ],
        "x-verification": "Source-reviewed; stage authorization is covered by isolated controller tests. Continuous streaming is not claimed as wire-tested.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StageMutation"
              },
              "example": {
                "stage": {
                  "id": "11111111-1111-4111-8111-111111111111",
                  "event_id": "11111111-1111-4111-8111-111111111111",
                  "title": "Main stage"
                }
              }
            }
          }
        }
      }
    },
    "/stages/sse/{stage_id}": {
      "get": {
        "operationId": "streamStage",
        "summary": "Stream public stage updates",
        "tags": ["Stages"],
        "description": "Public SSE feed of stage display state. data JSON contains stage, ping:true or state_not_changed:true. Ignore heartbeat objects and padded whitespace. A named close event ends the connection after roughly ten minutes; reconnect with bounded backoff. There is no replay cursor/Last-Event-ID support. This is not a payment/order webhook. See /en-us/docs/stages. See /en-us/docs/testing for verification boundaries.",
        "parameters": [
          {
            "$ref": "#/components/parameters/stage_id"
          }
        ],
        "responses": {
          "default": {
            "description": "Legacy access, missing-resource, or pagination failures can return a redirect, HTML, or a JSON error. Validate status, content type, and body before consuming it. Organizer writes can also return validation errors with HTTP 200. Check the operation-specific success field; disable automatic redirect following.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LegacyError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "200": {
            "description": "Existing success/error response; inspect the body.",
            "content": {
              "text/event-stream": {
                "schema": {
                  "type": "string",
                  "description": "Server-sent event frames containing JSON data."
                },
                "examples": {
                  "example": {
                    "summary": "Synthetic source-reviewed example.",
                    "value": "data: {\"stage\":{\"id\":\"11111111-1111-4111-8111-111111111111\",\"event_id\":\"11111111-1111-4111-8111-111111111111\",\"title\":\"Main stage\"}}\n\ndata: {\"state_not_changed\":true}\n\n"
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "cURL",
            "source": "curl --fail-with-body --no-buffer --max-time 30 \\\n  --request GET --header \"Accept: text/event-stream\" \\\n  \"$PAYDRO_ORIGIN/stages/sse/${STAGE_ID}\""
          },
          {
            "lang": "PHP",
            "label": "PHP",
            "source": "<?php\n$ch = curl_init(getenv('PAYDRO_ORIGIN') . \"/stages/sse/\" . getenv('STAGE_ID'));\n$headers = [\"Accept: text/event-stream\"];\ncurl_setopt_array($ch, [CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => $headers, CURLOPT_FOLLOWLOCATION => false, CURLOPT_TIMEOUT => 30, CURLOPT_RETURNTRANSFER => true]);\n$body = curl_exec($ch);\n$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\nif ($body === false || $status < 200 || $status >= 300) throw new RuntimeException('Paydro request failed');\ncurl_close($ch);\necho $body; // SSE text frames; use a streaming parser for a continuous connection."
          },
          {
            "lang": "JavaScript",
            "label": "Node.js",
            "source": "const response = await fetch(`${process.env.PAYDRO_ORIGIN}/stages/sse/${process.env.STAGE_ID}`, {\n  method: \"GET\", redirect: \"error\", signal: AbortSignal.timeout(30000),\n  headers: { Accept: \"text/event-stream\" }\n});\nif (!response.ok) throw new Error(`Paydro HTTP ${response.status}`);\nconst decoder = new TextDecoder();\nfor await (const chunk of response.body) process.stdout.write(decoder.decode(chunk, { stream: true }));\n// Parse SSE data frames and ignore heartbeat objects; reconnect after close."
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import os, requests\nresponse = requests.request(\"GET\", f\"{os.environ['PAYDRO_ORIGIN']}/stages/sse/{os.environ['STAGE_ID']}\",\n    headers={\"Accept\": \"text/event-stream\"}, allow_redirects=False, timeout=30, stream=True)\nif not 200 <= response.status_code < 300:\n    raise RuntimeError(f\"Paydro HTTP {response.status_code}\")\nfor line in response.iter_lines(decode_unicode=True):\n    print(line)\n# Parse SSE data frames and reconnect after close."
          }
        ],
        "x-verification": "Source-reviewed; stage authorization is covered by isolated controller tests. Continuous streaming is not claimed as wire-tested.",
        "security": []
      }
    }
  },
  "components": {
    "securitySchemes": {
      "organizerBasic": {
        "type": "http",
        "scheme": "basic",
        "description": "Active Paydro organizer email and password over HTTPS. Use server-side environment variables; do not embed credentials in a browser, URL or ticket-shop iframe."
      }
    },
    "parameters": {
      "event_id": {
        "name": "event_id",
        "in": "path",
        "required": true,
        "description": "Event UUID for an event the authenticated organizer may access.",
        "schema": {
          "type": "string",
          "format": "uuid"
        },
        "example": "11111111-1111-4111-8111-111111111111"
      },
      "order_id": {
        "name": "order_id",
        "in": "path",
        "required": true,
        "description": "Order UUID belonging to this event.",
        "schema": {
          "type": "string",
          "format": "uuid"
        },
        "example": "33333333-3333-4333-8333-333333333333"
      },
      "attendee_id": {
        "name": "attendee_id",
        "in": "path",
        "required": true,
        "description": "Order line UUID belonging to this event.",
        "schema": {
          "type": "string",
          "format": "uuid"
        },
        "example": "44444444-4444-4444-8444-444444444444"
      },
      "page": {
        "name": "page",
        "in": "query",
        "description": "One-based CakePHP page number. Stop after a short page. An out-of-range page can return a legacy error or redirect.",
        "schema": {
          "type": "integer",
          "minimum": 1,
          "default": 1
        }
      },
      "year": {
        "name": "year",
        "in": "query",
        "description": "Four-digit year. Omit for the current and previous year (2,000-row cap). An explicit year removes that cap.",
        "schema": {
          "type": "string",
          "pattern": "^[0-9]{4}$"
        },
        "example": "2026"
      },
      "include": {
        "name": "include",
        "in": "query",
        "description": "Add scanned=0/1 to attendee rows.",
        "schema": {
          "type": "string",
          "enum": ["scan"]
        }
      },
      "IfNoneMatch": {
        "name": "If-None-Match",
        "in": "header",
        "description": "ETag from a previous full snapshot. A matching snapshot returns 304 with no body.",
        "schema": {
          "type": "string"
        }
      },
      "product_id": {
        "name": "product_id",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "format": "uuid"
        },
        "description": "Product UUID belonging to this event.",
        "example": "22222222-2222-4222-8222-222222222222"
      },
      "category_id": {
        "name": "category_id",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "format": "uuid"
        },
        "description": "Ticket group UUID belonging to this event.",
        "example": "22222222-2222-4222-8222-222222222222"
      },
      "question_id": {
        "name": "question_id",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "format": "uuid"
        },
        "description": "Question definition UUID belonging to the relevant event/group.",
        "example": "22222222-2222-4222-8222-222222222222"
      },
      "waitinglist_id": {
        "name": "waitinglist_id",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "format": "uuid"
        },
        "description": "Waiting-list entry UUID belonging to this event.",
        "example": "22222222-2222-4222-8222-222222222222"
      },
      "promocode_id": {
        "name": "promocode_id",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "format": "uuid"
        },
        "description": "Promo code UUID belonging to this event.",
        "example": "22222222-2222-4222-8222-222222222222"
      },
      "comment_id": {
        "name": "comment_id",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "format": "uuid"
        },
        "description": "Note UUID; edit permissions are checked separately.",
        "example": "22222222-2222-4222-8222-222222222222"
      },
      "attachment_id": {
        "name": "attachment_id",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "format": "uuid"
        },
        "description": "Attachment UUID; deletion also checks event ownership.",
        "example": "22222222-2222-4222-8222-222222222222"
      },
      "status": {
        "name": "status",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "enum": ["open", "close", "sold_out"]
        },
        "description": "Allowed status value."
      },
      "parent": {
        "name": "parent",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "enum": ["Event", "Order", "OrderLine"]
        },
        "description": "Allowed parent value."
      },
      "parent_id": {
        "name": "parent_id",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "format": "uuid"
        },
        "description": "Authorized event, order or attendee UUID selected by parent."
      },
      "stage_id": {
        "name": "stage_id",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "format": "uuid"
        },
        "description": "Default stage ID equals event UUID. Other stage IDs must already belong to the event."
      }
    },
    "schemas": {
      "Event": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "timezone": {
            "type": "string"
          },
          "start_date": {
            "type": ["string", "null"],
            "description": "Legacy server-local SQL timestamp, generally YYYY-MM-DD HH:mm:ss; no UTC offset is supplied."
          },
          "end_date": {
            "type": ["string", "null"],
            "description": "Legacy server-local SQL timestamp, generally YYYY-MM-DD HH:mm:ss; no UTC offset is supplied."
          },
          "direct_link": {
            "type": "string"
          },
          "link": {
            "type": "string"
          },
          "company_id": {
            "type": "string",
            "format": "uuid"
          }
        },
        "required": ["id", "name"],
        "additionalProperties": true
      },
      "EventDetail": {
        "type": "object",
        "properties": {
          "Event": {
            "$ref": "#/components/schemas/Event"
          }
        },
        "required": ["Event"],
        "additionalProperties": true
      },
      "EventList": {
        "type": "object",
        "properties": {
          "events": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "Event": {
                  "$ref": "#/components/schemas/Event"
                },
                "Company": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "slug": {
                      "type": "string"
                    }
                  },
                  "additionalProperties": true
                }
              },
              "required": ["Event"],
              "additionalProperties": true
            }
          },
          "photo_info": {
            "type": "array",
            "items": {}
          },
          "oldest_available_year": {
            "type": ["integer", "null"]
          },
          "loaded_years": {
            "type": "array",
            "items": {
              "type": "integer"
            }
          }
        },
        "required": ["events", "loaded_years", "oldest_available_year"],
        "additionalProperties": true
      },
      "Product": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "category_id": {
            "type": "string",
            "format": "uuid"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": ["string", "null"]
          },
          "price": {
            "type": ["string", "number", "null"],
            "description": "Legacy decimal monetary value in the event currency. Use decimal arithmetic; do not assume integer minor units."
          },
          "stock": {
            "type": "integer",
            "description": "Configured capacity. -1 means unlimited."
          },
          "current_stock": {
            "type": ["integer", "number"],
            "description": "Configured stock minus sold, reserved and pending quantities, with recurring/guaranteed rules. Unlimited stock currently yields 8388607. Shared pools, visibility and sales windows require separate checkout validation."
          },
          "visible": {
            "type": "integer"
          },
          "repeating": {
            "type": "boolean"
          },
          "available_from": {
            "type": ["string", "null"],
            "description": "Legacy server-local SQL timestamp, generally YYYY-MM-DD HH:mm:ss; no UTC offset is supplied."
          },
          "available_till": {
            "type": ["string", "null"],
            "description": "Legacy server-local SQL timestamp, generally YYYY-MM-DD HH:mm:ss; no UTC offset is supplied."
          },
          "sales_count": {
            "type": "integer"
          },
          "max_per_sale": {
            "type": "integer"
          },
          "package_flag": {
            "type": "integer"
          },
          "connected_with_package": {
            "type": "boolean"
          },
          "ProductsPool": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "pool": {
                  "type": ["string", "integer"]
                },
                "sales": {
                  "type": "integer"
                }
              },
              "additionalProperties": true
            }
          },
          "PackagesProduct": {
            "type": "array",
            "items": {}
          },
          "pending": {
            "type": "integer"
          },
          "waitinglist": {
            "type": ["boolean", "integer", "string"],
            "description": "Legacy checkbox value; use 0 or 1 in new requests."
          },
          "keep_soldout_in_shop": {
            "type": ["boolean", "integer", "string"],
            "description": "Legacy checkbox value; use 0 or 1 in new requests."
          }
        },
        "required": ["id", "title"],
        "additionalProperties": true
      },
      "PaymentState": {
        "type": "object",
        "properties": {
          "channel": {
            "type": "string"
          },
          "settlement": {
            "type": "string"
          },
          "lifecycle": {
            "type": "string"
          },
          "display_status": {
            "type": "string"
          },
          "is_paid": {
            "type": "boolean"
          },
          "is_cancelled": {
            "type": "boolean"
          },
          "has_pending_operation": {
            "type": "boolean"
          }
        },
        "required": ["is_paid", "channel"],
        "additionalProperties": true
      },
      "Order": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "created": {
            "type": ["string", "null"],
            "description": "Legacy server-local SQL timestamp, generally YYYY-MM-DD HH:mm:ss; no UTC offset is supplied."
          },
          "modified": {
            "type": ["string", "null"],
            "description": "Legacy server-local SQL timestamp, generally YYYY-MM-DD HH:mm:ss; no UTC offset is supplied."
          },
          "email": {
            "type": "string"
          },
          "firstname": {
            "type": "string"
          },
          "lastname": {
            "type": "string"
          },
          "company": {
            "type": ["string", "null"]
          },
          "billing_incremental": {
            "type": "integer"
          },
          "reservation": {
            "type": "integer"
          },
          "is_paid": {
            "type": "boolean"
          },
          "payment_method": {
            "type": "string"
          },
          "payment_state": {
            "$ref": "#/components/schemas/PaymentState"
          },
          "Totals": {
            "type": "object",
            "properties": {
              "grandTotal": {
                "type": ["string", "number", "null"],
                "description": "Legacy decimal monetary value in the event currency. Use decimal arithmetic; do not assume integer minor units."
              },
              "vat": {
                "type": ["string", "number", "null"],
                "description": "Legacy decimal monetary value in the event currency. Use decimal arithmetic; do not assume integer minor units."
              }
            },
            "additionalProperties": true
          }
        },
        "required": ["id", "is_paid", "payment_state"],
        "additionalProperties": true
      },
      "OrderRecord": {
        "type": "object",
        "properties": {
          "Order": {
            "$ref": "#/components/schemas/Order"
          }
        },
        "required": ["Order"],
        "additionalProperties": true
      },
      "OrderDetail": {
        "type": "object",
        "properties": {
          "Order": {
            "$ref": "#/components/schemas/Order"
          },
          "OrderLine": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Attendee"
            }
          },
          "PaymentAction": {
            "type": "array",
            "items": {}
          }
        },
        "required": ["Order"],
        "additionalProperties": true
      },
      "Attendee": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "order_id": {
            "type": "string",
            "format": "uuid"
          },
          "product_id": {
            "type": "string",
            "format": "uuid"
          },
          "firstname": {
            "type": "string"
          },
          "lastname": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "company": {
            "type": ["string", "null"]
          },
          "created": {
            "type": ["string", "null"],
            "description": "Legacy server-local SQL timestamp, generally YYYY-MM-DD HH:mm:ss; no UTC offset is supplied."
          },
          "modified": {
            "type": ["string", "null"],
            "description": "Legacy server-local SQL timestamp, generally YYYY-MM-DD HH:mm:ss; no UTC offset is supplied."
          },
          "scanned": {
            "type": "integer",
            "enum": [0, 1],
            "description": "Present only when include=scan is requested."
          }
        },
        "required": ["id"],
        "additionalProperties": true
      },
      "AttendeeRecord": {
        "type": "object",
        "properties": {
          "OrderLine": {
            "$ref": "#/components/schemas/Attendee"
          }
        },
        "required": ["OrderLine"],
        "additionalProperties": true
      },
      "Answer": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "key": {
            "type": "string"
          },
          "value": {
            "type": [
              "string",
              "number",
              "integer",
              "boolean",
              "array",
              "object",
              "null"
            ],
            "description": "Scalar text/date/time/checkbox/select value, selected-label array for choices, or Other/paid snapshot object. Paid snapshots are immutable through attendee save. See /en-us/docs/question-types."
          },
          "label": {
            "type": "string"
          },
          "type": {
            "type": ["string", "null"]
          },
          "name": {
            "type": ["string", "null"]
          },
          "options": {
            "type": ["array", "object", "null"]
          }
        },
        "additionalProperties": true
      },
      "AttendeeDetail": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "data": {
            "type": "object",
            "properties": {
              "order": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "billingIncremental": {
                    "type": "integer"
                  },
                  "reservation": {
                    "type": "integer"
                  },
                  "created": {
                    "type": ["string", "null"],
                    "description": "Legacy server-local SQL timestamp, generally YYYY-MM-DD HH:mm:ss; no UTC offset is supplied."
                  },
                  "grandTotal": {
                    "type": ["string", "number", "null"],
                    "description": "Legacy decimal monetary value in the event currency. Use decimal arithmetic; do not assume integer minor units."
                  },
                  "paymentState": {
                    "type": "object",
                    "properties": {
                      "channel": {
                        "type": "string"
                      },
                      "settlement": {
                        "type": "string"
                      },
                      "lifecycle": {
                        "type": "string"
                      },
                      "displayStatus": {
                        "type": "string"
                      }
                    },
                    "additionalProperties": true
                  }
                },
                "additionalProperties": true
              },
              "orderLine": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "productId": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "firstname": {
                    "type": "string"
                  },
                  "lastname": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string"
                  },
                  "phone": {
                    "type": ["string", "null"]
                  },
                  "refundPending": {
                    "type": "boolean"
                  },
                  "answers": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/Answer"
                    }
                  },
                  "attachments": {
                    "type": "array",
                    "items": {}
                  }
                },
                "required": ["id", "productId", "answers"],
                "additionalProperties": true
              },
              "currentProduct": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "title": {
                    "type": "string"
                  },
                  "package": {
                    "type": "boolean"
                  }
                },
                "additionalProperties": true
              },
              "currentQuestions": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/OrganizerQuestion"
                }
              },
              "historicalQuestions": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/OrganizerQuestion"
                }
              },
              "actions": {
                "type": "object",
                "additionalProperties": {
                  "type": "boolean"
                }
              },
              "creditOrder": {
                "type": ["object", "null"]
              },
              "creditParentOrder": {
                "type": ["object", "null"]
              },
              "mailDeliveries": {
                "type": "array",
                "items": {}
              }
            },
            "required": [
              "orderLine",
              "order",
              "currentQuestions",
              "historicalQuestions"
            ],
            "additionalProperties": true
          }
        },
        "required": ["ok", "data"],
        "additionalProperties": true
      },
      "CompactOrder": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "d": {
            "type": "integer",
            "description": "Order creation time as Unix seconds."
          },
          "n": {
            "type": "string",
            "description": "Display name."
          },
          "e": {
            "type": "string",
            "description": "Customer email."
          },
          "b": {
            "type": "integer",
            "description": "Billing/invoice sequence number."
          },
          "p": {
            "type": "integer",
            "const": 1,
            "description": "Present for paid orders; omitted otherwise."
          },
          "r": {
            "type": "integer",
            "description": "Reservation state, when nonzero."
          },
          "t": {
            "type": "number",
            "description": "Total in event currency, when nonzero."
          },
          "v": {
            "type": "number",
            "description": "VAT amount, when nonzero."
          },
          "cancellationPending": {
            "type": "boolean"
          },
          "refundPending": {
            "type": "boolean"
          },
          "pendingActionInitiatedAt": {
            "type": ["string", "null"]
          }
        },
        "required": ["id", "d", "n", "e", "b"],
        "additionalProperties": true
      },
      "OrdersSnapshot": {
        "type": "object",
        "properties": {
          "events": {
            "oneOf": [
              {
                "type": "object",
                "additionalProperties": {
                  "type": "object",
                  "properties": {
                    "company_id": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "name": {
                      "type": "string"
                    },
                    "currency": {
                      "type": "string"
                    },
                    "start_date": {
                      "type": ["string", "null"],
                      "description": "Legacy server-local SQL timestamp, generally YYYY-MM-DD HH:mm:ss; no UTC offset is supplied."
                    }
                  },
                  "additionalProperties": true
                }
              },
              {
                "type": "array",
                "maxItems": 0
              }
            ],
            "description": "An empty PHP map can serialize as [] instead of {}."
          },
          "orders": {
            "oneOf": [
              {
                "type": "object",
                "additionalProperties": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CompactOrder"
                  }
                }
              },
              {
                "type": "array",
                "maxItems": 0
              }
            ],
            "description": "An empty PHP map can serialize as [] instead of {}."
          },
          "event_scope": {
            "type": "string"
          },
          "event_ids": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "deleted_items": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          }
        },
        "required": ["events", "orders", "event_scope", "event_ids"],
        "additionalProperties": true
      },
      "CompactAttendee": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "oid": {
            "type": "string",
            "description": "Order UUID."
          },
          "pid": {
            "type": "string",
            "description": "Product UUID."
          },
          "d": {
            "type": "string",
            "description": "Attendee creation time as a SQL timestamp."
          },
          "od": {
            "type": "integer",
            "description": "Order creation time as Unix seconds."
          },
          "n": {
            "type": "string",
            "description": "Display name, formatted Firstname, Lastname."
          },
          "e": {
            "type": "string",
            "description": "Email."
          },
          "c": {
            "type": "string",
            "description": "Company name."
          },
          "b": {
            "type": "integer",
            "description": "Billing/invoice sequence."
          },
          "p": {
            "type": "integer",
            "const": 1
          },
          "r": {
            "type": "integer"
          },
          "t": {
            "type": "number"
          },
          "cancellationPending": {
            "type": "boolean"
          },
          "refundPending": {
            "type": "boolean"
          },
          "pendingActionInitiatedAt": {
            "type": ["string", "null"]
          }
        },
        "required": ["id", "oid", "pid", "d", "od", "n", "e", "b"],
        "additionalProperties": true
      },
      "AttendeesSnapshot": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "deleted_items": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "additionalProperties": {
              "$ref": "#/components/schemas/AttendeeSnapshotEvent"
            }
          },
          {
            "type": "array",
            "maxItems": 0
          }
        ]
      },
      "AttendeeSnapshotEvent": {
        "type": "object",
        "properties": {
          "event": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "vat": {
                "type": "number"
              },
              "currency": {
                "type": "string"
              },
              "company_id": {
                "type": "string",
                "format": "uuid"
              },
              "start_date": {
                "type": ["string", "null"],
                "description": "Legacy server-local SQL timestamp, generally YYYY-MM-DD HH:mm:ss; no UTC offset is supplied."
              }
            },
            "additionalProperties": true
          },
          "orderlines": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CompactAttendee"
            }
          },
          "products": {
            "oneOf": [
              {
                "type": "object",
                "additionalProperties": {
                  "type": "string"
                }
              },
              {
                "type": "array",
                "maxItems": 0
              }
            ],
            "description": "An empty PHP map can serialize as [] instead of {}."
          }
        },
        "required": ["event", "orderlines", "products"],
        "additionalProperties": true
      },
      "LegacyError": {
        "type": "object",
        "properties": {
          "status": {
            "type": "integer"
          },
          "title": {
            "type": "string"
          },
          "detail": {
            "type": "string"
          },
          "error": {
            "type": "string"
          },
          "ok": {
            "type": "boolean"
          }
        },
        "additionalProperties": true
      },
      "MutationResult": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "error": {
            "type": "string"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "event_id": {
            "type": "string",
            "format": "uuid"
          },
          "status": {
            "type": "integer"
          },
          "title": {
            "type": "string"
          },
          "detail": {
            "type": "string"
          },
          "validation_errors": {},
          "new_order_created": {
            "type": "string",
            "format": "uuid"
          }
        },
        "additionalProperties": true,
        "description": "Legacy action result. Failures may have HTTP 200; require the documented success flag. Additional fields vary by action."
      },
      "ProductMutation": {
        "type": "object",
        "properties": {
          "Product": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string",
                "minLength": 2
              },
              "description": {
                "type": "string"
              },
              "price": {
                "anyOf": [
                  {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 999999.9999
                  },
                  {
                    "type": "string",
                    "pattern": "^\\s*\\+?(?:[0-9]+(?:\\.[0-9]*)?|\\.[0-9]+)(?:[eE][+-]?[0-9]+)?\\s*$"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Non-negative numeric amount up to 999999.9999 in the event currency. String amounts are range-checked by the server. Null is accepted for donations only; include the price key. Use decimal arithmetic."
              },
              "category_id": {
                "type": "string",
                "format": "uuid",
                "description": "Category in the current event. On creation, omission selects the first existing category unless category_new is supplied."
              },
              "category_new": {
                "type": "string",
                "minLength": 2,
                "maxLength": 100
              },
              "stock": {
                "type": "integer",
                "minimum": -1,
                "description": "-1 is unlimited; 0 is no capacity. Empty/omitted creation stock becomes -1."
              },
              "visible": {
                "type": ["boolean", "integer", "string"],
                "description": "Legacy checkbox value; use 0 or 1 in new requests."
              },
              "available_from": {
                "type": ["string", "null"],
                "description": "Server-local SQL timestamp; no UTC offset is included."
              },
              "available_till": {
                "type": ["string", "null"],
                "description": "Server-local SQL timestamp; no UTC offset is included."
              },
              "max_per_sale": {
                "type": "integer",
                "minimum": 1,
                "description": "Whole number from 1 through the deployment Product.max_per_sale setting. Omitted/empty on creation uses that setting; send the current configuration on edit."
              },
              "waitinglist": {
                "type": ["boolean", "integer", "string"],
                "description": "Legacy checkbox value; use 0 or 1 in new requests."
              },
              "keep_soldout_in_shop": {
                "type": ["boolean", "integer", "string"],
                "description": "Legacy checkbox value; use 0 or 1 in new requests."
              },
              "package_flag": {
                "type": ["boolean", "integer", "string"],
                "description": "Legacy checkbox value; use 0 or 1 in new requests."
              },
              "donation": {
                "type": ["boolean", "integer", "string"],
                "description": "Legacy checkbox value; use 0 or 1 in new requests."
              },
              "duplicate": {
                "type": ["boolean", "integer", "string"],
                "description": "Legacy checkbox value; use 0 or 1 in new requests."
              },
              "text_on_ticket": {
                "type": "string"
              }
            },
            "additionalProperties": true,
            "required": ["title", "price"],
            "allOf": [
              {
                "if": {
                  "properties": {
                    "donation": {
                      "enum": [1, "1", true]
                    }
                  },
                  "required": ["donation"]
                },
                "then": {},
                "else": {
                  "properties": {
                    "price": {
                      "not": {
                        "type": "null"
                      }
                    }
                  }
                }
              }
            ]
          },
          "ProductsVolume": {
            "type": "object",
            "properties": {},
            "additionalProperties": {
              "type": "object",
              "properties": {
                "price": {
                  "type": ["string", "number"],
                  "description": "Decimal amount in the event currency; use decimal arithmetic."
                }
              },
              "additionalProperties": true,
              "required": ["price"]
            },
            "description": "Quantity-keyed price rows, for example {\"5\":{\"price\":\"20.00\"}}."
          },
          "ProductsPool": {
            "type": "object",
            "properties": {},
            "additionalProperties": {
              "type": "object",
              "properties": {
                "pool": {
                  "type": ["boolean", "integer", "string"],
                  "description": "Legacy checkbox value; use 0 or 1 in new requests."
                }
              },
              "additionalProperties": true,
              "required": ["pool"]
            },
            "description": "Pool-ID-keyed selections, for example {\"1\":{\"pool\":1}}. The key identifies the shared pool."
          },
          "PackagesProduct": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "product_id": {
                  "type": "string",
                  "format": "uuid"
                },
                "amount": {
                  "type": "integer",
                  "minimum": 1
                },
                "active": {
                  "type": "integer",
                  "const": 1,
                  "description": "Select this package member. Rows with no active value are skipped."
                }
              },
              "additionalProperties": true,
              "required": ["product_id", "amount", "active"]
            }
          },
          "Meta": {
            "type": "object",
            "properties": {},
            "additionalProperties": true
          },
          "Event": {
            "type": "object",
            "properties": {},
            "additionalProperties": true,
            "description": "First paid-ticket fee/VAT settings; subject to event validation."
          }
        },
        "additionalProperties": false,
        "required": ["Product"]
      },
      "ProductConfiguration": {
        "type": "object",
        "properties": {
          "Product": {
            "$ref": "#/components/schemas/ProductSettings"
          },
          "ProductsVolume": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {},
              "additionalProperties": true
            }
          },
          "ProductsPool": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {},
              "additionalProperties": true
            }
          },
          "PackagesProduct": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {},
              "additionalProperties": true
            }
          },
          "Attachment": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {},
              "additionalProperties": true
            }
          },
          "Meta": {},
          "Event": {
            "type": "object",
            "properties": {},
            "additionalProperties": true
          }
        },
        "additionalProperties": true,
        "required": ["Product"]
      },
      "CategoryRecord": {
        "type": "object",
        "properties": {
          "Category": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid"
              },
              "name": {
                "type": "string"
              },
              "order": {
                "type": "integer"
              },
              "hide": {
                "type": ["boolean", "integer", "string"],
                "description": "Legacy checkbox value; use 0 or 1 in new requests."
              }
            },
            "additionalProperties": true
          },
          "CategoryField": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/QuestionDefinition"
            }
          }
        },
        "additionalProperties": true,
        "required": ["Category"]
      },
      "CategoryMutation": {
        "type": "object",
        "properties": {
          "Category": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "minLength": 2,
                "maxLength": 100
              },
              "order": {
                "type": "integer"
              }
            },
            "additionalProperties": false,
            "required": ["name"]
          }
        },
        "additionalProperties": false,
        "required": ["Category"]
      },
      "ProductOrder": {
        "type": "object",
        "properties": {
          "Product": {
            "type": "object",
            "properties": {},
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Complete category UUID to ordered product UUID array map. Every category and product must appear once. Use [\"empty\"] for an empty group."
          }
        },
        "additionalProperties": false,
        "required": ["Product"]
      },
      "QuestionMutation": {
        "type": "object",
        "properties": {
          "CategoryField": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "minLength": 2,
                "maxLength": 255
              },
              "type": {
                "type": "string",
                "description": "Case-sensitive definition type. Day questions additionally require company/event eligibility. See /en-us/docs/question-types; historical aliases are not accepted for new definitions.",
                "enum": [
                  "organization",
                  "branche",
                  "job_description",
                  "workshop",
                  "paid",
                  "donation",
                  "text",
                  "email",
                  "date",
                  "time",
                  "dateTime",
                  "numeric",
                  "textarea",
                  "checkbox",
                  "select",
                  "multiplechoice",
                  "singlechoice",
                  "label",
                  "file",
                  "day_choice",
                  "day_indicator"
                ]
              },
              "mandatory": {
                "type": ["boolean", "integer", "string"],
                "description": "Legacy checkbox value; use 0 or 1 in new requests."
              },
              "on_ticket": {
                "type": ["boolean", "integer", "string"],
                "description": "Legacy checkbox value; use 0 or 1 in new requests."
              },
              "selfservice_disabled": {
                "type": ["boolean", "integer", "string"],
                "description": "Legacy checkbox value; use 0 or 1 in new requests."
              },
              "options": {
                "type": ["array", "object"],
                "description": "Choice types use scalar labels, e.g. [\"Vegetarian\",\"None\"]. Workshop rows use question and optional amount. Paid questions use {\"price\":\"5.00\"}. Omit for text questions; empty labels are discarded."
              },
              "other": {
                "type": ["boolean", "integer", "string"],
                "description": "Legacy checkbox value; use 0 or 1 in new requests."
              },
              "answer_amount": {
                "type": "integer"
              }
            },
            "additionalProperties": false,
            "required": ["name", "type"],
            "allOf": [
              {
                "if": {
                  "properties": {
                    "type": {
                      "enum": [
                        "select",
                        "multiplechoice",
                        "singlechoice",
                        "day_indicator"
                      ]
                    }
                  },
                  "required": ["type"]
                },
                "then": {
                  "properties": {
                    "options": {
                      "anyOf": [
                        {
                          "type": "array",
                          "items": {
                            "type": ["string", "number", "integer"]
                          }
                        },
                        {
                          "type": "object",
                          "additionalProperties": {
                            "type": ["string", "number", "integer"]
                          }
                        }
                      ]
                    }
                  }
                }
              },
              {
                "if": {
                  "properties": {
                    "type": {
                      "enum": ["workshop"]
                    }
                  },
                  "required": ["type"]
                },
                "then": {
                  "properties": {
                    "options": {
                      "anyOf": [
                        {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "required": ["question"],
                            "properties": {
                              "question": {
                                "type": ["string", "number", "integer"]
                              },
                              "amount": {
                                "type": ["string", "number", "integer", "null"]
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        {
                          "type": "object",
                          "additionalProperties": {
                            "type": "object",
                            "required": ["question"],
                            "properties": {
                              "question": {
                                "type": ["string", "number", "integer"]
                              },
                              "amount": {
                                "type": ["string", "number", "integer", "null"]
                              }
                            },
                            "additionalProperties": false
                          }
                        }
                      ]
                    }
                  }
                }
              },
              {
                "if": {
                  "properties": {
                    "type": {
                      "enum": ["paid"]
                    }
                  },
                  "required": ["type"]
                },
                "then": {
                  "properties": {
                    "options": {
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "price": {
                              "type": ["string", "number", "integer"]
                            }
                          },
                          "additionalProperties": false
                        },
                        {
                          "type": "array",
                          "maxItems": 0
                        }
                      ]
                    }
                  }
                }
              },
              {
                "if": {
                  "properties": {
                    "type": {
                      "not": {
                        "enum": [
                          "select",
                          "multiplechoice",
                          "singlechoice",
                          "day_indicator",
                          "workshop",
                          "paid"
                        ]
                      }
                    }
                  },
                  "required": ["type"]
                },
                "then": {
                  "properties": {
                    "options": {
                      "anyOf": [
                        {
                          "type": "array",
                          "maxItems": 0
                        },
                        {
                          "type": "object",
                          "maxProperties": 0
                        }
                      ]
                    }
                  }
                }
              }
            ]
          }
        },
        "additionalProperties": false,
        "required": ["CategoryField"]
      },
      "WaitinglistRecord": {
        "type": "object",
        "properties": {
          "Waitinglist": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid"
              },
              "event_id": {
                "type": "string",
                "format": "uuid"
              },
              "product_id": {
                "type": "string",
                "format": "uuid"
              },
              "firstname": {
                "type": "string"
              },
              "lastname": {
                "type": "string"
              },
              "email": {
                "type": "string"
              },
              "phone": {
                "type": ["string", "null"]
              },
              "created": {
                "type": ["string", "null"],
                "description": "Server-local SQL timestamp; no UTC offset is included."
              },
              "promocode_id": {
                "type": ["string", "null"]
              }
            },
            "additionalProperties": true
          },
          "ProductRegister": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string"
              }
            },
            "additionalProperties": true
          },
          "Promocode": {
            "type": "object",
            "properties": {
              "expires": {
                "type": ["string", "null"],
                "description": "Server-local SQL timestamp; no UTC offset is included."
              }
            },
            "additionalProperties": true
          }
        },
        "additionalProperties": true,
        "required": ["Waitinglist"]
      },
      "WaitinglistPage": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WaitinglistRecord"
            }
          },
          "total": {
            "type": "integer"
          },
          "page": {
            "type": "integer"
          },
          "events": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {},
              "additionalProperties": true
            }
          }
        },
        "additionalProperties": true,
        "required": ["items", "total", "page", "events"]
      },
      "WaitinglistDetail": {
        "type": "object",
        "properties": {
          "item": {
            "type": "object",
            "properties": {},
            "additionalProperties": true
          },
          "invitation": {},
          "products": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {},
              "additionalProperties": true
            }
          },
          "event": {
            "type": "object",
            "properties": {},
            "additionalProperties": true
          }
        },
        "additionalProperties": true,
        "required": ["item", "invitation", "products", "event"]
      },
      "WaitinglistInvite": {
        "type": "object",
        "properties": {
          "Waitinglist": {
            "type": "object",
            "properties": {
              "ids": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                },
                "minItems": 1
              },
              "product_id_invite": {
                "type": "string",
                "format": "uuid"
              },
              "amount": {
                "type": "integer",
                "minimum": 1,
                "maximum": 50
              },
              "invite_valid_for_hours": {
                "type": "integer",
                "enum": [0, 24, 48, 72, 168, 336, 744, 1488, 8760],
                "description": "0 means no expiration."
              }
            },
            "additionalProperties": false,
            "required": [
              "ids",
              "product_id_invite",
              "amount",
              "invite_valid_for_hours"
            ]
          }
        },
        "additionalProperties": false,
        "required": ["Waitinglist"]
      },
      "WaitinglistStatus": {
        "type": "object",
        "properties": {
          "status": {
            "type": "object",
            "properties": {
              "success": {
                "type": "boolean"
              }
            },
            "additionalProperties": true,
            "required": ["success"]
          }
        },
        "additionalProperties": true,
        "required": ["status"]
      },
      "AttendeeMutation": {
        "type": "object",
        "properties": {
          "OrderLine": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid"
              },
              "title": {
                "type": "string"
              },
              "firstname": {
                "type": "string"
              },
              "lastname": {
                "type": "string"
              },
              "email": {
                "type": "string",
                "format": "email"
              },
              "phone": {
                "type": "string"
              }
            },
            "additionalProperties": false,
            "description": "Additional UUID-named keys contain answers to permitted current/historical questions. File answers are skipped; unrelated associations are discarded. Extra registration validation is bypassed by the organizer save action; validate answer values in your integration.",
            "patternProperties": {
              "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$": {
                "type": [
                  "string",
                  "number",
                  "integer",
                  "boolean",
                  "array",
                  "object",
                  "null"
                ],
                "description": "UUID-keyed question answer. Choice arrays contain labels; Other uses numeric keys plus choose_other and other_value. DateTime accepts YYYY-MM-DDTHH:mm. Paid snapshots are preserved and file answers skipped."
              }
            }
          }
        },
        "additionalProperties": false,
        "required": ["OrderLine"]
      },
      "AttendeeMutationResult": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid"
              }
            },
            "additionalProperties": true
          },
          "error": {
            "type": "string"
          },
          "detail": {
            "type": "string"
          },
          "validation_errors": {}
        },
        "additionalProperties": true,
        "required": ["ok"]
      },
      "OrganizerPanel": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "data": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid"
                },
                "title": {
                  "type": "string"
                },
                "products": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "format": "uuid"
                      },
                      "title": {
                        "type": "string"
                      }
                    },
                    "required": ["id", "title"],
                    "additionalProperties": true
                  }
                }
              },
              "additionalProperties": true,
              "required": ["id", "title", "products"]
            }
          }
        },
        "required": ["ok", "data"],
        "additionalProperties": true,
        "description": "Eligible event products grouped by category. Each group has id, title and product id/title rows; packages and donations are excluded."
      },
      "OrderMutation": {
        "type": "object",
        "properties": {
          "Order": {
            "type": "object",
            "properties": {
              "firstname": {
                "type": "string"
              },
              "lastname": {
                "type": "string"
              },
              "email": {
                "type": "string",
                "format": "email"
              },
              "company": {
                "type": "string"
              },
              "country": {
                "type": "string"
              },
              "city": {
                "type": "string"
              },
              "address": {
                "type": "string"
              },
              "phone": {
                "type": "string"
              },
              "promocode_id": {
                "type": "string",
                "format": "uuid"
              },
              "extra_fields_answers": {},
              "zipcode": {
                "type": "string"
              }
            },
            "additionalProperties": true,
            "description": "Allowed billing/contact and registration fields only; lifecycle and validation rules apply. An edit can create a replacement order; follow new_order_created."
          }
        },
        "additionalProperties": false,
        "required": ["Order"]
      },
      "EventMutation": {
        "type": "object",
        "properties": {
          "Event": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "minLength": 1
              },
              "start_date": {
                "type": ["string", "null"],
                "description": "Server-local SQL timestamp; no UTC offset is included."
              },
              "end_date": {
                "type": ["string", "null"],
                "description": "Server-local SQL timestamp; no UTC offset is included."
              },
              "currency": {
                "type": "string",
                "description": "Event currency, e.g. EUR. Creation uses company defaults when omitted; do not change currency after sales without the organizer workflow."
              },
              "timezone": {
                "type": "string",
                "description": "IANA timezone, e.g. Europe/Amsterdam; timestamps themselves have no UTC offset."
              },
              "email_name": {
                "type": "string"
              },
              "email_mail": {
                "type": "string"
              },
              "Meta": {
                "type": "object",
                "properties": {},
                "additionalProperties": true
              }
            },
            "additionalProperties": true,
            "description": "Server filters protected/company fields and metadata. Submit both dates when changing dates. Dates may be protected after sales."
          },
          "Meta": {
            "type": "object",
            "properties": {},
            "additionalProperties": true
          }
        },
        "additionalProperties": false,
        "required": ["Event"],
        "description": "Creation merges company/server defaults, including dates and title. Supply deliberate name, dates, currency and timezone. Editing filters protected fields; send both dates when changing the schedule. Metadata is allowlisted by the server."
      },
      "PromoMutation": {
        "type": "object",
        "properties": {
          "Promocode": {
            "type": "object",
            "properties": {
              "code": {
                "type": "string",
                "maxLength": 25
              },
              "discount": {
                "type": ["string", "number"],
                "description": "Percentage discount for prd_prct promotions; product-specific prices are set on ProductsPromocode.price."
              },
              "stock": {
                "type": "integer"
              },
              "expires": {
                "type": ["string", "null"],
                "description": "Server-local SQL timestamp; no UTC offset is included."
              },
              "active": {
                "type": ["boolean", "integer", "string"],
                "description": "Legacy checkbox value; use 0 or 1 in new requests."
              },
              "hide_other_products": {
                "type": ["boolean", "integer", "string"],
                "description": "Legacy checkbox value; use 0 or 1 in new requests."
              },
              "budget": {
                "type": ["string", "number"],
                "description": "Decimal amount in the event currency; use decimal arithmetic."
              },
              "guaranteed": {
                "type": ["boolean", "integer", "string"],
                "description": "Legacy checkbox value; use 0 or 1 in new requests."
              },
              "allow_invoice": {
                "type": ["boolean", "integer", "string"],
                "description": "Legacy checkbox value; use 0 or 1 in new requests."
              }
            },
            "additionalProperties": false
          },
          "ProductsPromocode": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "product_id": {
                  "type": "string",
                  "format": "uuid"
                },
                "active": {
                  "type": ["boolean", "integer", "string"],
                  "description": "Legacy checkbox value; use 0 or 1 in new requests."
                },
                "max": {
                  "type": "integer"
                },
                "price": {
                  "type": ["string", "number"],
                  "description": "Decimal amount in the event currency; use decimal arithmetic."
                }
              },
              "additionalProperties": false,
              "required": ["product_id"]
            }
          }
        },
        "additionalProperties": false,
        "required": ["Promocode"]
      },
      "PromoCodeMap": {
        "oneOf": [
          {
            "type": "object",
            "properties": {},
            "additionalProperties": {
              "type": "string"
            }
          },
          {
            "type": "array",
            "maxItems": 0
          }
        ],
        "description": "Map of promo UUID to code for codes referenced by orders in the authorized scope. Empty result may be []. This is not the complete promo catalog."
      },
      "PromoInvitationRequest": {
        "type": "object",
        "properties": {
          "invites": {
            "type": "array",
            "minItems": 1,
            "maxItems": 100,
            "items": {
              "type": "object",
              "properties": {
                "email": {
                  "type": "string",
                  "format": "email"
                },
                "firstname": {
                  "type": "string"
                },
                "lastname": {
                  "type": "string"
                }
              },
              "additionalProperties": false,
              "required": ["email", "firstname"]
            }
          }
        },
        "additionalProperties": false,
        "required": ["invites"]
      },
      "PromoInvitationResult": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "enum": ["ok", "partial", "error"]
          },
          "queued": {
            "type": "integer"
          },
          "queued_indices": {
            "type": "array",
            "items": {
              "type": "integer"
            }
          },
          "rejected": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "index": {
                  "type": "integer"
                },
                "reason": {
                  "type": "string"
                }
              },
              "additionalProperties": true
            }
          },
          "message": {
            "type": "string"
          },
          "limit": {
            "type": ["integer", "null"]
          },
          "remaining": {
            "type": ["integer", "null"]
          }
        },
        "additionalProperties": true,
        "required": ["status", "queued", "queued_indices", "rejected"]
      },
      "ScanRequest": {
        "type": "object",
        "properties": {
          "scan": {
            "type": "string",
            "format": "uuid"
          }
        },
        "additionalProperties": false,
        "required": ["scan"]
      },
      "ScanResult": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "format": "uuid"
            },
            "scanned": {
              "type": "boolean",
              "description": "True if already scanned before this request."
            },
            "checkedin": {
              "type": "integer",
              "const": 1
            }
          },
          "additionalProperties": true,
          "required": ["id", "scanned", "checkedin"]
        }
      },
      "Traffic": {
        "type": "object",
        "properties": {
          "totals_last_90_days": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "date": {
                  "type": "string"
                },
                "total": {
                  "type": ["string", "integer"]
                }
              },
              "additionalProperties": true
            }
          },
          "total_last_24_hours": {
            "type": "integer"
          },
          "last_hour_logs": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "domain": {
                  "type": "string"
                },
                "utm_source": {
                  "type": "string"
                },
                "city": {
                  "type": "string"
                },
                "country_code": {
                  "type": "string"
                },
                "created": {
                  "type": ["string", "null"],
                  "description": "Server-local SQL timestamp; no UTC offset is included."
                }
              },
              "additionalProperties": true
            }
          },
          "top_utm_sources": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {},
              "additionalProperties": true
            }
          },
          "top_cities": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {},
              "additionalProperties": true
            }
          }
        },
        "additionalProperties": true
      },
      "CommentRecord": {
        "type": "object",
        "properties": {
          "Comment": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid"
              },
              "parent": {
                "type": "string"
              },
              "parent_id": {
                "type": "string",
                "format": "uuid"
              },
              "comment": {
                "type": "string"
              },
              "created": {
                "type": ["string", "null"],
                "description": "Server-local SQL timestamp; no UTC offset is included."
              }
            },
            "additionalProperties": true
          },
          "User": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid"
              },
              "name": {
                "type": "string"
              },
              "is_team_member": {
                "type": "boolean"
              }
            },
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "FileResult": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "status": {
            "type": "integer"
          },
          "title": {
            "type": "string"
          },
          "detail": {
            "type": "string"
          },
          "attachment": {
            "type": "string",
            "format": "uri"
          },
          "attachment_id": {
            "type": "string",
            "format": "uuid"
          },
          "errors": {}
        },
        "additionalProperties": true,
        "required": ["success", "status", "title", "detail"]
      },
      "ProductSettings": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "category_id": {
            "type": "string",
            "format": "uuid"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": ["string", "null"]
          },
          "price": {
            "type": ["string", "number", "null"],
            "description": "Legacy decimal monetary value in the event currency. Use decimal arithmetic; do not assume integer minor units."
          },
          "stock": {
            "type": ["integer", "boolean", "string", "null"],
            "description": "Configured capacity. -1 means unlimited."
          },
          "current_stock": {
            "type": ["integer", "number"],
            "description": "Configured stock minus sold, reserved and pending quantities, with recurring/guaranteed rules. Unlimited stock currently yields 8388607. Shared pools, visibility and sales windows require separate checkout validation."
          },
          "visible": {
            "type": ["integer", "boolean", "string", "null"]
          },
          "repeating": {
            "type": ["integer", "boolean", "string", "null"]
          },
          "available_from": {
            "type": ["string", "null"],
            "description": "Legacy server-local SQL timestamp, generally YYYY-MM-DD HH:mm:ss; no UTC offset is supplied."
          },
          "available_till": {
            "type": ["string", "null"],
            "description": "Legacy server-local SQL timestamp, generally YYYY-MM-DD HH:mm:ss; no UTC offset is supplied."
          },
          "sales_count": {
            "type": ["integer", "boolean", "string", "null"]
          },
          "max_per_sale": {
            "type": ["integer", "boolean", "string", "null"]
          },
          "package_flag": {
            "type": ["integer", "boolean", "string", "null"]
          },
          "connected_with_package": {
            "type": ["integer", "boolean", "string", "null"]
          },
          "ProductsPool": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "pool": {
                  "type": ["string", "integer"]
                },
                "sales": {
                  "type": "integer"
                }
              },
              "additionalProperties": true
            }
          },
          "PackagesProduct": {
            "type": "array",
            "items": {}
          },
          "pending": {
            "type": ["integer", "boolean", "string", "null"]
          },
          "waitinglist": {
            "type": ["boolean", "integer", "string"],
            "description": "Legacy checkbox value; use 0 or 1 in new requests."
          },
          "keep_soldout_in_shop": {
            "type": ["boolean", "integer", "string"],
            "description": "Legacy checkbox value; use 0 or 1 in new requests."
          }
        },
        "required": ["id", "title"],
        "additionalProperties": true,
        "description": "Raw organizer configuration retains nullable database fields and decimal/integer strings. The catalog list is a separate normalized projection."
      },
      "QuestionDefinition": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "category_id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "order": {
            "type": ["integer", "string", "null"]
          },
          "mandatory": {
            "type": ["boolean", "integer", "string", "null"],
            "description": "Legacy checkbox value; use 0 or 1 in requests."
          },
          "on_ticket": {
            "type": ["boolean", "integer", "string", "null"],
            "description": "Legacy checkbox value; use 0 or 1 in requests."
          },
          "selfservice_disabled": {
            "type": ["boolean", "integer", "string", "null"],
            "description": "Legacy checkbox value; use 0 or 1 in requests."
          },
          "other": {
            "type": ["boolean", "integer", "string", "null"],
            "description": "Legacy checkbox value; use 0 or 1 in requests."
          },
          "answer_amount": {
            "type": ["integer", "string", "null"]
          },
          "options": {}
        },
        "additionalProperties": true,
        "description": "Current category question definition. Legacy numeric and checkbox fields can be strings or null; additional fields vary by question type."
      },
      "QuestionDefinitionRecord": {
        "type": "object",
        "properties": {
          "CategoryField": {
            "$ref": "#/components/schemas/QuestionDefinition"
          }
        },
        "additionalProperties": true,
        "required": ["CategoryField"]
      },
      "QuestionValidationError": {
        "type": "object",
        "properties": {
          "success": {
            "const": false
          },
          "error": {
            "const": "validation_failed"
          },
          "errors": {
            "type": "object",
            "properties": {},
            "additionalProperties": true
          }
        },
        "additionalProperties": true,
        "required": ["success", "error", "errors"]
      },
      "ProductUpdateMutation": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ProductMutation"
          },
          {
            "type": "object",
            "properties": {
              "Product": {
                "type": "object",
                "required": ["stock", "max_per_sale"],
                "anyOf": [
                  {
                    "required": ["category_id"]
                  },
                  {
                    "required": ["category_new"]
                  }
                ]
              }
            }
          }
        ],
        "description": "Full organizer configuration update. Retain required title, price, category, stock and maximum-per-sale fields. Related volume/pool/package selections are replaced, not merged."
      },
      "OrganizerQuestion": {
        "type": "object",
        "properties": {
          "id": {
            "type": ["string", "null"]
          },
          "name": {
            "type": "string"
          },
          "type": {
            "type": ["string", "null"]
          },
          "mandatory": {
            "type": "boolean"
          },
          "other": {
            "type": "boolean"
          },
          "onTicket": {
            "type": "boolean"
          },
          "answerAmount": {
            "type": ["integer", "string", "null"]
          },
          "options": {
            "type": ["array", "object", "null"]
          },
          "dayChoices": {
            "type": ["array", "object"]
          }
        },
        "additionalProperties": true,
        "description": "Organizer-normalized current/historical question, with camelCase flags. Keep returned option/day keys."
      },
      "CompactEventNote": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "ui": {
            "type": "string"
          },
          "c": {
            "type": "string"
          },
          "d": {
            "type": ["string", "integer"],
            "description": "Unix seconds; SQL results can serialize as a decimal string."
          }
        },
        "required": ["id", "ui", "c", "d"],
        "additionalProperties": true
      },
      "EventNotesSnapshot": {
        "type": "object",
        "properties": {
          "events": {
            "anyOf": [
              {
                "type": "object",
                "additionalProperties": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "currency": {
                      "type": "string"
                    },
                    "start_date": {
                      "type": ["string", "null"]
                    }
                  },
                  "additionalProperties": true
                }
              },
              {
                "type": "array",
                "maxItems": 0
              }
            ]
          },
          "items": {
            "anyOf": [
              {
                "type": "object",
                "additionalProperties": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CompactEventNote"
                  }
                }
              },
              {
                "type": "array",
                "maxItems": 0
              }
            ]
          }
        },
        "required": ["events", "items"],
        "additionalProperties": false,
        "description": "Company-membership-scoped Event notes grouped by event UUID; does not include Order/OrderLine notes. Empty maps can be []. Each partition is capped at 75000 notes."
      },
      "StageState": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "event_id": {
            "type": "string",
            "format": "uuid"
          }
        },
        "required": ["id", "event_id"],
        "additionalProperties": true,
        "description": "Complete client-defined public display state. No private attendee/organizer data. Writes replace the object; there is no version or patch precondition."
      },
      "StageMutation": {
        "type": "object",
        "properties": {
          "stage": {
            "$ref": "#/components/schemas/StageState"
          }
        },
        "required": ["stage"],
        "additionalProperties": false
      },
      "OrganizerOrderPanel": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "data": {
            "type": "object",
            "properties": {
              "order": {
                "type": "object",
                "additionalProperties": true
              },
              "fields": {
                "type": "object",
                "additionalProperties": true
              },
              "paymentState": {
                "type": "object",
                "additionalProperties": true,
                "description": "Current payment/lifecycle capabilities; read before a dependent write."
              },
              "totals": {
                "type": ["object", "array"]
              },
              "promocode": {
                "type": ["object", "array", "null"]
              },
              "extraFields": {
                "type": ["array", "object"]
              },
              "extraAnswers": {
                "type": ["array", "object"]
              },
              "orderLines": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": true
                }
              },
              "paymentActions": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "type": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string"
                    },
                    "created": {
                      "type": ["string", "null"]
                    },
                    "processed": {
                      "type": ["string", "null"]
                    },
                    "amount": {
                      "type": "integer",
                      "description": "Payment action amount in minor currency units."
                    }
                  },
                  "additionalProperties": true
                }
              },
              "creditOrder": {
                "type": ["object", "null"]
              },
              "creditParentOrder": {
                "type": ["object", "null"]
              },
              "listRow": {
                "type": "object",
                "additionalProperties": true
              },
              "mailDeliveries": {
                "type": ["array", "object"]
              }
            },
            "additionalProperties": true
          }
        },
        "additionalProperties": true,
        "required": ["ok", "data"],
        "description": "Organizer context projection; nested fields can change with UI capabilities. Includes payment/registration and mail-delivery context."
      }
    }
  },
  "externalDocs": {
    "description": "Paydro integration guides",
    "url": "https://developer.paydro.com/en-us/docs/getting-started"
  }
}
