{
  "info": {
    "_postman_id": "belvitur-eventos-api-2025",
    "name": "Belvitur Eventos API",
    "description": "\n\n## Novidades v5.13.0 — Fuso horário do evento\n\n`POST /events` e `PUT /events/{id}` agora aceitam o campo opcional **`timezone`** (identificador IANA, ex.: `America/Sao_Paulo`, `America/New_York`, `Europe/Lisbon`, `Asia/Tokyo`). Default: `America/Sao_Paulo`.\n\n**Para que serve:** ancora os cálculos derivados de datas no fuso do local do evento — jornada do convidado (lembretes empáticos), alertas Cirium de voos, clima do aeroporto e `quiet_hours` quando não houver `quiet_hours_timezone` próprio. **Não altera** a wall-clock literal exibida em `start_date`/`end_date`/`vouchers`/`agenda` (ver v5.11.0).\n\n---\n\nAPI de integração para gerenciamento de eventos, convidados, vouchers, agenda, acompanhantes e notificações do **Belvitur Eventos** — aplicativo completo para gestão de eventos corporativos.\n\n**Base URL:** https://api-eventosapp.beflytech.com.br/api/v1\n\n**Versão:** 5.13.0\n\n## Novidades v5.12.0 — Cancelamento de evento exclusivo via API\n\nO status `cancelled` em eventos passa a ser controlado **exclusivamente pela API**. O painel do organizador não expõe mais o botão \"Cancelar evento\". Use `PUT /events/{id}` com `\"status\": \"cancelled\"` para cancelar (ver requisição **Cancelar Evento**) e `\"status\": \"upcoming\"` (ou outro válido) para reativar (ver **Reativar Evento**).\n\n**Visibilidade no app quando `status = cancelled`:**\n- Aparece com badge **\"Cancelado\"** apenas para convidados já confirmados (`confirmed` ou `checked_in`).\n- Convidados ainda `pending` deixam de ver o evento na listagem.\n- Permanece visível até a `end_date` (ou `start_date` se não houver `end_date`); depois é ocultado.\n- O cron horário `update-event-status` **ignora eventos cancelados** — não há transição automática para `upcoming`/`ongoing`/`past`. A reativação só acontece via API.\n\n## Novidades v5.11.0 — Datas e horas preservadas literalmente\n\nOs campos de data/hora dos endpoints de **eventos**, **vouchers** e **agenda** agora são armazenados **exatamente como foram enviados**, sem aplicar nenhuma conversão de fuso horário. A wall-clock cadastrada via API é a mesma exibida no app.\n\n**Campos afetados:**\n- `events.start_date`, `events.end_date`\n- `vouchers.valid_from`, `vouchers.valid_to`\n- `agenda_items.start_time`, `agenda_items.end_time`\n\n**Como funciona:** a API extrai os componentes `YYYY-MM-DD HH:MM:SS` da string recebida e os grava ancorados em UTC, sem deslocamento. Qualquer sufixo de fuso (`Z`, `+HH:MM`, `-HH:MM`) é descartado — apenas a wall-clock importa.\n\n```\n\"2026-06-15T09:00:00\"          → 15/06/2026 09:00\n\"2026-06-15T09:00:00Z\"         → 15/06/2026 09:00\n\"2026-06-15T09:00:00-03:00\"    → 15/06/2026 09:00\n\"2026-06-15T09:00:00+02:00\"    → 15/06/2026 09:00\n\"2026-06-15\"                   → 15/06/2026 00:00\n```\n\nRecomendamos enviar sempre a data/hora local do evento sem offset (ex.: `\"2026-06-15T09:00:00\"`).\n\n## Novidades v5.10.0\n\n- **Vínculo de convite com verificação de contato**: o auto-link de `pending_guests` a uma conta de usuário agora exige que o canal usado no match esteja verificado no perfil. Matches por `email` exigem `email_verified_at`; matches por `phone`/`phone_e164` (WhatsApp) exigem `phone_verified_at`. CPF e passaporte continuam vinculando direto.\n- **Holds de verificação**: quando o match acontece só por canal não-verificado, o sistema cria um *hold* interno e dispara uma notificação no app pedindo a verificação. O convite só aparece para aceite após a verificação — que resolve o hold automaticamente.\n- **Re-vínculo automático em PUT**: alterar `email`, `phone`, `phone_e164`, `cpf` ou `passport_number` em `PUT /guests/{id}` de um convidado ainda pendente reexecuta o matching contra os perfis cadastrados (antes acontecia só no POST). Útil para corrigir contatos depois do envio inicial.\n- **Sem mudanças de payload ou de resposta** — comportamento totalmente server-side e idempotente.\n\nPara histórico completo de versões, consulte docs/API.md.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
    "version": "5.13.0"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{access_token}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "base_url",
      "value": "https://api-eventosapp.beflytech.com.br/api/v1"
    },
    {
      "key": "client_id",
      "value": "SEU_CLIENT_ID"
    },
    {
      "key": "client_secret",
      "value": "SEU_CLIENT_SECRET"
    },
    {
      "key": "access_token",
      "value": ""
    },
    {
      "key": "event_id",
      "value": ""
    },
    {
      "key": "guest_id",
      "value": ""
    },
    {
      "key": "user_id",
      "value": ""
    },
    {
      "key": "voucher_id",
      "value": ""
    },
    {
      "key": "agenda_item_id",
      "value": ""
    },
    {
      "key": "pending_guest_id",
      "value": ""
    },
    {
      "key": "companion_link_id",
      "value": ""
    },
    {
      "key": "voucher_guest_id",
      "value": ""
    },
    {
      "key": "hotel_reservation_id",
      "value": ""
    }
  ],
  "item": [
    {
      "name": "🔐 Authentication",
      "description": "Endpoints para autenticação OAuth 2.0",
      "item": [
        {
          "name": "Obter Access Token",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 200) {",
                  "    var jsonData = pm.response.json();",
                  "    pm.collectionVariables.set('access_token', jsonData.access_token);",
                  "    console.log('Token salvo com sucesso!');",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"grant_type\": \"client_credentials\",\n  \"client_id\": \"{{client_id}}\",\n  \"client_secret\": \"{{client_secret}}\"\n}"
            },
            "url": {
              "raw": "{{base_url}}/oauth-token",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "oauth-token"
              ]
            },
            "description": "Obtém um access token OAuth 2.0 usando suas credenciais de cliente.\n\n**Importante:** Configure as variáveis `client_id` e `client_secret` antes de executar.\n\nO token retornado será salvo automaticamente na variável `access_token` da collection."
          },
          "response": [
            {
              "name": "Token obtido com sucesso",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"grant_type\": \"client_credentials\",\n  \"client_id\": \"meu_client_id\",\n  \"client_secret\": \"meu_client_secret\"\n}"
                },
                "url": {
                  "raw": "{{base_url}}/oauth-token",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "oauth-token"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [],
              "body": "{\n  \"access_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n  \"token_type\": \"Bearer\",\n  \"expires_in\": 3600,\n  \"scope\": \"read write\"\n}"
            }
          ]
        },
        {
          "name": "Obter Token (Form URL Encoded)",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 200) {",
                  "    var jsonData = pm.response.json();",
                  "    pm.collectionVariables.set('access_token', jsonData.access_token);",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/x-www-form-urlencoded"
              }
            ],
            "body": {
              "mode": "urlencoded",
              "urlencoded": [
                {
                  "key": "grant_type",
                  "value": "client_credentials"
                },
                {
                  "key": "client_id",
                  "value": "{{client_id}}"
                },
                {
                  "key": "client_secret",
                  "value": "{{client_secret}}"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/oauth-token",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "oauth-token"
              ]
            },
            "description": "Alternativa usando application/x-www-form-urlencoded (padrão OAuth 2.0)."
          },
          "response": [
            {
              "name": "200 - Token emitido",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"access_token\": \"abc123def456...\",\n  \"token_type\": \"Bearer\",\n  \"expires_in\": 3600,\n  \"scope\": \"read write\"\n}"
            },
            {
              "name": "401 - Credenciais inválidas",
              "originalRequest": null,
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": \"invalid_client\",\n  \"error_description\": \"Invalid client credentials\"\n}"
            }
          ]
        },
        {
          "name": "Revogar Token",
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/x-www-form-urlencoded"
              }
            ],
            "body": {
              "mode": "urlencoded",
              "urlencoded": [
                {
                  "key": "token",
                  "value": "{{access_token}}"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/oauth-token/revoke",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "oauth-token",
                "revoke"
              ]
            },
            "description": "Revoga um access token, tornando-o imediatamente inválido.\n\nUse quando:\n- O token não é mais necessário\n- Há suspeita de comprometimento\n- Ao fazer logout de integrações"
          },
          "response": [
            {
              "name": "200 - Token revogado",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": ""
            }
          ]
        },
        {
          "name": "Health Check",
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/health",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "health"
              ]
            },
            "description": "Verifica se a API está funcionando corretamente."
          },
          "response": [
            {
              "name": "API saudável",
              "originalRequest": {
                "method": "GET",
                "url": {
                  "raw": "{{base_url}}/backoffice-api/health",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "backoffice-api",
                    "health"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"status\": \"ok\",\n  \"timestamp\": \"2025-01-15T10:30:00.000Z\"\n}"
            }
          ]
        },
        {
          "name": "GET /schemas/vouchers (Introspecção)",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/schemas/vouchers",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "schemas",
                "vouchers"
              ]
            },
            "description": "Descobre o contrato de payload para criar vouchers: `top_level_required`, `top_level_optional`, `guests_contract` (identificadores aceitos + exemplo), `date_fields` (com aliases como `valid_until`) e schema por tipo (`flight`, `hotel`, etc.). Não consome scope `:write`."
          },
          "response": []
        }
      ]
    },
    {
      "name": "📅 Events",
      "description": "Gerenciamento de eventos",
      "item": [
        {
          "name": "Listar Eventos",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 200) {",
                  "    var jsonData = pm.response.json();",
                  "    if (jsonData.events && jsonData.events.length > 0) {",
                  "        pm.collectionVariables.set('event_id', jsonData.events[0].id);",
                  "        console.log('event_id salvo: ' + jsonData.events[0].id);",
                  "    }",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/events",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "events"
              ]
            },
            "description": "Lista todos os eventos cadastrados.\n\nO primeiro evento retornado será salvo automaticamente na variável `event_id`."
          },
          "response": [
            {
              "name": "Lista de eventos",
              "originalRequest": {
                "method": "GET",
                "url": {
                  "raw": "{{base_url}}/backoffice-api/events",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "backoffice-api",
                    "events"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"events\": [\n    {\n      \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n      \"name\": \"Conferência Tech 2025\",\n      \"description\": \"A maior conferência de tecnologia do Brasil\",\n      \"location\": \"Centro de Convenções, São Paulo\",\n      \"start_date\": \"2025-06-15T09:00:00Z\",\n      \"end_date\": \"2025-06-15T18:00:00Z\",\n      \"timezone\": \"America/Sao_Paulo\",\n      \"status\": \"upcoming\",\n      \"cover_image\": \"https://example.com/image.jpg\",\n      \"brand_color_primary\": \"#1e40af\",\n      \"brand_color_secondary\": \"#60a5fa\",\n      \"background_color\": \"#f8fafc\",\n      \"organizer_name\": \"Tech Events Brasil\",\n      \"organizer_email\": \"contato@techevents.com.br\",\n      \"buyer_name\": \"Empresa ABC\",\n      \"buyer_logo\": \"https://storage.example.com/logo-abc.png\",\n      \"whatsapp_support\": \"+5511999999999\",\n      \"latitude\": -23.5505,\n      \"longitude\": -46.6333,\n      \"gamification_enabled\": true,\n      \"photo_gallery_enabled\": true,\n      \"photo_gallery_public_upload\": true,\n      \"event_chat_enabled\": true,\n      \"networking_meetings_enabled\": true,\n      \"facematching_enabled\": false,\n      \"invitation_email_text\": null,\n      \"invitation_whatsapp_text\": null,\n      \"invitation_preferred_channel\": \"email\",\n      \"destinations\": [\n        { \"city\": \"Cancún\", \"country\": \"México\", \"arrival_date\": \"2025-06-14\", \"departure_date\": \"2025-06-16\" }\n      ]\n    }\n  ]\n}"
            }
          ]
        },
        {
          "name": "Obter Evento por ID",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/events/{{event_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "events",
                "{{event_id}}"
              ]
            },
            "description": "Obtém os detalhes de um evento específico."
          },
          "response": [
            {
              "name": "Evento encontrado",
              "originalRequest": {
                "method": "GET",
                "url": {
                  "raw": "{{base_url}}/backoffice-api/events/{{event_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "backoffice-api",
                    "events",
                    "{{event_id}}"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"event\": {\n    \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"name\": \"Conferência Tech 2025\",\n    \"description\": \"A maior conferência de tecnologia do Brasil\",\n    \"location\": \"Centro de Convenções, São Paulo\",\n    \"start_date\": \"2025-06-15T09:00:00Z\",\n    \"end_date\": \"2025-06-15T18:00:00Z\",\n    \"timezone\": \"America/Sao_Paulo\",\n    \"status\": \"upcoming\",\n    \"cover_image\": \"https://example.com/image.jpg\",\n    \"brand_color_primary\": \"#1e40af\",\n    \"brand_color_secondary\": \"#60a5fa\",\n    \"background_color\": \"#f8fafc\",\n    \"organizer_name\": \"Tech Events Brasil\",\n    \"organizer_email\": \"contato@techevents.com.br\",\n    \"buyer_name\": \"Empresa ABC\",\n    \"buyer_logo\": \"https://storage.example.com/logo-abc.png\",\n    \"whatsapp_support\": \"+5511999999999\",\n    \"latitude\": -23.5505,\n    \"longitude\": -46.6333,\n    \"gamification_enabled\": true,\n    \"photo_gallery_enabled\": true,\n    \"photo_gallery_public_upload\": true,\n    \"event_chat_enabled\": true,\n    \"networking_meetings_enabled\": true,\n    \"facematching_enabled\": false,\n    \"required_guest_fields\": [\"passport\", \"nationality\", \"rg\"],\n    \"required_guest_document_uploads\": [\"passport\"],\n    \"custom_guest_fields\": [\n      { \"key\": \"crm\", \"label\": \"CRM\", \"type\": \"text\", \"required\": true },\n      { \"key\": \"gender\", \"label\": \"Sexo\", \"type\": \"select\", \"options\": [\"Masculino\", \"Feminino\", \"Outro\"], \"required\": false }\n    ],\n    \"invitation_email_text\": \"Você foi convidado para participar deste evento exclusivo!\",\n      \"invitation_whatsapp_text\": \"Olá! Você foi convidado para o evento. Baixe o app para confirmar.\",\n      \"invitation_preferred_channel\": \"email\",\n      \"terms_and_conditions\": \"Ao confirmar presença, o participante declara...\",\n    \"destinations\": [\n      { \"city\": \"Cancún\", \"country\": \"México\", \"arrival_date\": \"2025-06-14\", \"departure_date\": \"2025-06-16\" }\n    ],\n    \"created_at\": \"2025-01-15T10:00:00Z\",\n    \"updated_at\": \"2025-03-20T14:30:00Z\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Criar Evento",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    var jsonData = pm.response.json();",
                  "    if (jsonData.event && jsonData.event.id) {",
                  "        pm.collectionVariables.set('event_id', jsonData.event.id);",
                  "        console.log('Novo event_id salvo: ' + jsonData.event.id);",
                  "    }",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Tech Summit 2025\",\n  \"description\": \"O maior evento de tecnologia do ano\",\n  \"location\": \"Centro de Convenções, São Paulo\",\n  \"latitude\": -23.5505,\n  \"longitude\": -46.6333,\n  \"start_date\": \"2025-06-15T09:00:00Z\",\n  \"end_date\": \"2025-06-15T18:00:00Z\",\n  \"timezone\": \"America/Sao_Paulo\",\n  \"status\": \"upcoming\",\n  \"publish_status\": \"draft\",\n  \"cover_image\": \"https://example.com/cover.jpg\",\n  \"brand_color_primary\": \"#1e40af\",\n  \"brand_color_secondary\": \"#60a5fa\",\n  \"background_color\": \"#f8fafc\",\n  \"organizer_name\": \"Tech Events Brasil\",\n  \"organizer_email\": \"contato@techevents.com.br\",\n  \"buyer_name\": \"Empresa ABC\",\n  \"buyer_logo\": \"https://example.com/logo-abc.png\",\n  \"whatsapp_support\": \"+5511999999999\",\n  \"gamification_enabled\": true,\n  \"photo_gallery_enabled\": true,\n  \"photo_gallery_public_upload\": true,\n  \"event_chat_enabled\": true,\n  \"networking_meetings_enabled\": true,\n  \"facematching_enabled\": false,\n  \"required_guest_fields\": [\"passport\", \"nationality\", \"yellow_fever_vaccine\", \"visa\", \"rg\"],\n  \"required_guest_document_uploads\": [\n    \"passport\",\n    \"yellow_fever_vaccine\"\n  ],\n  \"destinations\": [\n    {\n      \"city\": \"Cancún\",\n      \"country\": \"México\",\n      \"arrival_date\": \"2025-06-14\",\n      \"departure_date\": \"2025-06-16\"\n    }\n  ],\n  \"custom_guest_fields\": [\n    {\n      \"key\": \"crm\",\n      \"label\": \"CRM\",\n      \"type\": \"text\",\n      \"required\": true\n    },\n    {\n      \"key\": \"gender\",\n      \"label\": \"Sexo\",\n      \"type\": \"select\",\n      \"options\": [\n        \"Masculino\",\n        \"Feminino\",\n        \"Outro\"\n      ],\n      \"required\": false\n    }\n  ],\n  \"invitation_email_text\": \"Você foi convidado para participar deste evento exclusivo!\",\n  \"invitation_whatsapp_text\": \"Olá! Você foi convidado para o evento. Baixe o app para confirmar.\",\n  \"invitation_preferred_channel\": \"email\",\n  \"terms_and_conditions\": \"Ao confirmar presença, o participante declara estar ciente de que...\"\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/events",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "events"
              ]
            },
            "description": "Cria um novo evento.\n\n**Campos obrigatórios:**\n- `name` (máx. 200 caracteres)\n- `start_date` (ISO 8601)\n- `end_date` (ISO 8601, deve ser após start_date)\n\n**Status possíveis:** `upcoming`, `ongoing`, `completed`, `cancelled` (ciclo de vida temporal).\n\n**Publicação e visibilidade no app (`publish_status`):**\n- `draft` (default) — apenas convidados com role `organizer`/`admin`/`buyer` veem o evento no app. Use para configurar o evento, agenda, vouchers e testar antes de liberar para os convidados comuns.\n- `published` — convidados comuns (`role` = `guest`/`supplier`) passam a ver o evento, mas **apenas após o convite ser disparado** para eles (preenche `event_guests.invited_at`).\n\nQuando `publish_status` muda para `published`, `published_at` é preenchido automaticamente; quando volta para `draft`, é limpo. Veja as requisições \"Publicar Evento\" e \"Despublicar Evento\".\n\n**Logotipo do Comprador (`buyer_logo`):**\nURL do logotipo da empresa compradora. A imagem é automaticamente baixada e armazenada no storage interno, assim como `cover_image`. Será utilizado em disparos de emails personalizados.\n\n**Documentos obrigatórios (`required_guest_fields`):**\nArray de strings para exigir documentação dos convidados. Valores aceitos:\n- `passport` - Passaporte (número, emissão, validade)\n- `nationality` - Nacionalidade\n- `yellow_fever_vaccine` - Vacina de febre amarela\n- `visa` - Visto(s) (país e validade)\n- `rg` - RG\n\n**Destinos (`destinations`):**\nArray de objetos para informar destinos de viagem. Quando configurado, o app gera automaticamente um Guia do Destino com informações via IA.\nCada objeto deve ter: `city` (obrigatório), `country` (obrigatório), `arrival_date` (opcional), `departure_date` (opcional).\nEnvie `null` para remover.\n\n**Imagem de Capa (`cover_image`):**\n- **Dimensão recomendada:** 1200×630 pixels\n- **Formato:** JPG, PNG, GIF ou WebP\n- **Tamanho máximo:** 10MB\n\n**Armazenamento Automático de Imagens:**\nURLs externas são automaticamente baixadas e armazenadas no storage interno.\n\n**Cores:** Formato hex `#XXXXXX`\n\n**Resposta:**\nAlém do objeto `event`, inclui `landing_page_url`, `image_storage` e `logo_storage`.\n\n**Campos personalizados (`custom_guest_fields`):**\nArray de definições de campos personalizados. Cada item: `{ key, label, type, required, options? }`. Tipos: `text`, `number`, `date`, `select` (requer `options`). Respostas do convidado ficam em `custom_data` do perfil.\n\n**Termos e condições (`terms_and_conditions`):**\nTexto exibido no modal de convite. Convidado deve aceitar explicitamente. Data do aceite registrada em `terms_accepted_at`."
          },
          "response": [
            {
              "name": "Evento criado",
              "originalRequest": {
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"Tech Summit 2025\",\n  \"description\": \"O maior evento de tecnologia do ano\",\n  \"location\": \"Centro de Convenções, São Paulo\",\n  \"start_date\": \"2025-06-15T09:00:00Z\",\n  \"end_date\": \"2025-06-15T18:00:00Z\",\n  \"cover_image\": \"https://example.com/cover.jpg\",\n  \"status\": \"upcoming\"\n}"
                },
                "url": {
                  "raw": "{{base_url}}/backoffice-api/events",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "backoffice-api",
                    "events"
                  ]
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"event\": {\n    \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"name\": \"Tech Summit 2025\",\n    \"status\": \"upcoming\",\n    \"publish_status\": \"draft\",\n    \"published_at\": null,\n    \"cover_image\": \"https://uehduasxklqehnsvaomt.supabase.co/storage/v1/object/public/event-covers/550e8400.../1234567890_abc123.jpg\",\n    \"buyer_logo\": \"https://uehduasxklqehnsvaomt.supabase.co/storage/v1/object/public/event-covers/550e8400.../1234567891_def456.png\",\n    \"created_at\": \"2025-01-15T10:00:00Z\"\n  },\n  \"landing_page_url\": \"https://belvitureventos.lovable.app/e/550e8400-e29b-41d4-a716-446655440000\",\n  \"image_storage\": {\n    \"stored\": true,\n    \"original_url\": \"https://example.com/cover.jpg\"\n  },\n  \"logo_storage\": {\n    \"stored\": true,\n    \"original_url\": \"https://example.com/logo-abc.png\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Atualizar Evento",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Tech Summit 2025 - Edição Especial\",\n  \"status\": \"ongoing\",\n  \"description\": \"Descrição atualizada do evento\",\n  \"organizer_email\": \"eventos@techsummit.com.br\",\n  \"background_color\": \"#f0f9ff\",\n  \"gamification_enabled\": true,\n  \"photo_gallery_enabled\": true,\n  \"photo_gallery_public_upload\": false,\n  \"event_chat_enabled\": true,\n  \"networking_meetings_enabled\": true,\n  \"facematching_enabled\": true,\n  \"required_guest_fields\": [\"passport\", \"nationality\", \"yellow_fever_vaccine\", \"rg\"],\n  \"required_guest_document_uploads\": [\"passport\", \"yellow_fever_vaccine\"],\n  \"destinations\": [\n    { \"city\": \"Lisboa\", \"country\": \"Portugal\", \"arrival_date\": \"2025-06-14\", \"departure_date\": \"2025-06-17\" },\n    { \"city\": \"Porto\", \"country\": \"Portugal\", \"arrival_date\": \"2025-06-17\", \"departure_date\": \"2025-06-20\" }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/events/{{event_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "events",
                "{{event_id}}"
              ]
            },
            "description": "Atualiza um evento existente.\n\n**Aceita o mesmo payload do POST** — você pode reutilizar o body de criação. Campos não atualizáveis (`event_id` etc.) são silenciosamente ignorados.\n\n**Comportamento de campos:**\n- **Ausente**: mantém valor atual\n- **String vazia (`\"\"`)**: ignorado (mantém valor atual)\n- **`null`**: limpa o campo (apenas em campos nullable: `description`, `location`, `cover_image`, `latitude`, `longitude`, `destinations`, `custom_guest_fields`, `terms_and_conditions`, `invitation_*`, etc.)\n\n**Campos atualizáveis:** `name`, `description`, `start_date`, `end_date`, `location`, `cover_image`, `brand_color_primary`, `brand_color_secondary`, `background_color`, `status`, `organizer_name`, `organizer_email`, `buyer_name`, `buyer_logo`, `whatsapp_support`, `latitude`, `longitude`, `gamification_enabled`, `photo_gallery_enabled`, `photo_gallery_public_upload`, `event_chat_enabled`, `networking_meetings_enabled`, `facematching_enabled`, `required_guest_fields`, `required_guest_document_uploads`, `destinations`, `custom_guest_fields`, `terms_and_conditions`, `invitation_email_text`, `invitation_whatsapp_text`, `invitation_preferred_channel`\n\n**Toggles de funcionalidades (booleanos, default `false`):**\n- `gamification_enabled` — pontos, badges e leaderboard\n- `photo_gallery_enabled` — galeria de fotos do evento\n- `photo_gallery_public_upload` — permite convidados subirem fotos\n- `event_chat_enabled` — chat em tempo real do evento\n- `networking_meetings_enabled` — reuniões 1:1 entre convidados (slots de 30 min)\n- `facematching_enabled` — reconhecimento facial para identificar convidados em fotos\n\n**Validações preservadas:** Os mesmos validadores do POST são aplicados para cada campo enviado (formato de cor hex, datas ISO, lat/long em range, emails válidos, etc.)\n\n**Armazenamento automático:** Se `cover_image` for URL externa, a API baixa e armazena no storage interno."
          },
          "response": [
            {
              "name": "Evento atualizado",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [],
              "body": "{\n  \"event\": {\n    \"id\": \"uuid-evento\",\n    \"name\": \"Tech Summit 2025 - Edição Especial\",\n    \"status\": \"ongoing\",\n    \"updated_at\": \"2026-03-25T14:00:00Z\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Publicar Evento",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"publish_status\": \"published\"\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/events/{{event_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "events",
                "{{event_id}}"
              ]
            },
            "description": "Publica o evento. A partir desse momento, convidados com role `guest`/`supplier` cujo convite já foi disparado (`event_guests.invited_at` preenchido) passam a ver o evento no app.\n\nConvidados com role `organizer`/`admin`/`buyer` já enxergavam o evento mesmo em rascunho — esta requisição não muda nada para eles.\n\nO campo `published_at` é preenchido automaticamente com a data/hora atual.\n\n**Fluxo recomendado:**\n1. Criar evento (default `publish_status: draft`).\n2. Cadastrar convidados (`POST /guests`).\n3. Configurar agenda, vouchers, comunicação. Testar com usuários organizadores.\n4. **Publicar** (este endpoint).\n5. Disparar convites — cada disparo bem-sucedido preenche `invited_at` e libera o evento para o convidado correspondente."
          },
          "response": [
            {
              "name": "Evento publicado",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [],
              "body": "{\n  \"event\": {\n    \"id\": \"uuid-evento\",\n    \"publish_status\": \"published\",\n    \"published_at\": \"2026-03-25T14:00:00Z\",\n    \"updated_at\": \"2026-03-25T14:00:00Z\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Despublicar Evento (voltar para rascunho)",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"publish_status\": \"draft\"\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/events/{{event_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "events",
                "{{event_id}}"
              ]
            },
            "description": "Volta o evento para rascunho. Convidados comuns deixam imediatamente de ver o evento no app até a próxima publicação. Organizadores continuam vendo normalmente.\n\n`published_at` é limpo automaticamente. `event_guests.invited_at` **não é resetado** — quando o evento for republicado, todos os convidados que já receberam convite voltam a ver o evento sem precisar reenviar."
          },
          "response": []
        },
        {
          "name": "Cancelar Evento",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"cancelled\"\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/events/{{event_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "events",
                "{{event_id}}"
              ]
            },
            "description": "Cancela o evento. **Exclusivo da API** — o painel do organizador não expõe essa ação.\n\n**Efeitos no app:**\n- O evento aparece com badge **\"Cancelado\"** apenas para convidados já confirmados (`confirmed` ou `checked_in`).\n- Convidados ainda `pending` deixam de ver o evento.\n- Continua visível até a `end_date` (ou `start_date` quando não houver `end_date`); depois é ocultado.\n- O cron horário `update-event-status` **ignora eventos cancelados** — não há transição automática de volta para `upcoming`/`ongoing`/`past`. Use **Reativar Evento** para sair desse estado."
          },
          "response": [
            {
              "name": "Evento cancelado",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [],
              "body": "{\n  \"event\": {\n    \"id\": \"uuid-evento\",\n    \"status\": \"cancelled\",\n    \"updated_at\": \"2026-06-16T14:00:00Z\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Reativar Evento",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"upcoming\"\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/events/{{event_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "events",
                "{{event_id}}"
              ]
            },
            "description": "Reativa um evento que foi cancelado, devolvendo o status a `upcoming` (ou outro valor válido — `ongoing`, `completed`).\n\nApós a reativação, o cron horário `update-event-status` volta a normalizar o status automaticamente em função das datas (`start_date` / `end_date`). A visibilidade do evento volta ao comportamento normal — todos os convidados confirmados/pendentes voltam a vê-lo conforme as regras padrão."
          },
          "response": [
            {
              "name": "Evento reativado",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [],
              "body": "{\n  \"event\": {\n    \"id\": \"uuid-evento\",\n    \"status\": \"upcoming\",\n    \"updated_at\": \"2026-06-16T14:05:00Z\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Deletar Evento",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/events/{{event_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "events",
                "{{event_id}}"
              ]
            },
            "description": "Remove um evento permanentemente.\n\n⚠️ **Atenção:** Esta ação não pode ser desfeita."
          },
          "response": [
            {
              "name": "200 - Evento removido",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "👥 Guests",
      "description": "Gerenciamento de convidados (registrados e pendentes unificados). Desde v4.6.0, todos os endpoints retornam/operam em ambas as tabelas com flag `is_pending` para distinguir.",
      "item": [
        {
          "name": "Listar Todos os Convidados",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 200) {",
                  "    var jsonData = pm.response.json();",
                  "    if (jsonData.guests && jsonData.guests.length > 0) {",
                  "        pm.collectionVariables.set('guest_id', jsonData.guests[0].id);",
                  "        if (jsonData.guests[0].user_id) {",
                  "            pm.collectionVariables.set('user_id', jsonData.guests[0].user_id);",
                  "        }",
                  "    }",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/guests",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "guests"
              ]
            },
            "description": "Lista todos os convidados de todos os eventos (registrados + pendentes).\n\nDesde v4.6.0, inclui convidados pendentes com `is_pending: true`.\n\n**Filtros opcionais (query params):**\n- `event_id` — filtrar por evento\n- `external_id` — filtrar por ID externo (requer `event_id`)\n- `origin_id` — filtrar por ID original do pending_guest (requer `event_id`)"
          },
          "response": [
            {
              "name": "200 - Lista de convidados",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "[\n  {\n    \"id\": \"uuid-guest\",\n    \"user_id\": \"uuid-user\",\n    \"event_id\": \"uuid-event\",\n    \"role\": \"guest\",\n    \"status\": \"confirmed\",\n    \"external_id\": \"EXT-001\",\n    \"checked_in_at\": null,\n    \"confirmed_at\": \"2026-03-15T10:00:00Z\",\n    \"profile\": {\n      \"full_name\": \"João Silva\",\n      \"email\": \"joao@email.com\",\n      \"phone\": \"+5511999999999\",\n      \"cpf\": \"123.456.789-00\"\n    }\n  }\n]"
            }
          ]
        },
        {
          "name": "Listar Convidados por Evento",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 200) {",
                  "    var jsonData = pm.response.json();",
                  "    if (jsonData.guests && jsonData.guests.length > 0) {",
                  "        pm.collectionVariables.set('guest_id', jsonData.guests[0].id);",
                  "        if (jsonData.guests[0].user_id) {",
                  "            pm.collectionVariables.set('user_id', jsonData.guests[0].user_id);",
                  "        }",
                  "    }",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/guests?event_id={{event_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "guests"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                }
              ]
            },
            "description": "Lista todos os convidados de um evento (registrados + pendentes).\n\nConvidados registrados incluem `profiles` e `is_pending: false`.\nConvidados pendentes incluem `email`, `full_name`, `phone` e `is_pending: true`."
          },
          "response": [
            {
              "name": "Lista de convidados",
              "originalRequest": {
                "method": "GET",
                "url": {
                  "raw": "{{base_url}}/backoffice-api/guests?event_id={{event_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "backoffice-api",
                    "guests"
                  ],
                  "query": [
                    {
                      "key": "event_id",
                      "value": "{{event_id}}"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"guests\": [\n    {\n      \"id\": \"550e8400-e29b-41d4-a716-446655440001\",\n      \"event_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n      \"user_id\": \"550e8400-e29b-41d4-a716-446655440002\",\n      \"status\": \"confirmed\",\n      \"role\": \"guest\",\n      \"external_id\": \"ERP-123\",\n      \"pending_guest_origin_id\": \"550e8400-e29b-41d4-a716-446655440003\",\n      \"is_pending\": false,\n      \"confirmed_at\": \"2025-01-10T10:00:00Z\",\n      \"declined_at\": null,\n      \"checked_in_at\": null,\n      \"profiles\": {\n        \"id\": \"550e8400-e29b-41d4-a716-446655440002\",\n        \"full_name\": \"João Silva\",\n        \"email\": \"joao@email.com\",\n        \"phone\": \"+5511999999999\",\n        \"avatar_url\": null,\n        \"cpf\": \"12345678909\",\n        \"rg\": \"123456789\"\n      }\n    },\n    {\n      \"id\": \"550e8400-e29b-41d4-a716-446655440099\",\n      \"event_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n      \"user_id\": null,\n      \"status\": \"pending\",\n      \"role\": \"guest\",\n      \"external_id\": \"ERP-456\",\n      \"is_pending\": true,\n      \"email\": \"pendente@email.com\",\n      \"full_name\": \"Maria Pendente\",\n      \"phone\": \"+5511888888888\",\n      \"profiles\": null\n    }\n  ]\n}"
            }
          ]
        },
        {
          "name": "Obter Convidado por ID",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/guests/{{guest_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "guests",
                "{{guest_id}}"
              ]
            },
            "description": "Obtém os detalhes de um convidado específico.\n\nBusca primeiro em `event_guests`, se não encontrar busca em `pending_guests`.\nRetorna `is_pending: true/false` para indicar o tipo.\n\nAceita tanto IDs de convidados registrados quanto de pendentes."
          },
          "response": [
            {
              "name": "200 - Convidado encontrado",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-guest\",\n  \"user_id\": \"uuid-user\",\n  \"event_id\": \"uuid-event\",\n  \"role\": \"guest\",\n  \"status\": \"confirmed\",\n  \"external_id\": \"EXT-001\",\n  \"checked_in_at\": null,\n  \"confirmed_at\": \"2026-03-15T10:00:00Z\",\n  \"profile\": {\n    \"full_name\": \"João Silva\",\n    \"email\": \"joao@email.com\",\n    \"phone\": \"+5511999999999\",\n    \"cpf\": \"123.456.789-00\"\n  }\n}"
            },
            {
              "name": "404 - Não encontrado",
              "originalRequest": null,
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": \"Guest not found\"\n}"
            }
          ]
        },
        {
          "name": "Criar Convidado",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    var jsonData = pm.response.json();",
                  "    if (jsonData.guest) {",
                  "        pm.collectionVariables.set('guest_id', jsonData.guest.id);",
                  "        if (jsonData.guest.user_id) {",
                  "            pm.collectionVariables.set('user_id', jsonData.guest.user_id);",
                  "        }",
                  "        console.log('Usuário já registrado - vinculado ao evento');",
                  "    } else if (jsonData.pending_guest) {",
                  "        pm.collectionVariables.set('pending_guest_id', jsonData.pending_guest.id);",
                  "        console.log('Usuário não registrado - convite pendente criado');",
                  "    }",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"email\": \"convidado@email.com\",\n  \"full_name\": \"Nome do Convidado\",\n  \"phone\": \"+5511999999999\",\n  \"status\": \"pending\",\n  \"role\": \"guest\",\n  \"nfc_uid\": \"04:A2:B3:C4:D5:E6:F7\",\n  \"cpf\": \"12345678909\",\n  \"passport_number\": \"AB123456\",\n  \"external_id\": \"ERP-123\",\n  \"companions_allowed\": 2,\n  \"send_notification\": true,\n  \"custom_message\": \"Bem-vindo ao evento!\",\n  \"birth_date\": \"1990-05-15\",\n  \"rg\": \"12.345.678-9\",\n  \"is_foreigner\": false,\n  \"passport_issue_date\": \"2020-01-15\",\n  \"passport_expiry_date\": \"2030-01-15\",\n  \"nationality\": \"Brasileiro(a)\",\n  \"dietary_restrictions\": \"Vegetariano\",\n  \"mobility_restrictions\": \"Cadeirante\",\n  \"address_street\": \"Rua das Flores\",\n  \"address_number\": \"123\",\n  \"address_complement\": \"Apto 45\",\n  \"address_neighborhood\": \"Centro\",\n  \"address_city\": \"São Paulo\",\n  \"address_state\": \"SP\",\n  \"address_zip_code\": \"01234567\",\n  \"address_country\": \"Brasil\",\n  \"yellow_fever_vaccine_date\": \"2023-06-15\",\n  \"visa_number\": \"US12345\",\n  \"visa_expiry_date\": \"2027-06-15\",\n  \"visas\": [\n    { \"country\": \"Estados Unidos\", \"expiry_date\": \"2027-06-15\" },\n    { \"country\": \"Canadá\", \"expiry_date\": \"2028-03-20\" }\n  ],\n  \"preferred_language\": \"pt\",\n  \"custom_data\": {\n    \"crm_id\": \"CRM-456\",\n    \"sexo\": \"Masculino\",\n    \"nome_da_mae\": \"Ana da Silva\",\n    \"cargo\": \"Diretor Comercial\",\n    \"empresa\": \"Empresa ABC Ltda\",\n    \"tamanho_camiseta\": \"GG\"\n  }\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/guests",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "guests"
              ]
            },
            "description": "Adiciona um novo convidado a um evento.\n\n**Campos obrigatórios:**\n- `event_id` (UUID válido)\n- `email` (formato válido, máx. 255 caracteres)\n\n**Campos opcionais de evento:**\n- `full_name`, `phone`, `status`, `role`, `nfc_uid`, `cpf`, `passport_number`, `external_id`\n- `companions_allowed` (inteiro 0–50, default `0`) — quota de acompanhantes que o próprio convidado pode auto-cadastrar pelo app\n- `send_notification` (boolean, default: true)\n- `custom_message` (string, máx. 500 chars)\n\n**Campos opcionais de perfil:**\n- `birth_date` (YYYY-MM-DD), `rg`, `is_foreigner` (boolean)\n- `passport_issue_date`, `passport_expiry_date` (YYYY-MM-DD)\n- `nationality` (ex: Brasileiro(a))\n- `dietary_restrictions`, `mobility_restrictions`\n- `address_street`, `address_number`, `address_complement`, `address_neighborhood`, `address_city`, `address_state`, `address_zip_code`, `address_country`\n- `yellow_fever_vaccine_date` (YYYY-MM-DD)\n- `visa_number`, `visa_expiry_date` (YYYY-MM-DD)\n- `visas` (array de {country, expiry_date}) — múltiplos vistos\n- `preferred_language` (\"pt\", \"en\" ou \"es\")\n- `custom_data` (objeto JSON com pares chave-valor de campos personalizados)\n\n**Comportamento dos campos de perfil:**\n- Usuário registrado: salva diretamente no perfil\n- Pending guest: armazena em `profile_data` e aplica ao perfil no cadastro\n\n**Nome do convite preservado:** ao criar um pending guest, o `full_name` informado é gravado também em `invited_name` (imutável). Quando o convidado se registrar e atualizar seu nome, `full_name` reflete o nome final mas `invited_name` mantém o nome original enviado por esta API.\n\n**Auditoria:** toda alteração posterior de campos de perfil (via API, app ou backoffice) é registrada em `guest_profile_audit` com valor antigo, novo valor, origem e timestamp.\n\n**Busca de usuário existente (prioridade):**\n1. CPF → 2. Passaporte → 3. Email\n\n⚠️ A API NÃO cria usuários automaticamente."
          },
          "response": [
            {
              "name": "Convidado com perfil completo (usuário registrado)",
              "originalRequest": {
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"email\": \"joao.silva@empresa.com\",\n  \"full_name\": \"João Carlos da Silva\",\n  \"phone\": \"+5511987654321\",\n  \"status\": \"confirmed\",\n  \"role\": \"guest\",\n  \"cpf\": \"52998224725\",\n  \"passport_number\": \"FX987654\",\n  \"external_id\": \"ERP-2025-001\",\n  \"nfc_uid\": \"04:A2:B3:C4:D5:E6:F7\",\n  \"send_notification\": true,\n  \"custom_message\": \"Bem-vindo ao Tech Summit 2025!\",\n  \"birth_date\": \"1985-08-22\",\n  \"rg\": \"34.567.890-X\",\n  \"is_foreigner\": false,\n  \"passport_issue_date\": \"2021-03-10\",\n  \"passport_expiry_date\": \"2031-03-10\",\n  \"nationality\": \"Brasileiro(a)\",\n  \"dietary_restrictions\": \"Vegetariano, sem glúten\",\n  \"mobility_restrictions\": \"Nenhuma\",\n  \"address_street\": \"Av. Paulista\",\n  \"address_number\": \"1578\",\n  \"address_complement\": \"Sala 1201\",\n  \"address_neighborhood\": \"Bela Vista\",\n  \"address_city\": \"São Paulo\",\n  \"address_state\": \"SP\",\n  \"address_zip_code\": \"01310200\",\n  \"address_country\": \"Brasil\",\n  \"yellow_fever_vaccine_date\": \"2022-11-05\",\n  \"visa_number\": \"US-B1-789012\",\n  \"visa_expiry_date\": \"2028-11-05\",\n  \"visas\": [\n    { \"country\": \"Estados Unidos\", \"expiry_date\": \"2028-11-05\" },\n    { \"country\": \"Canadá\", \"expiry_date\": \"2029-02-15\" }\n  ],\n  \"preferred_language\": \"pt\",\n  \"custom_data\": {\n    \"crm_id\": \"CRM-456\",\n    \"sexo\": \"Masculino\",\n    \"nome_da_mae\": \"Maria José da Silva\",\n    \"cargo\": \"Diretor Comercial\",\n    \"empresa\": \"Tech Solutions Ltda\",\n    \"tamanho_camiseta\": \"G\"\n  }\n}"
                },
                "url": {
                  "raw": "{{base_url}}/backoffice-api/guests",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "backoffice-api",
                    "guests"
                  ]
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [],
              "body": "{\n  \"guest\": {\n    \"id\": \"550e8400-e29b-41d4-a716-446655440001\",\n    \"event_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"user_id\": \"550e8400-e29b-41d4-a716-446655440002\",\n    \"status\": \"confirmed\",\n    \"role\": \"guest\",\n    \"nfc_uid\": \"04:A2:B3:C4:D5:E6:F7\",\n    \"external_id\": \"ERP-2025-001\",\n    \"confirmed_at\": \"2026-03-25T14:30:00Z\",\n    \"profiles\": {\n      \"id\": \"550e8400-e29b-41d4-a716-446655440002\",\n      \"full_name\": \"João Carlos da Silva\",\n      \"email\": \"joao.silva@empresa.com\",\n      \"phone\": \"+5511987654321\",\n      \"cpf\": \"52998224725\",\n      \"rg\": \"34.567.890-X\",\n      \"birth_date\": \"1985-08-22\",\n      \"is_foreigner\": false,\n      \"passport_number\": \"FX987654\",\n      \"passport_issue_date\": \"2021-03-10\",\n      \"passport_expiry_date\": \"2031-03-10\",\n      \"nationality\": \"Brasileiro(a)\",\n      \"dietary_restrictions\": \"Vegetariano, sem glúten\",\n      \"mobility_restrictions\": \"Nenhuma\",\n      \"address_street\": \"Av. Paulista\",\n      \"address_number\": \"1578\",\n      \"address_complement\": \"Sala 1201\",\n      \"address_neighborhood\": \"Bela Vista\",\n      \"address_city\": \"São Paulo\",\n      \"address_state\": \"SP\",\n      \"address_zip_code\": \"01310200\",\n      \"address_country\": \"Brasil\",\n      \"yellow_fever_vaccine_date\": \"2022-11-05\",\n      \"visa_number\": \"US-B1-789012\",\n      \"visa_expiry_date\": \"2028-11-05\",\n      \"visas\": [\n        {\n          \"country\": \"Estados Unidos\",\n          \"expiry_date\": \"2028-11-05\"\n        },\n        {\n          \"country\": \"Canadá\",\n          \"expiry_date\": \"2029-02-15\"\n        }\n      ],\n      \"preferred_language\": \"pt\",\n      \"custom_data\": {\n        \"crm_id\": \"CRM-456\",\n        \"sexo\": \"Masculino\",\n        \"nome_da_mae\": \"Maria José da Silva\",\n        \"cargo\": \"Diretor Comercial\",\n        \"empresa\": \"Tech Solutions Ltda\",\n        \"tamanho_camiseta\": \"G\"\n      }\n    }\n  },\n  \"credential\": {\n    \"qr_code_data\": \"{\\\"guestId\\\":\\\"550e8400-e29b-41d4-a716-446655440002\\\",\\\"eventId\\\":\\\"550e8400-e29b-41d4-a716-446655440000\\\",\\\"name\\\":\\\"João Carlos da Silva\\\",\\\"email\\\":\\\"joao.silva@empresa.com\\\"}\",\n    \"qr_code_url\": \"https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=...\"\n  },\n  \"pending_registration\": false,\n  \"notification_sent\": false,\n  \"matched_by\": \"cpf\"\n}"
            },
            {
              "name": "Convidado com perfil completo (pendente - não registrado)",
              "originalRequest": {
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"email\": \"maria.santos@email.com\",\n  \"full_name\": \"Maria Helena dos Santos\",\n  \"phone\": \"+5521976543210\",\n  \"status\": \"pending\",\n  \"role\": \"supplier\",\n  \"cpf\": \"98765432100\",\n  \"passport_number\": \"GH456789\",\n  \"external_id\": \"FORNECEDOR-007\",\n  \"send_notification\": false,\n  \"birth_date\": \"1978-12-03\",\n  \"rg\": \"23.456.789-1\",\n  \"is_foreigner\": false,\n  \"passport_issue_date\": \"2022-07-20\",\n  \"passport_expiry_date\": \"2032-07-20\",\n  \"nationality\": \"Brasileiro(a)\",\n  \"dietary_restrictions\": \"Vegano\",\n  \"mobility_restrictions\": \"Cadeirante\",\n  \"address_street\": \"Rua Copacabana\",\n  \"address_number\": \"456\",\n  \"address_complement\": \"Bloco B, Apto 302\",\n  \"address_neighborhood\": \"Copacabana\",\n  \"address_city\": \"Rio de Janeiro\",\n  \"address_state\": \"RJ\",\n  \"address_zip_code\": \"22070010\",\n  \"address_country\": \"Brasil\",\n  \"yellow_fever_vaccine_date\": \"2023-01-20\",\n  \"visa_number\": \"UK-T5-123456\",\n  \"visa_expiry_date\": \"2027-08-30\",\n  \"visas\": [\n    { \"country\": \"Reino Unido\", \"expiry_date\": \"2027-08-30\" },\n    { \"country\": \"Alemanha\", \"expiry_date\": \"2028-05-10\" },\n    { \"country\": \"Japão\", \"expiry_date\": \"2026-12-01\" }\n  ],\n  \"preferred_language\": \"en\",\n  \"custom_data\": {\n    \"crm_id\": \"CRM-789\",\n    \"sexo\": \"Feminino\",\n    \"nome_da_mae\": \"Antônia dos Santos\",\n    \"cargo\": \"CEO\",\n    \"empresa\": \"Inovação Digital SA\",\n    \"tamanho_camiseta\": \"M\"\n  }\n}"
                },
                "url": {
                  "raw": "{{base_url}}/backoffice-api/guests",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "backoffice-api",
                    "guests"
                  ]
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [],
              "body": "{\n  \"pending_guest\": {\n    \"id\": \"550e8400-e29b-41d4-a716-446655440003\",\n    \"email\": \"maria.santos@email.com\",\n    \"full_name\": \"Maria Helena dos Santos\",\n    \"phone\": \"+5521976543210\",\n    \"event_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"role\": \"supplier\",\n    \"status\": \"pending\",\n    \"cpf\": \"98765432100\",\n    \"passport_number\": \"GH456789\",\n    \"nfc_uid\": null,\n    \"external_id\": \"FORNECEDOR-007\",\n    \"profile_data\": {\n      \"birth_date\": \"1978-12-03\",\n      \"rg\": \"23.456.789-1\",\n      \"is_foreigner\": false,\n      \"passport_issue_date\": \"2022-07-20\",\n      \"passport_expiry_date\": \"2032-07-20\",\n      \"nationality\": \"Brasileiro(a)\",\n      \"dietary_restrictions\": \"Vegano\",\n      \"mobility_restrictions\": \"Cadeirante\",\n      \"address_street\": \"Rua Copacabana\",\n      \"address_number\": \"456\",\n      \"address_complement\": \"Bloco B, Apto 302\",\n      \"address_neighborhood\": \"Copacabana\",\n      \"address_city\": \"Rio de Janeiro\",\n      \"address_state\": \"RJ\",\n      \"address_zip_code\": \"22070010\",\n      \"address_country\": \"Brasil\",\n      \"yellow_fever_vaccine_date\": \"2023-01-20\",\n      \"visa_number\": \"UK-T5-123456\",\n      \"visa_expiry_date\": \"2027-08-30\",\n      \"visas\": [\n        {\n          \"country\": \"Reino Unido\",\n          \"expiry_date\": \"2027-08-30\"\n        },\n        {\n          \"country\": \"Alemanha\",\n          \"expiry_date\": \"2028-05-10\"\n        },\n        {\n          \"country\": \"Japão\",\n          \"expiry_date\": \"2026-12-01\"\n        }\n      ],\n      \"preferred_language\": \"en\",\n      \"custom_data\": {\n        \"crm_id\": \"CRM-789\",\n        \"sexo\": \"Feminino\",\n        \"nome_da_mae\": \"Antônia dos Santos\",\n        \"cargo\": \"CEO\",\n        \"empresa\": \"Inovação Digital SA\",\n        \"tamanho_camiseta\": \"M\"\n      }\n    },\n    \"created_at\": \"2026-03-25T14:30:00Z\"\n  },\n  \"credential\": {\n    \"qr_code_data\": \"{\\\"pendingGuestId\\\":\\\"550e8400-e29b-41d4-a716-446655440003\\\",\\\"eventId\\\":\\\"550e8400-e29b-41d4-a716-446655440000\\\",\\\"name\\\":\\\"Maria Helena dos Santos\\\",\\\"email\\\":\\\"maria.santos@email.com\\\",\\\"pending\\\":true}\",\n    \"qr_code_url\": \"https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=...\"\n  },\n  \"pending_registration\": true,\n  \"message\": \"Guest invitation created. User will be linked to event when they register with this email.\",\n  \"notification_sent\": false\n}"
            },
            {
              "name": "Convidado estrangeiro com múltiplos vistos",
              "originalRequest": {
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"email\": \"john.smith@global.com\",\n  \"full_name\": \"John Robert Smith\",\n  \"phone\": \"+1-555-123-4567\",\n  \"status\": \"pending\",\n  \"role\": \"guest\",\n  \"passport_number\": \"US789012345\",\n  \"external_id\": \"GLOBAL-EMP-042\",\n  \"send_notification\": true,\n  \"birth_date\": \"1982-04-17\",\n  \"is_foreigner\": true,\n  \"passport_issue_date\": \"2023-02-01\",\n  \"passport_expiry_date\": \"2033-02-01\",\n  \"nationality\": \"Americano(a)\",\n  \"dietary_restrictions\": \"Sem lactose\",\n  \"mobility_restrictions\": null,\n  \"address_street\": \"123 Main Street\",\n  \"address_number\": \"123\",\n  \"address_complement\": \"Suite 500\",\n  \"address_neighborhood\": \"Downtown\",\n  \"address_city\": \"New York\",\n  \"address_state\": \"NY\",\n  \"address_zip_code\": \"10001\",\n  \"address_country\": \"Estados Unidos\",\n  \"yellow_fever_vaccine_date\": \"2024-01-10\",\n  \"visas\": [\n    { \"country\": \"Brasil\", \"expiry_date\": \"2027-12-31\" },\n    { \"country\": \"Argentina\", \"expiry_date\": \"2026-06-15\" }\n  ],\n  \"preferred_language\": \"en\",\n  \"custom_data\": {\n    \"department\": \"International Sales\",\n    \"employee_id\": \"NY-4200\"\n  }\n}"
                },
                "url": {
                  "raw": "{{base_url}}/backoffice-api/guests",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "backoffice-api",
                    "guests"
                  ]
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [],
              "body": "{\n  \"pending_guest\": {\n    \"id\": \"550e8400-e29b-41d4-a716-446655440010\",\n    \"email\": \"john.smith@global.com\",\n    \"full_name\": \"John Robert Smith\",\n    \"phone\": \"+1-555-123-4567\",\n    \"event_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"role\": \"guest\",\n    \"status\": \"pending\",\n    \"passport_number\": \"US789012345\",\n    \"external_id\": \"GLOBAL-EMP-042\",\n    \"profile_data\": {\n      \"birth_date\": \"1982-04-17\",\n      \"is_foreigner\": true,\n      \"passport_issue_date\": \"2023-02-01\",\n      \"passport_expiry_date\": \"2033-02-01\",\n      \"nationality\": \"Americano(a)\",\n      \"dietary_restrictions\": \"Sem lactose\",\n      \"address_street\": \"123 Main Street\",\n      \"address_number\": \"123\",\n      \"address_complement\": \"Suite 500\",\n      \"address_neighborhood\": \"Downtown\",\n      \"address_city\": \"New York\",\n      \"address_state\": \"NY\",\n      \"address_zip_code\": \"10001\",\n      \"address_country\": \"Estados Unidos\",\n      \"yellow_fever_vaccine_date\": \"2024-01-10\",\n      \"visas\": [\n        {\n          \"country\": \"Brasil\",\n          \"expiry_date\": \"2027-12-31\"\n        },\n        {\n          \"country\": \"Argentina\",\n          \"expiry_date\": \"2026-06-15\"\n        }\n      ],\n      \"preferred_language\": \"en\",\n      \"custom_data\": {\n        \"department\": \"International Sales\",\n        \"employee_id\": \"NY-4200\"\n      }\n    },\n    \"created_at\": \"2026-03-25T14:30:00Z\"\n  },\n  \"credential\": {\n    \"qr_code_data\": \"{\\\"pendingGuestId\\\":\\\"550e8400-e29b-41d4-a716-446655440010\\\",\\\"eventId\\\":\\\"550e8400-e29b-41d4-a716-446655440000\\\",\\\"name\\\":\\\"John Robert Smith\\\",\\\"email\\\":\\\"john.smith@global.com\\\",\\\"pending\\\":true}\",\n    \"qr_code_url\": \"https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=...\"\n  },\n  \"pending_registration\": true,\n  \"message\": \"Guest invitation created. User will be linked to event when they register with this email.\",\n  \"notification_sent\": false\n}"
            },
            {
              "name": "Convidado mínimo (apenas campos obrigatórios)",
              "originalRequest": {
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"email\": \"convidado.simples@email.com\"\n}"
                },
                "url": {
                  "raw": "{{base_url}}/backoffice-api/guests",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "backoffice-api",
                    "guests"
                  ]
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [],
              "body": "{\n  \"pending_guest\": {\n    \"id\": \"550e8400-e29b-41d4-a716-446655440020\",\n    \"email\": \"convidado.simples@email.com\",\n    \"full_name\": null,\n    \"phone\": null,\n    \"event_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"role\": \"guest\",\n    \"status\": \"pending\",\n    \"created_at\": \"2026-03-25T14:30:00Z\"\n  },\n  \"credential\": {\n    \"qr_code_data\": \"{\\\"pendingGuestId\\\":\\\"550e8400-e29b-41d4-a716-446655440020\\\",\\\"eventId\\\":\\\"550e8400-e29b-41d4-a716-446655440000\\\",\\\"email\\\":\\\"convidado.simples@email.com\\\",\\\"pending\\\":true}\",\n    \"qr_code_url\": \"https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=...\"\n  },\n  \"pending_registration\": true,\n  \"message\": \"Guest invitation created. User will be linked to event when they register with this email.\",\n  \"notification_sent\": false\n}"
            },
            {
              "name": "Convidado já convidado para o evento",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"email\": \"convidado@email.com\",\n  \"full_name\": \"Nome do Convidado\",\n  \"phone\": \"+5511999999999\",\n  \"status\": \"pending\",\n  \"role\": \"guest\",\n  \"nfc_uid\": \"04:A2:B3:C4:D5:E6:F7\",\n  \"cpf\": \"12345678909\",\n  \"passport_number\": \"AB123456\",\n  \"external_id\": \"ERP-123\",\n  \"send_notification\": true,\n  \"custom_message\": \"Bem-vindo ao evento!\",\n  \"birth_date\": \"1990-05-15\",\n  \"rg\": \"12.345.678-9\",\n  \"is_foreigner\": false,\n  \"passport_issue_date\": \"2020-01-15\",\n  \"passport_expiry_date\": \"2030-01-15\",\n  \"nationality\": \"Brasileiro(a)\",\n  \"dietary_restrictions\": \"Vegetariano\",\n  \"mobility_restrictions\": \"Cadeirante\",\n  \"address_street\": \"Rua das Flores\",\n  \"address_number\": \"123\",\n  \"address_complement\": \"Apto 45\",\n  \"address_neighborhood\": \"Centro\",\n  \"address_city\": \"São Paulo\",\n  \"address_state\": \"SP\",\n  \"address_zip_code\": \"01234567\",\n  \"address_country\": \"Brasil\",\n  \"yellow_fever_vaccine_date\": \"2023-06-15\",\n  \"visa_number\": \"US12345\",\n  \"visa_expiry_date\": \"2027-06-15\",\n  \"visas\": [\n    { \"country\": \"Estados Unidos\", \"expiry_date\": \"2027-06-15\" },\n    { \"country\": \"Canadá\", \"expiry_date\": \"2028-03-20\" }\n  ],\n  \"preferred_language\": \"pt\",\n  \"custom_data\": {\n    \"crm_id\": \"CRM-456\",\n    \"sexo\": \"Masculino\",\n    \"nome_da_mae\": \"Ana da Silva\",\n    \"cargo\": \"Diretor Comercial\",\n    \"empresa\": \"Empresa ABC Ltda\",\n    \"tamanho_camiseta\": \"GG\"\n  }\n}"
                },
                "url": {
                  "raw": "{{base_url}}/backoffice-api/guests",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "backoffice-api",
                    "guests"
                  ]
                },
                "description": "Adiciona um novo convidado a um evento.\n\n**Campos obrigatórios:**\n- `event_id` (UUID válido)\n- `email` (formato válido, máx. 255 caracteres)\n\n**Campos opcionais de evento:**\n- `full_name`, `phone`, `status`, `role`, `nfc_uid`, `cpf`, `passport_number`, `external_id`\n- `send_notification` (boolean, default: true)\n- `custom_message` (string, máx. 500 chars)\n\n**Campos opcionais de perfil:**\n- `birth_date` (YYYY-MM-DD), `rg`, `is_foreigner` (boolean)\n- `passport_issue_date`, `passport_expiry_date` (YYYY-MM-DD)\n- `nationality` (ex: Brasileiro(a))\n- `dietary_restrictions`, `mobility_restrictions`\n- `address_street`, `address_number`, `address_complement`, `address_neighborhood`, `address_city`, `address_state`, `address_zip_code`, `address_country`\n- `yellow_fever_vaccine_date` (YYYY-MM-DD)\n- `visa_number`, `visa_expiry_date` (YYYY-MM-DD)\n- `visas` (array de {country, expiry_date}) — múltiplos vistos\n- `preferred_language` (\"pt\", \"en\" ou \"es\")\n- `custom_data` (objeto JSON com pares chave-valor de campos personalizados)\n\n**Comportamento dos campos de perfil:**\n- Usuário registrado: salva diretamente no perfil\n- Pending guest: armazena em `profile_data` e aplica ao perfil no cadastro\n\n**Busca de usuário existente (prioridade):**\n1. CPF → 2. Passaporte → 3. Email\n\n⚠️ A API NÃO cria usuários automaticamente."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"guest\": {\n    \"id\": \"550e8400-e29b-41d4-a716-446655440001\",\n    \"event_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"user_id\": \"550e8400-e29b-41d4-a716-446655440002\",\n    \"status\": \"confirmed\",\n    \"role\": \"guest\",\n    \"external_id\": \"ERP-123\",\n    \"profiles\": {\n      \"full_name\": \"João Carlos da Silva\",\n      \"email\": \"joao.silva@empresa.com\"\n    }\n  },\n  \"credential\": {\n    \"qr_code_data\": \"{\\\"guestId\\\":\\\"550e8400-e29b-41d4-a716-446655440002\\\",\\\"eventId\\\":\\\"550e8400-e29b-41d4-a716-446655440000\\\",\\\"name\\\":\\\"João Carlos da Silva\\\",\\\"email\\\":\\\"joao.silva@empresa.com\\\"}\",\n    \"qr_code_url\": \"https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=...\"\n  },\n  \"already_invited\": true,\n  \"pending_registration\": false,\n  \"notification_sent\": false\n}"
            }
          ]
        },
        {
          "name": "Atualizar Convidado",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"role\": \"guest\",\n  \"status\": \"confirmed\",\n  \"external_id\": \"ERP-123\",\n  \"nfc_uid\": \"04:A2:B3:C4:D5:E6:F7\",\n  \"companions_allowed\": 3,\n  \"full_name\": \"Maria Silva (atualizado)\",\n  \"email\": \"maria.silva@empresa.com\",\n  \"phone\": \"+5511999998888\",\n  \"cpf\": \"12345678901\",\n  \"birth_date\": \"1990-05-15\",\n  \"nationality\": \"Brasileiro(a)\",\n  \"dietary_restrictions\": \"Vegetariano\",\n  \"address_city\": \"São Paulo\",\n  \"address_state\": \"SP\",\n  \"address_country\": \"Brasil\",\n  \"is_foreigner\": false,\n  \"passport_number\": null,\n  \"visas\": null\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/guests/{{guest_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "guests",
                "{{guest_id}}"
              ]
            },
            "description": "Atualiza um convidado registrado ou pendente.\n\n**Aceita o mesmo payload do POST** — campos identificadores (`event_id`, `user_id`) são silenciosamente ignorados.\n\n**Comportamento de campos:**\n- **Ausente**: mantém valor atual\n- **String vazia (`\"\"`)**: ignorado (mantém valor atual) — útil para integrações que enviam todos os campos sempre\n- **`null`**: limpa o campo (apenas em campos nullable: `cpf`, `passport_number`, `nfc_uid`, `external_id`, `visas`, etc.). Para `companions_allowed`, `null` redefine a quota para `0`.\n\n**Campos de evento:** `role`, `status`, `nfc_uid`, `external_id`, `companions_allowed` (inteiro 0–50)\n\n**Campos de perfil (todos opcionais):**\n`full_name`, `phone`, `email`, `cpf`, `passport_number`, `birth_date`, `rg`, `is_foreigner`, `passport_issue_date`, `passport_expiry_date`, `nationality`, `dietary_restrictions`, `mobility_restrictions`, `address_*`, `yellow_fever_vaccine_date`, `visa_number`, `visa_expiry_date`, `visas`\n\n**Comportamento:**\n- Registrados: campos de perfil atualizam `profiles` diretamente\n- Pendentes: campos de perfil atualizam `profile_data` (JSONB)\n- `invited_name` (nome original do convite) **nunca** é alterado por PUT — apenas `full_name` é atualizado.\n- Toda alteração de campos de perfil é registrada em `guest_profile_audit` com origem `api`, valor antigo, valor novo e timestamp.\n\n**Comportamento automático de status:**\n- `status: confirmed` → define `confirmed_at`\n- `status: declined` → define `declined_at`\n- `status: checked_in` → define `checked_in_at`"
          },
          "response": [
            {
              "name": "Convidado atualizado",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [],
              "body": "{\n  \"guest\": {\n    \"id\": \"uuid-guest\",\n    \"event_id\": \"uuid-evento\",\n    \"user_id\": \"uuid-user\",\n    \"status\": \"confirmed\",\n    \"role\": \"supplier\",\n    \"nfc_uid\": \"04:A2:B3:C4:D5:E6:F7\",\n    \"updated_at\": \"2026-03-25T14:00:00Z\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Deletar Convidado",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/guests/{{guest_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "guests",
                "{{guest_id}}"
              ]
            },
            "description": "Remove um convidado de um evento.\n\nAceita tanto IDs de `event_guests` quanto de `pending_guests`.\n\nAo deletar um pending guest, também remove:\n- Vouchers associados via `pending_guest_email`\n- Links de acompanhantes (`companion_links`)"
          },
          "response": [
            {
              "name": "200 - Convidado removido",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true\n}"
            }
          ]
        },
        {
          "name": "Buscar Convidado por External ID",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/guests?event_id={{event_id}}&external_id=ERP-123",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "guests"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                },
                {
                  "key": "external_id",
                  "value": "ERP-123"
                }
              ]
            },
            "description": "Busca convidados por `external_id` (ID do sistema externo).\n\n**Requer:** `event_id`\n\nRetorna tanto convidados registrados quanto pendentes que possuam o `external_id` informado."
          },
          "response": [
            {
              "name": "200 - Convidado encontrado",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-guest\",\n  \"user_id\": \"uuid-user\",\n  \"event_id\": \"uuid-event\",\n  \"role\": \"guest\",\n  \"status\": \"confirmed\",\n  \"external_id\": \"EXT-001\",\n  \"checked_in_at\": null,\n  \"confirmed_at\": \"2026-03-15T10:00:00Z\",\n  \"profile\": {\n    \"full_name\": \"João Silva\",\n    \"email\": \"joao@email.com\",\n    \"phone\": \"+5511999999999\",\n    \"cpf\": \"123.456.789-00\"\n  }\n}"
            },
            {
              "name": "404 - Não encontrado",
              "originalRequest": null,
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": \"Guest not found with this external_id\"\n}"
            }
          ]
        },
        {
          "name": "Buscar Convidado por Origin ID",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/guests?event_id={{event_id}}&origin_id={{pending_guest_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "guests"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                },
                {
                  "key": "origin_id",
                  "value": "{{pending_guest_id}}"
                }
              ]
            },
            "description": "Busca convidados registrados pelo ID original do pending_guest (`pending_guest_origin_id`).\n\n**Requer:** `event_id`\n\nÚtil para rastrear um convidado que já se registrou a partir do ID que ele tinha quando era pendente."
          },
          "response": [
            {
              "name": "200 - Convidado encontrado",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-guest\",\n  \"user_id\": \"uuid-user\",\n  \"event_id\": \"uuid-event\",\n  \"role\": \"guest\",\n  \"status\": \"confirmed\",\n  \"external_id\": \"EXT-001\",\n  \"checked_in_at\": null,\n  \"confirmed_at\": \"2026-03-15T10:00:00Z\",\n  \"profile\": {\n    \"full_name\": \"João Silva\",\n    \"email\": \"joao@email.com\",\n    \"phone\": \"+5511999999999\",\n    \"cpf\": \"123.456.789-00\"\n  }\n}"
            },
            {
              "name": "404 - Não encontrado",
              "originalRequest": null,
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": \"Guest not found with this origin_id\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "👤 Profiles",
      "description": "Consulta e atualização de dados pessoais dos convidados. Inclui documentos internacionais, nacionalidade, endereço e vistos.",
      "item": [
        {
          "name": "Listar Perfis por Evento",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/profiles?event_id={{event_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "profiles"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                }
              ]
            },
            "description": "Lista os perfis completos de todos os convidados de um evento.\n\nInclui dados pessoais, documentos (passaporte, RG, vacina, vistos, nacionalidade) e endereço."
          },
          "response": [
            {
              "name": "Perfis com dados completos",
              "originalRequest": {
                "method": "GET",
                "url": {
                  "raw": "{{base_url}}/backoffice-api/profiles?event_id={{event_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "backoffice-api",
                    "profiles"
                  ],
                  "query": [
                    {
                      "key": "event_id",
                      "value": "{{event_id}}"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"guests\": [\n    {\n      \"id\": \"uuid-guest\",\n      \"event_id\": \"uuid-event\",\n      \"user_id\": \"uuid-user\",\n      \"role\": \"guest\",\n      \"status\": \"confirmed\",\n      \"profiles\": {\n        \"id\": \"uuid-user\",\n        \"full_name\": \"João Silva\",\n        \"email\": \"joao@email.com\",\n        \"phone\": \"+5511999999999\",\n        \"cpf\": \"12345678909\",\n        \"birth_date\": \"1990-05-15\",\n        \"nationality\": \"Brasileiro(a)\",\n        \"passport_number\": \"AB123456\",\n        \"passport_issue_date\": \"2020-01-15\",\n        \"passport_expiry_date\": \"2030-01-15\",\n        \"yellow_fever_vaccine_date\": \"2023-03-20\",\n        \"rg\": \"12.345.678-9\",\n        \"visas\": [{\"country\": \"Estados Unidos\", \"expiry_date\": \"2027-06-15\"}],\n        \"address_city\": \"São Paulo\",\n        \"address_state\": \"SP\",\n        \"address_country\": \"Brasil\",\n        \"dietary_restrictions\": \"Vegetariano\",\n        \"mobility_restrictions\": null\n      }\n    }\n  ]\n}"
            }
          ]
        },
        {
          "name": "Obter Perfil por User ID",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/profiles/{{user_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "profiles",
                "{{user_id}}"
              ]
            },
            "description": "Obtém o perfil completo de um usuário específico, incluindo nacionalidade, documentos e vistos."
          },
          "response": [
            {
              "name": "200 - Perfil encontrado",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-user\",\n  \"full_name\": \"João Silva\",\n  \"email\": \"joao@email.com\",\n  \"phone\": \"+5511999999999\",\n  \"cpf\": \"123.456.789-00\"\n}"
            }
          ]
        },
        {
          "name": "Consultar Documentos Pendentes",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/profiles/missing-documents?event_id={{event_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "profiles",
                "missing-documents"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                }
              ]
            },
            "description": "Retorna todos os convidados de um evento que possuem documentos obrigatórios faltantes ou pendentes.\n\n**Requer:** O evento deve ter `required_guest_fields` configurado.\n\n**Campos da resposta:**\n- `summary` - Resumo geral com contagem por campo\n- `summary.by_field[field].missing` - Quantidade sem o documento\n- `summary.by_field[field].pending` - Quantidade que marcou 'Ainda não tenho'\n- `guests[].missing_fields` - Campos faltantes do convidado\n- `guests[].pending_fields` - Campos marcados como pendentes\n\n**Nota:** Campos com valor `__pending__` indicam que o convidado selecionou 'Ainda não tenho' no app e poderá preencher depois."
          },
          "response": [
            {
              "name": "Documentos pendentes encontrados",
              "originalRequest": {
                "method": "GET",
                "url": {
                  "raw": "{{base_url}}/backoffice-api/profiles/missing-documents?event_id={{event_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "backoffice-api",
                    "profiles",
                    "missing-documents"
                  ],
                  "query": [
                    {
                      "key": "event_id",
                      "value": "{{event_id}}"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"event_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"event_name\": \"Conferência Internacional 2026\",\n  \"required_fields\": [\"passport\", \"nationality\", \"yellow_fever_vaccine\", \"visa\"],\n  \"summary\": {\n    \"total_guests\": 50,\n    \"guests_with_missing\": 12,\n    \"guests_complete\": 38,\n    \"by_field\": {\n      \"passport\": { \"missing\": 8, \"pending\": 5 },\n      \"nationality\": { \"missing\": 3, \"pending\": 0 },\n      \"yellow_fever_vaccine\": { \"missing\": 10, \"pending\": 7 },\n      \"visa\": { \"missing\": 6, \"pending\": 4 }\n    }\n  },\n  \"guests\": [\n    {\n      \"user_id\": \"uuid-user-1\",\n      \"role\": \"guest\",\n      \"status\": \"confirmed\",\n      \"full_name\": \"João Silva\",\n      \"email\": \"joao@email.com\",\n      \"phone\": \"+5511999999999\",\n      \"missing_fields\": [\"passport\", \"yellow_fever_vaccine\"],\n      \"pending_fields\": [\"passport\"],\n      \"has_all_documents\": false\n    }\n  ]\n}"
            }
          ]
        },
        {
          "name": "Buscar Perfil por External ID",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/profiles/by-external-id?external_id=ERP-123&event_id={{event_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "profiles",
                "by-external-id"
              ],
              "query": [
                {
                  "key": "external_id",
                  "value": "ERP-123"
                },
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                }
              ]
            },
            "description": "Busca unificada de perfil por `external_id`.\n\n**Requer:** `external_id` e `event_id`\n\nBusca primeiro em `event_guests`, depois em `pending_guests`.\n\nRetorna:\n- Perfil completo se o convidado já se registrou\n- Dados parciais do `pending_guests` se ainda não tem conta\n- `status`: `registered` ou `pending`"
          },
          "response": [
            {
              "name": "Perfil encontrado (registrado)",
              "originalRequest": {
                "method": "GET",
                "url": {
                  "raw": "{{base_url}}/backoffice-api/profiles/by-external-id?external_id=ERP-123&event_id={{event_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "backoffice-api",
                    "profiles",
                    "by-external-id"
                  ],
                  "query": [
                    {
                      "key": "external_id",
                      "value": "ERP-123"
                    },
                    {
                      "key": "event_id",
                      "value": "{{event_id}}"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"status\": \"registered\",\n  \"guest_id\": \"uuid-event-guest\",\n  \"external_id\": \"ERP-123\",\n  \"pending_guest_origin_id\": \"uuid-pending-original\",\n  \"profile\": {\n    \"id\": \"uuid-user\",\n    \"full_name\": \"João Silva\",\n    \"email\": \"joao@email.com\",\n    \"phone\": \"+5511999999999\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Atualizar Perfil",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"full_name\": \"Nome Completo Atualizado\",\n  \"email\": \"novo@email.com\",\n  \"phone\": \"+5511999999999\",\n  \"cpf\": \"12345678909\",\n  \"rg\": \"12.345.678-9\",\n  \"birth_date\": \"1990-05-15\",\n  \"passport_number\": \"AB123456\",\n  \"passport_issue_date\": \"2020-01-15\",\n  \"passport_expiry_date\": \"2030-01-15\",\n  \"is_foreigner\": false,\n  \"nationality\": \"Brasileiro(a)\",\n  \"dietary_restrictions\": \"Vegetariano\",\n  \"mobility_restrictions\": null,\n  \"address_street\": \"Rua das Flores\",\n  \"address_number\": \"123\",\n  \"address_complement\": \"Apto 45\",\n  \"address_neighborhood\": \"Centro\",\n  \"address_city\": \"São Paulo\",\n  \"address_state\": \"SP\",\n  \"address_zip_code\": \"01234567\",\n  \"address_country\": \"Brasil\",\n  \"yellow_fever_vaccine_date\": \"2023-06-15\",\n  \"visa_number\": \"US12345\",\n  \"visa_expiry_date\": \"2027-06-15\",\n  \"visas\": [\n    { \"country\": \"Estados Unidos\", \"expiry_date\": \"2027-06-15\" }\n  ],\n  \"preferred_language\": \"pt\"\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/profiles/{{user_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "profiles",
                "{{user_id}}"
              ]
            },
            "description": "Atualiza o perfil completo de um usuário.\n\n**Escopo necessário:** `write` ou `profiles:write`\n\n**Todos os campos são opcionais:**\n- `full_name`, `email`, `phone`\n- `cpf` (validado como CPF brasileiro, 11 dígitos)\n- `rg` (Registro Geral)\n- `birth_date` (YYYY-MM-DD)\n- `passport_number`, `passport_issue_date`, `passport_expiry_date` (YYYY-MM-DD)\n- `is_foreigner` (boolean)\n- `nationality` (ex: Brasileiro(a))\n- `dietary_restrictions`, `mobility_restrictions`\n- `address_street`, `address_number`, `address_complement`, `address_neighborhood`, `address_city`, `address_state`, `address_zip_code`, `address_country`\n- `yellow_fever_vaccine_date` (YYYY-MM-DD)\n- `visa_number`, `visa_expiry_date` (YYYY-MM-DD)\n- `visas` (array de {country, expiry_date})\n- `preferred_language` (pt, en, es)\n\nTodos os campos aceitam `null` para limpar o valor."
          },
          "response": [
            {
              "name": "Perfil atualizado",
              "originalRequest": {
                "method": "PUT",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"full_name\": \"João Silva Atualizado\",\n  \"birth_date\": \"1990-05-15\",\n  \"nationality\": \"Brasileiro(a)\",\n  \"dietary_restrictions\": \"Vegano\"\n}"
                },
                "url": {
                  "raw": "{{base_url}}/backoffice-api/profiles/{{user_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "backoffice-api",
                    "profiles",
                    "{{user_id}}"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"profile\": {\n    \"id\": \"550e8400-e29b-41d4-a716-446655440002\",\n    \"full_name\": \"João Silva Atualizado\",\n    \"email\": \"joao@email.com\",\n    \"phone\": \"+5511999999999\",\n    \"cpf\": \"12345678909\",\n    \"rg\": \"12.345.678-9\",\n    \"birth_date\": \"1990-05-15\",\n    \"nationality\": \"Brasileiro(a)\",\n    \"passport_number\": \"AB123456\",\n    \"passport_issue_date\": \"2020-01-15\",\n    \"passport_expiry_date\": \"2030-01-15\",\n    \"is_foreigner\": false,\n    \"dietary_restrictions\": \"Vegano\",\n    \"mobility_restrictions\": null,\n    \"address_street\": \"Rua das Flores\",\n    \"address_number\": \"123\",\n    \"address_complement\": \"Apto 45\",\n    \"address_neighborhood\": \"Centro\",\n    \"address_city\": \"São Paulo\",\n    \"address_state\": \"SP\",\n    \"address_zip_code\": \"01234567\",\n    \"address_country\": \"Brasil\",\n    \"yellow_fever_vaccine_date\": \"2023-06-15\",\n    \"visa_number\": \"US12345\",\n    \"visa_expiry_date\": \"2027-06-15\",\n    \"visas\": [{\"country\": \"Estados Unidos\", \"expiry_date\": \"2027-06-15\"}],\n    \"created_at\": \"2025-01-01T10:00:00Z\",\n    \"updated_at\": \"2025-01-15T14:30:00Z\"\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "⏳ Pending Guests",
      "description": "Consulta de convidados pendentes de registro.\n\n**Nota:** Convidados pendentes são criados automaticamente via `POST /guests` quando o email informado não corresponde a nenhum usuário cadastrado. Este endpoint serve apenas para **consulta e exclusão** de registros pendentes.\n\nQuando o convidado criar conta no app usando o mesmo email, ele será automaticamente vinculado aos eventos e removido desta lista.",
      "item": [
        {
          "name": "Listar Convidados Pendentes",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 200) {",
                  "    var jsonData = pm.response.json();",
                  "    if (jsonData.pending_guests && jsonData.pending_guests.length > 0) {",
                  "        pm.collectionVariables.set('pending_guest_id', jsonData.pending_guests[0].id);",
                  "    }",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/pending-guests",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "pending-guests"
              ]
            },
            "description": "Lista todos os convidados pendentes de registro."
          },
          "response": [
            {
              "name": "Lista de convidados pendentes",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"pending_guests\": [\n    {\n      \"id\": \"550e8400-e29b-41d4-a716-446655440003\",\n      \"email\": \"novo.convidado@email.com\",\n      \"full_name\": \"Nome do Convidado\",\n      \"phone\": \"+5511999999999\",\n      \"event_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n      \"role\": \"guest\",\n      \"status\": \"pending\",\n      \"created_at\": \"2025-01-15T10:00:00Z\",\n      \"updated_at\": \"2025-01-15T10:00:00Z\"\n    }\n  ]\n}"
            }
          ]
        },
        {
          "name": "Listar Convidados Pendentes por Evento",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/pending-guests?event_id={{event_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "pending-guests"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                }
              ]
            },
            "description": "Lista todos os convidados pendentes de um evento específico."
          },
          "response": [
            {
              "name": "200 - Lista",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "[\n  {\n    \"id\": \"uuid-pending\",\n    \"email\": \"novo@email.com\",\n    \"full_name\": \"Novo Convidado\",\n    \"event_id\": \"uuid-event\",\n    \"role\": \"guest\",\n    \"status\": \"pending\",\n    \"external_id\": \"EXT-002\"\n  }\n]"
            }
          ]
        },
        {
          "name": "Obter Convidado Pendente por ID",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/pending-guests/{{pending_guest_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "pending-guests",
                "{{pending_guest_id}}"
              ]
            },
            "description": "Obtém os detalhes de um convidado pendente específico."
          },
          "response": [
            {
              "name": "200 - Encontrado",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-pending\",\n  \"email\": \"novo@email.com\",\n  \"full_name\": \"Novo Convidado\",\n  \"event_id\": \"uuid-event\",\n  \"role\": \"guest\",\n  \"status\": \"pending\",\n  \"external_id\": \"EXT-002\"\n}"
            }
          ]
        },
        {
          "name": "Deletar Convite Pendente",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/pending-guests/{{pending_guest_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "pending-guests",
                "{{pending_guest_id}}"
              ]
            },
            "description": "Remove um convite pendente.\n\nUse quando quiser cancelar um convite antes do usuário se registrar no app."
          },
          "response": [
            {
              "name": "200 - Removido",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "🎫 Vouchers",
      "description": "Gerenciamento de vouchers (voos, hotéis, transfers, alimentação, camisetas)",
      "item": [
        {
          "name": "Listar Todos os Vouchers",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 200) {",
                  "    var jsonData = pm.response.json();",
                  "    if (jsonData.vouchers && jsonData.vouchers.length > 0) {",
                  "        pm.collectionVariables.set('voucher_id', jsonData.vouchers[0].id);",
                  "    }",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers"
              ]
            },
            "description": "Lista todos os vouchers."
          },
          "response": [
            {
              "name": "200 - Vouchers listados",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "[\n  {\n    \"id\": \"uuid-voucher\",\n    \"event_id\": \"uuid-event\",\n    \"type\": \"flight\",\n    \"title\": \"Voo SP → RJ\",\n    \"status\": \"active\",\n    \"valid_from\": \"2026-06-15T06:00:00Z\",\n    \"valid_to\": \"2026-06-15T10:00:00Z\",\n    \"details\": {},\n    \"guests\": [\n      {\n        \"user_id\": \"uuid-user\",\n        \"full_name\": \"João Silva\",\n        \"email\": \"joao@email.com\"\n      }\n    ],\n    \"created_at\": \"2026-03-15T10:00:00Z\"\n  }\n]"
            }
          ]
        },
        {
          "name": "Listar Vouchers por Evento",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers?event_id={{event_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                }
              ]
            },
            "description": "Lista todos os vouchers de um evento."
          },
          "response": [
            {
              "name": "200 - Vouchers listados",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "[\n  {\n    \"id\": \"uuid-voucher\",\n    \"event_id\": \"uuid-event\",\n    \"type\": \"flight\",\n    \"title\": \"Voo SP → RJ\",\n    \"status\": \"active\",\n    \"valid_from\": \"2026-06-15T06:00:00Z\",\n    \"valid_to\": \"2026-06-15T10:00:00Z\",\n    \"details\": {},\n    \"guests\": [\n      {\n        \"user_id\": \"uuid-user\",\n        \"full_name\": \"João Silva\",\n        \"email\": \"joao@email.com\"\n      }\n    ],\n    \"created_at\": \"2026-03-15T10:00:00Z\"\n  }\n]"
            }
          ]
        },
        {
          "name": "Listar Vouchers por Usuário",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers?user_id={{user_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers"
              ],
              "query": [
                {
                  "key": "user_id",
                  "value": "{{user_id}}"
                }
              ]
            },
            "description": "Lista todos os vouchers de um usuário específico."
          },
          "response": [
            {
              "name": "200 - Vouchers listados",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "[\n  {\n    \"id\": \"uuid-voucher\",\n    \"event_id\": \"uuid-event\",\n    \"type\": \"flight\",\n    \"title\": \"Voo SP → RJ\",\n    \"status\": \"active\",\n    \"valid_from\": \"2026-06-15T06:00:00Z\",\n    \"valid_to\": \"2026-06-15T10:00:00Z\",\n    \"details\": {},\n    \"guests\": [\n      {\n        \"user_id\": \"uuid-user\",\n        \"full_name\": \"João Silva\",\n        \"email\": \"joao@email.com\"\n      }\n    ],\n    \"created_at\": \"2026-03-15T10:00:00Z\"\n  }\n]"
            }
          ]
        },
        {
          "name": "Listar Vouchers Pendentes",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers?event_id={{event_id}}&requires_guest_input=true",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                },
                {
                  "key": "requires_guest_input",
                  "value": "true"
                }
              ]
            },
            "description": "Lista vouchers que aguardam preenchimento pelo convidado."
          },
          "response": [
            {
              "name": "200 - Vouchers listados",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "[\n  {\n    \"id\": \"uuid-voucher\",\n    \"event_id\": \"uuid-event\",\n    \"type\": \"flight\",\n    \"title\": \"Voo SP → RJ\",\n    \"status\": \"active\",\n    \"valid_from\": \"2026-06-15T06:00:00Z\",\n    \"valid_to\": \"2026-06-15T10:00:00Z\",\n    \"details\": {},\n    \"guests\": [\n      {\n        \"user_id\": \"uuid-user\",\n        \"full_name\": \"João Silva\",\n        \"email\": \"joao@email.com\"\n      }\n    ],\n    \"created_at\": \"2026-03-15T10:00:00Z\"\n  }\n]"
            }
          ]
        },
        {
          "name": "Obter Voucher por ID",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers/{{voucher_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers",
                "{{voucher_id}}"
              ]
            },
            "description": "Obtém detalhes de um voucher, incluindo anexos."
          },
          "response": [
            {
              "name": "Voucher com guests e anexos",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [],
              "body": "{\n  \"voucher\": {\n    \"id\": \"uuid-voucher\",\n    \"event_id\": \"uuid-evento\",\n    \"title\": \"Voo GRU → MIA - Ida\",\n    \"type\": \"flight\",\n    \"code\": \"LATAM-ABC123\",\n    \"status\": \"active\",\n    \"valid_from\": \"2026-06-15T00:00:00Z\",\n    \"valid_to\": \"2026-06-15T23:59:59Z\",\n    \"details\": {\n      \"segments\": [\n        {\n          \"origin\": \"GRU\",\n          \"destination\": \"MIA\",\n          \"airline\": \"LATAM\",\n          \"flight_number\": \"LA8068\"\n        }\n      ],\n      \"class\": \"Executiva\",\n      \"locator\": \"ABC123\"\n    },\n    \"voucher_guests\": [\n      {\n        \"id\": \"uuid-vg-1\",\n        \"user_id\": \"uuid-user-1\",\n        \"pending_guest_email\": null,\n        \"status\": \"active\",\n        \"allocated_by\": null,\n        \"declined_at\": null\n      },\n      {\n        \"id\": \"uuid-vg-2\",\n        \"user_id\": null,\n        \"pending_guest_email\": \"pendente@email.com\",\n        \"status\": \"active\",\n        \"allocated_by\": null,\n        \"declined_at\": null\n      }\n    ],\n    \"attachments\": [],\n    \"created_at\": \"2026-03-25T10:00:00Z\",\n    \"updated_at\": \"2026-03-25T10:00:00Z\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Criar Voucher - Voo",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    var jsonData = pm.response.json();",
                  "    if (jsonData.voucher) {",
                  "        pm.collectionVariables.set(\"voucher_id\", jsonData.voucher.id);",
                  "        if (jsonData.voucher.voucher_guests && jsonData.voucher.voucher_guests.length > 0) {",
                  "            pm.collectionVariables.set(\"voucher_guest_id\", jsonData.voucher.voucher_guests[0].id);",
                  "        }",
                  "    }",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"guests\": [\n    {\n      \"user_id\": \"{{user_id}}\"\n    }\n  ],\n  \"title\": \"Voo GRU → MIA - Ida\",\n  \"description\": \"Passagem aérea São Paulo para Miami via Santiago\",\n  \"code\": \"LATAM-ABC123\",\n  \"type\": \"flight\",\n  \"status\": \"active\",\n  \"valid_from\": \"2026-06-15T00:00:00Z\",\n  \"valid_to\": \"2026-06-15T23:59:59Z\",\n  \"details\": {\n    \"segments\": [\n      {\n        \"origin\": \"GRU\",\n        \"destination\": \"MIA\",\n        \"departure_date\": \"15/06/2026\",\n        \"departure_time\": \"22:00\",\n        \"arrival_time\": \"10:30 (+1)\",\n        \"airline\": \"LATAM\",\n        \"flight_number\": \"LA8068\",\n        \"duration\": \"12h30\",\n        \"layovers\": [\n          {\n            \"airport\": \"SCL\",\n            \"duration\": \"2h15\",\n            \"flight_number\": \"LA531\",\n            \"departure_time\": \"03:30\",\n            \"arrival_time\": \"10:30\"\n          }\n        ]\n      }\n    ],\n    \"class\": \"Executiva\",\n    \"passengers\": \"1 adulto\",\n    \"baggage\": \"2x23kg\",\n    \"locator\": \"ABC123\",\n    \"seat\": \"14A\",\n    \"aircraft\": \"Boeing 787-9\",\n    \"terminal\": \"3\",\n    \"gate\": \"B12\",\n    \"meal\": \"Refeição completa\",\n    \"frequent_flyer\": \"LATAM Pass 123456\",\n    \"check_in_url\": \"https://www.latamairlines.com/br/pt/check-in\"\n  }\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers"
              ]
            },
            "description": "Cria um voucher de passagem aérea. Use `segments[]` para definir trechos do voo. Voos diretos usam `layovers: []` (ou omitem). Voos com escala incluem `layovers[]` no segmento.\n\n**Formato principal:** Use `guests[]` para vincular convidados. Cada item pode ter `{ \"user_id\": \"uuid\" }` ou `{ \"email\": \"email@exemplo.com\" }`.\n\n**Nota sobre email:** Se o convidado não tem cadastro, é armazenado como pendente e vinculado automaticamente ao se cadastrar.\n\n**Boas práticas:** Crie um voucher para ida e outro para volta.\n\n**Campos opcionais no details:**\n- `seat` - Assento (ex: \"14A\")\n- `aircraft` - Aeronave (ex: \"Boeing 787-9\")\n- `terminal` - Terminal de embarque\n- `gate` - Portão de embarque\n- `meal` - Refeição incluída\n- `frequent_flyer` - Programa de fidelidade\n- `check_in_url` - URL para check-in online"
          },
          "response": [
            {
              "name": "201 - Voucher criado",
              "originalRequest": null,
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-voucher\",\n  \"event_id\": \"uuid-event\",\n  \"type\": \"flight\",\n  \"title\": \"Voo SP → RJ\",\n  \"status\": \"active\",\n  \"valid_from\": \"2026-06-15T06:00:00Z\",\n  \"valid_to\": \"2026-06-15T10:00:00Z\",\n  \"details\": {},\n  \"guests\": [\n    {\n      \"user_id\": \"uuid-user\",\n      \"full_name\": \"João Silva\",\n      \"email\": \"joao@email.com\"\n    }\n  ],\n  \"created_at\": \"2026-03-15T10:00:00Z\"\n}"
            }
          ]
        },
        {
          "name": "Criar Voucher - Hotel",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Hotel Copacabana Palace\",\n  \"description\": \"Hospedagem 3 diárias - Suíte Deluxe\",\n  \"code\": \"CP-789456\",\n  \"type\": \"hotel\",\n  \"status\": \"active\",\n  \"valid_from\": \"2025-03-15T00:00:00Z\",\n  \"valid_to\": \"2025-03-18T23:59:59Z\",\n  \"details\": {\n    \"hotel_name\": \"Copacabana Palace\",\n    \"address\": \"Av. Atlântica, 1702 - Copacabana, Rio de Janeiro\",\n    \"check_in\": \"2025-03-15T15:00:00Z\",\n    \"check_out\": \"2025-03-18T12:00:00Z\",\n    \"room_type\": \"Suíte Deluxe Vista Mar\",\n    \"guests\": \"2 adultos\",\n    \"nights\": \"3 noites\",\n    \"breakfast\": \"Café da manhã buffet incluso\",\n    \"amenities\": \"Wi-Fi, Piscina, Spa, Academia\",\n    \"reservation_code\": \"CP-789456\",\n    \"phone\": \"+55 21 2548-7070\",\n    \"floor\": \"8º andar - Vista Mar\",\n    \"late_checkout\": \"Disponível mediante solicitação\",\n    \"minibar\": \"Incluso\",\n    \"parking\": \"Estacionamento valet incluso\",\n    \"wifi_password\": \"COPA2025VIP\",\n    \"online_check_in_url\": \"https://hotel.com/checkin/CP-789456\"\n  },\n  \"guests\": [\n    {\n      \"user_id\": \"{{user_id}}\"\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers"
              ]
            },
            "description": "Cria um voucher de hospedagem informativo ou com preenchimento pelo convidado.\n\n**⚠️ Para gestão de quartos e rooming list**, use `POST /hotel-reservations` com `rooms[]` ao invés deste endpoint.\n\nUse este endpoint quando:\n- O voucher é apenas informativo (dados do hotel para consulta)\n- O convidado deve preencher os dados (`requires_guest_input: true`)\n\n**Formato principal:** Use `guests[]` para vincular convidados.\n\n**⚠️ Importante:** Use formato ISO com horário nos campos `check_in` e `check_out` (ex: `2025-03-15T15:00:00Z`).\n\n**Campos de details:**\n- `hotel_name`, `address`, `check_in`, `check_out`, `room_type`, `guests`, `nights`, `breakfast`, `amenities`, `reservation_code`, `phone`, `floor`, `wifi_password`, `online_check_in_url`"
          },
          "response": [
            {
              "name": "201 - Voucher criado",
              "originalRequest": null,
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-voucher\",\n  \"event_id\": \"uuid-event\",\n  \"type\": \"hotel\",\n  \"title\": \"Voo SP → RJ\",\n  \"status\": \"active\",\n  \"valid_from\": \"2026-06-15T06:00:00Z\",\n  \"valid_to\": \"2026-06-15T10:00:00Z\",\n  \"details\": {},\n  \"guests\": [\n    {\n      \"user_id\": \"uuid-user\",\n      \"full_name\": \"João Silva\",\n      \"email\": \"joao@email.com\"\n    }\n  ],\n  \"created_at\": \"2026-03-15T10:00:00Z\"\n}"
            }
          ]
        },
        {
          "name": "Criar Voucher - Transfer",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Transfer Aeroporto → Hotel\",\n  \"description\": \"Transporte executivo do aeroporto ao hotel\",\n  \"code\": \"TRF-001\",\n  \"type\": \"transport\",\n  \"status\": \"active\",\n  \"valid_from\": \"2025-03-15T00:00:00Z\",\n  \"valid_to\": \"2025-03-15T23:59:59Z\",\n  \"details\": {\n    \"date\": \"2025-03-15\",\n    \"pickup_time\": \"10:15\",\n    \"pickup_location\": \"Terminal 8 - Saída A, Porta 3\",\n    \"pickup_latitude\": -22.9104,\n    \"pickup_longitude\": -43.1631,\n    \"dropoff_location\": \"Hotel Copacabana Palace - Av. Atlântica, 1702\",\n    \"dropoff_latitude\": -22.9659,\n    \"dropoff_longitude\": -43.1729,\n    \"vehicle\": \"Mercedes E-Class Preto\",\n    \"company\": \"Rio Executive Transfer\",\n    \"driver_name\": \"Carlos Oliveira\",\n    \"driver_contact\": \"+5521998765432\",\n    \"license_plate\": \"RIO-VIP-2025\",\n    \"estimated_duration\": \"35 minutos\",\n    \"amenities\": \"Água, Wi-Fi, carregador USB\",\n    \"notes\": \"Motorista estará com placa no nome do passageiro\",\n    \"booking_reference\": \"TRF-98271\"\n  },\n  \"guests\": [\n    {\n      \"user_id\": \"{{user_id}}\"\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers"
              ]
            },
            "description": "Cria um voucher de transfer com informações completas.\n\n**⚠️ Importante:** Use formato ISO com horário no campo `pickup_time` (ex: `2025-03-15T10:15:00Z`). A data e o horário são extraídos automaticamente.\n\n**Campos de details:**\n- `pickup_location` / `dropoff_location` - Locais de embarque e desembarque\n- `pickup_latitude` / `pickup_longitude` - Coordenadas do embarque (abre link de mapa)\n- `dropoff_latitude` / `dropoff_longitude` - Coordenadas do desembarque\n- `pickup_time` - Data/hora do embarque (formato ISO)\n- `vehicle` - Descrição do veículo\n- `company` - Nome da empresa de transporte\n- `driver_name` - Nome do motorista\n- `driver_contact` - Telefone do motorista (clicável: ligação e WhatsApp)\n- `license_plate` - Placa do veículo\n- `estimated_duration` - Duração estimada do trajeto\n- `amenities` - Comodidades no veículo\n- `notes` - Observações\n- `booking_reference` - Código da reserva"
          },
          "response": [
            {
              "name": "201 - Voucher criado",
              "originalRequest": null,
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-voucher\",\n  \"event_id\": \"uuid-event\",\n  \"type\": \"transfer\",\n  \"title\": \"Voo SP → RJ\",\n  \"status\": \"active\",\n  \"valid_from\": \"2026-06-15T06:00:00Z\",\n  \"valid_to\": \"2026-06-15T10:00:00Z\",\n  \"details\": {},\n  \"guests\": [\n    {\n      \"user_id\": \"uuid-user\",\n      \"full_name\": \"João Silva\",\n      \"email\": \"joao@email.com\"\n    }\n  ],\n  \"created_at\": \"2026-03-15T10:00:00Z\"\n}"
            }
          ]
        },
        {
          "name": "Criar Voucher - Alimentação",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Jantar de Gala\",\n  \"description\": \"Jantar de encerramento do evento\",\n  \"code\": \"MEAL-001\",\n  \"type\": \"meal\",\n  \"status\": \"active\",\n  \"requires_usage_control\": true,\n  \"valid_from\": \"2025-03-16T00:00:00Z\",\n  \"valid_to\": \"2025-03-16T23:59:59Z\",\n  \"details\": {\n    \"restaurant\": \"Cipriani - Copacabana Palace\",\n    \"address\": \"Av. Atlântica, 1702 - Copacabana, Rio de Janeiro\",\n    \"venue\": \"Marina da Glória\",\n    \"date\": \"16/03/2025\",\n    \"time\": \"20:00\",\n    \"duration\": \"Aproximadamente 3 horas\",\n    \"guests\": \"2\",\n    \"meal_type\": \"Jantar de Gala - Menu Degustação\",\n    \"menu_type\": \"Menu degustação 7 pratos\",\n    \"chef\": \"Chef Thomas Keller\",\n    \"speaker\": \"Palestra do CEO - Visão 2027\",\n    \"dress_code\": \"Traje social (Black Tie opcional)\",\n    \"wine_pairing\": \"Harmonização de vinhos inclusa\",\n    \"open_bar\": true,\n    \"table_reservation\": \"Mesa 12 - Salão Principal\",\n    \"dietary_notes\": \"Consultar restrições alimentares\",\n    \"parking\": \"Valet no hotel\",\n    \"phone\": \"+55 21 2548-7070\",\n    \"latitude\": -22.9068,\n    \"longitude\": -43.1729\n  },\n  \"guests\": [\n    {\n      \"user_id\": \"{{user_id}}\"\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers"
              ]
            },
            "description": "Cria um voucher de refeição com todos os campos disponíveis.\n\n**Campos de details:**\n- `restaurant` - Nome do restaurante\n- `address` - Endereço do restaurante\n- `venue` - Nome do local/espaço (alternativo ao restaurante)\n- `date` - Data da refeição (formato livre)\n- `time` - Horário da reserva (ex: \"20:00\")\n- `duration` - Duração estimada\n- `guests` - Quantidade de pessoas\n- `meal_type` - Tipo de refeição/menu\n- `menu_type` - Tipo de menu detalhado\n- `chef` - Nome do chef\n- `speaker` - Palestrante durante a refeição\n- `dress_code` - Código de vestimenta\n- `wine_pairing` - Info sobre harmonização de vinhos\n- `open_bar` (boolean) - Se inclui open bar\n- `table_reservation` - Mesa ou sala reservada\n- `dietary_notes` - Notas sobre restrições alimentares\n- `parking` - Info de estacionamento\n- `phone` - Telefone de contato (clicável: ligação e WhatsApp)\n- `latitude` / `longitude` - Coordenadas para link de mapa"
          },
          "response": [
            {
              "name": "201 - Voucher criado",
              "originalRequest": null,
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-voucher\",\n  \"event_id\": \"uuid-event\",\n  \"type\": \"meal\",\n  \"title\": \"Voo SP → RJ\",\n  \"status\": \"active\",\n  \"valid_from\": \"2026-06-15T06:00:00Z\",\n  \"valid_to\": \"2026-06-15T10:00:00Z\",\n  \"details\": {},\n  \"guests\": [\n    {\n      \"user_id\": \"uuid-user\",\n      \"full_name\": \"João Silva\",\n      \"email\": \"joao@email.com\"\n    }\n  ],\n  \"created_at\": \"2026-03-15T10:00:00Z\"\n}"
            }
          ]
        },
        {
          "name": "Criar Voucher - Camiseta",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Camiseta do Evento 2025\",\n  \"description\": \"Retire sua camiseta exclusiva do evento\",\n  \"type\": \"shirt\",\n  \"code\": \"SHIRT-001\",\n  \"valid_from\": \"2025-03-15T00:00:00Z\",\n  \"valid_to\": \"2025-03-17T23:59:59Z\",\n  \"requires_guest_input\": true,\n  \"requires_usage_control\": true,\n  \"details\": {\n    \"brand\": \"Nike\",\n    \"collection\": \"Coleção Exclusiva Evento 2025\",\n    \"color\": \"Azul Marinho\",\n    \"material\": \"100% Algodão Pima\",\n    \"customization\": \"Nome bordado nas costas\",\n    \"includes\": \"Camiseta + Sacola ecológica + Adesivos\",\n    \"type_options\": [\n      \"Tradicional\",\n      \"Baby Look\",\n      \"Polo\"\n    ],\n    \"size_options\": [\n      \"PP\",\n      \"P\",\n      \"M\",\n      \"G\",\n      \"GG\",\n      \"XGG\"\n    ],\n    \"pickup_location_options\": [\n      \"Credenciamento A\",\n      \"Credenciamento B\",\n      \"Loja do Evento\"\n    ],\n    \"pickup_start_date\": \"2025-03-15\",\n    \"pickup_start_time\": \"08:00\",\n    \"pickup_end_date\": \"2025-03-17\",\n    \"pickup_end_time\": \"18:00\"\n  },\n  \"guests\": [\n    {\n      \"user_id\": \"{{user_id}}\"\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers"
              ]
            },
            "description": "Cria um voucher de camiseta/kit com opções de modelo, tamanho e local de retirada.\n\nO convidado escolherá suas preferências no app.\n\n**Campos de details:**\n- `brand` - Marca da camiseta\n- `collection` - Nome da coleção\n- `color` - Cor\n- `material` - Material/composição\n- `customization` - Tipo de personalização\n- `includes` - Itens inclusos no kit\n- `type_options` (string[]) - Opções de modelo para o convidado escolher\n- `size_options` (string[]) - Opções de tamanho disponíveis\n- `pickup_location_options` (string[]) - Opções de local de retirada\n- `pickup_start_date` / `pickup_start_time` - Início da retirada\n- `pickup_end_date` / `pickup_end_time` - Fim da retirada\n\n**Campos preenchidos pelo convidado (automáticos):**\n- `selected_type` - Modelo escolhido\n- `selected_size` - Tamanho escolhido\n- `selected_pickup_location` - Local de retirada escolhido"
          },
          "response": [
            {
              "name": "201 - Voucher criado",
              "originalRequest": null,
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-voucher\",\n  \"event_id\": \"uuid-event\",\n  \"type\": \"tshirt\",\n  \"title\": \"Voo SP → RJ\",\n  \"status\": \"active\",\n  \"valid_from\": \"2026-06-15T06:00:00Z\",\n  \"valid_to\": \"2026-06-15T10:00:00Z\",\n  \"details\": {},\n  \"guests\": [\n    {\n      \"user_id\": \"uuid-user\",\n      \"full_name\": \"João Silva\",\n      \"email\": \"joao@email.com\"\n    }\n  ],\n  \"created_at\": \"2026-03-15T10:00:00Z\"\n}"
            }
          ]
        },
        {
          "name": "Criar Voucher - Pendente (Convidado Preenche)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Voo São Paulo → Rio de Janeiro\",\n  \"type\": \"flight\",\n  \"code\": \"PENDENTE-VOO-001\",\n  \"valid_from\": \"2025-03-15T00:00:00Z\",\n  \"valid_to\": \"2025-03-15T23:59:59Z\",\n  \"requires_guest_input\": true,\n  \"guests\": [\n    {\n      \"user_id\": \"{{user_id}}\"\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers"
              ]
            },
            "description": "Cria um voucher \"vazio\" para o convidado preencher no app.\n\nÚtil quando o convidado adquire seus próprios serviços."
          },
          "response": [
            {
              "name": "201 - Voucher criado",
              "originalRequest": null,
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-voucher\",\n  \"event_id\": \"uuid-event\",\n  \"type\": \"pending_input\",\n  \"title\": \"Voo SP → RJ\",\n  \"status\": \"active\",\n  \"valid_from\": \"2026-06-15T06:00:00Z\",\n  \"valid_to\": \"2026-06-15T10:00:00Z\",\n  \"details\": {},\n  \"guests\": [\n    {\n      \"user_id\": \"uuid-user\",\n      \"full_name\": \"João Silva\",\n      \"email\": \"joao@email.com\"\n    }\n  ],\n  \"created_at\": \"2026-03-15T10:00:00Z\"\n}"
            }
          ]
        },
        {
          "name": "Criar Voucher - Pré-Seleção de Voo",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Escolha seu voo - São Paulo → Rio de Janeiro\",\n  \"description\": \"Selecione a opção de voo que melhor atende suas necessidades\",\n  \"type\": \"pre_flight\",\n  \"code\": \"PRE-FLIGHT-001\",\n  \"valid_from\": \"2025-03-15T00:00:00Z\",\n  \"valid_to\": \"2025-03-15T23:59:59Z\",\n  \"details\": {\n    \"options\": [\n      {\n        \"id\": \"opt-1\",\n        \"title\": \"Voo Manhã - LATAM LA3021\",\n        \"description\": \"Saída às 06:30, chegada às 07:45\",\n        \"details\": {\n          \"segments\": [\n            {\n              \"origin\": \"GRU\",\n              \"destination\": \"SDU\",\n              \"departure_date\": \"15/03/2025\",\n              \"departure_time\": \"06:30\",\n              \"arrival_time\": \"07:45\",\n              \"airline\": \"LATAM\",\n              \"flight_number\": \"LA3021\"\n            }\n          ]\n        }\n      },\n      {\n        \"id\": \"opt-2\",\n        \"title\": \"Voo Tarde - GOL G3 1234\",\n        \"description\": \"Saída às 14:00, chegada às 15:15\",\n        \"details\": {\n          \"segments\": [\n            {\n              \"origin\": \"GRU\",\n              \"destination\": \"SDU\",\n              \"departure_date\": \"15/03/2025\",\n              \"departure_time\": \"14:00\",\n              \"arrival_time\": \"15:15\",\n              \"airline\": \"GOL\",\n              \"flight_number\": \"G3 1234\"\n            }\n          ]\n        }\n      },\n      {\n        \"id\": \"opt-3\",\n        \"title\": \"Voo Noite - AZUL AD 4567\",\n        \"description\": \"Saída às 20:00, chegada às 21:15\",\n        \"details\": {\n          \"segments\": [\n            {\n              \"origin\": \"GRU\",\n              \"destination\": \"SDU\",\n              \"departure_date\": \"15/03/2025\",\n              \"departure_time\": \"20:00\",\n              \"arrival_time\": \"21:15\",\n              \"airline\": \"AZUL\",\n              \"flight_number\": \"AD 4567\"\n            }\n          ]\n        }\n      }\n    ]\n  },\n  \"guests\": [\n    {\n      \"user_id\": \"{{user_id}}\"\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers"
              ]
            },
            "description": "Cria um voucher de pré-seleção de voo com múltiplas opções.\n\nO convidado recebe notificação e escolhe uma opção no app. Após a escolha, o voucher é convertido automaticamente para tipo 'flight' com os detalhes da opção selecionada e `reservation_status: pending_reservation`.\n\n**Tipos:** `pre_flight` (voos), `pre_hotel` (hospedagem), `pre_rental_car` (carro alugado)\n\n**Comportamento:**\n- Convidado recebe notificação push/in-app\n- Modal exibe todas as opções + \"Nenhuma das opções\"\n- Se rejeitar, deve informar motivo\n- Escolha válida converte automaticamente o voucher\n- Voucher convertido recebe `reservation_status: pending_reservation`\n\n**Fluxo operacional:**\n1. Convidado escolhe → voucher convertido com `pending_reservation`\n2. Operação confirma: PUT /vouchers/{id} com `reservation_status: confirmed`"
          },
          "response": [
            {
              "name": "201 - Voucher criado",
              "originalRequest": null,
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-voucher\",\n  \"event_id\": \"uuid-event\",\n  \"type\": \"pre_flight\",\n  \"title\": \"Voo SP → RJ\",\n  \"status\": \"active\",\n  \"valid_from\": \"2026-06-15T06:00:00Z\",\n  \"valid_to\": \"2026-06-15T10:00:00Z\",\n  \"details\": {},\n  \"guests\": [\n    {\n      \"user_id\": \"uuid-user\",\n      \"full_name\": \"João Silva\",\n      \"email\": \"joao@email.com\"\n    }\n  ],\n  \"created_at\": \"2026-03-15T10:00:00Z\"\n}"
            }
          ]
        },
        {
          "name": "Criar Voucher - Pré-Seleção de Hotel",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Escolha seu hotel - Rio de Janeiro\",\n  \"description\": \"Selecione a opção de hospedagem que prefere\",\n  \"type\": \"pre_hotel\",\n  \"code\": \"PRE-HOTEL-001\",\n  \"valid_from\": \"2025-03-15T00:00:00Z\",\n  \"valid_to\": \"2025-03-18T23:59:59Z\",\n  \"details\": {\n    \"options\": [\n      {\n        \"id\": \"hotel-1\",\n        \"title\": \"Copacabana Palace - Suíte Deluxe\",\n        \"description\": \"Vista mar, café da manhã incluso\",\n        \"details\": {\n          \"hotel_name\": \"Copacabana Palace\",\n          \"address\": \"Av. Atlântica, 1702 - Copacabana\",\n          \"room_type\": \"Suíte Deluxe Vista Mar\",\n          \"breakfast\": \"Incluso\"\n        }\n      },\n      {\n        \"id\": \"hotel-2\",\n        \"title\": \"Windsor Atlantica - Standard\",\n        \"description\": \"Quarto standard, café da manhã incluso\",\n        \"details\": {\n          \"hotel_name\": \"Windsor Atlantica\",\n          \"address\": \"Av. Atlântica, 1020 - Copacabana\",\n          \"room_type\": \"Standard\",\n          \"breakfast\": \"Incluso\"\n        }\n      }\n    ]\n  },\n  \"guests\": [\n    {\n      \"user_id\": \"{{user_id}}\"\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers"
              ]
            },
            "description": "Cria um voucher de pré-seleção de hotel com múltiplas opções.\n\nFunciona da mesma forma que pre_flight, mas é convertido para tipo 'hotel' após a escolha."
          },
          "response": [
            {
              "name": "201 - Voucher criado",
              "originalRequest": null,
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-voucher\",\n  \"event_id\": \"uuid-event\",\n  \"type\": \"pre_hotel\",\n  \"title\": \"Voo SP → RJ\",\n  \"status\": \"active\",\n  \"valid_from\": \"2026-06-15T06:00:00Z\",\n  \"valid_to\": \"2026-06-15T10:00:00Z\",\n  \"details\": {},\n  \"guests\": [\n    {\n      \"user_id\": \"uuid-user\",\n      \"full_name\": \"João Silva\",\n      \"email\": \"joao@email.com\"\n    }\n  ],\n  \"created_at\": \"2026-03-15T10:00:00Z\"\n}"
            }
          ]
        },
        {
          "name": "Criar Voucher - Pré-Seleção de Carro Alugado",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Escolha seu carro alugado - Rio de Janeiro\",\n  \"description\": \"Selecione a opção de carro alugado que prefere\",\n  \"type\": \"pre_rental_car\",\n  \"code\": \"PRE-CAR-001\",\n  \"valid_from\": \"2025-03-15T00:00:00Z\",\n  \"valid_to\": \"2025-03-18T23:59:59Z\",\n  \"details\": {\n    \"options\": [\n      {\n        \"id\": \"car-1\",\n        \"title\": \"Localiza - Toyota Corolla\",\n        \"description\": \"Sedan intermediário, ar condicionado, automático\",\n        \"details\": {\n          \"rental_company\": \"Localiza\",\n          \"car_model\": \"Toyota Corolla\",\n          \"car_category\": \"Sedan Intermediário\",\n          \"insurance\": \"Cobertura Total\"\n        }\n      },\n      {\n        \"id\": \"car-2\",\n        \"title\": \"Unidas - VW T-Cross\",\n        \"description\": \"SUV compacto, ar condicionado, automático\",\n        \"details\": {\n          \"rental_company\": \"Unidas\",\n          \"car_model\": \"VW T-Cross\",\n          \"car_category\": \"SUV Compacto\",\n          \"insurance\": \"Cobertura Total\"\n        }\n      }\n    ]\n  },\n  \"guests\": [\n    {\n      \"user_id\": \"{{user_id}}\"\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers"
              ]
            },
            "description": "Cria um voucher de pré-seleção de carro alugado com múltiplas opções.\n\nFunciona da mesma forma que pre_flight, mas é convertido para tipo 'rental_car' após a escolha."
          },
          "response": [
            {
              "name": "201 - Voucher criado",
              "originalRequest": null,
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-voucher\",\n  \"event_id\": \"uuid-event\",\n  \"type\": \"pre_rental_car\",\n  \"title\": \"Voo SP → RJ\",\n  \"status\": \"active\",\n  \"valid_from\": \"2026-06-15T06:00:00Z\",\n  \"valid_to\": \"2026-06-15T10:00:00Z\",\n  \"details\": {},\n  \"guests\": [\n    {\n      \"user_id\": \"uuid-user\",\n      \"full_name\": \"João Silva\",\n      \"email\": \"joao@email.com\"\n    }\n  ],\n  \"created_at\": \"2026-03-15T10:00:00Z\"\n}"
            }
          ]
        },
        {
          "name": "Criar Voucher de Passeio/Lazer",
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"City Tour Histórico\",\n  \"description\": \"Passeio guiado pelo centro histórico da cidade\",\n  \"type\": \"leisure\",\n  \"code\": \"TOUR-001\",\n  \"valid_from\": \"2025-03-16T00:00:00Z\",\n  \"valid_to\": \"2025-03-16T23:59:59Z\",\n  \"details\": {\n    \"activity_name\": \"City Tour Histórico\",\n    \"location\": \"Centro Histórico\",\n    \"address\": \"Praça XV de Novembro, s/n\",\n    \"date\": \"16/03/2025\",\n    \"time\": \"09:00\",\n    \"duration\": \"3 horas\",\n    \"meeting_point\": \"Lobby do Hotel\",\n    \"meeting_point_latitude\": -22.905,\n    \"meeting_point_longitude\": -43.175,\n    \"company_name\": \"Brasil Tours Ltda\",\n    \"guide_name\": \"Carlos Mendes\",\n    \"guide\": \"Guia bilíngue Inglês/Português\",\n    \"contact_phone\": \"+55 21 99999-0000\",\n    \"group_size\": \"Máximo 15 pessoas\",\n    \"route\": \"Centro → Lapa → Santa Teresa\",\n    \"included\": \"Transporte, guia bilíngue, água\",\n    \"dress_code\": \"Roupas confortáveis\",\n    \"what_to_bring\": \"Protetor solar, câmera, garrafa d'água\",\n    \"accessibility\": \"Acesso adaptado disponível\",\n    \"weight_limit\": \"Peso máximo: 120kg\",\n    \"cancellation_policy\": \"Cancelamento gratuito até 48h antes\",\n    \"weather_policy\": \"Tour ocorre com chuva leve, reprogramação em caso de chuva forte\",\n    \"notes\": \"Usar calçado confortável e protetor solar\",\n    \"reservation_code\": \"TOUR-001\",\n    \"latitude\": -22.9068,\n    \"longitude\": -43.1729\n  },\n  \"guests\": [\n    {\n      \"user_id\": \"{{user_id}}\"\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers"
              ]
            },
            "description": "Cria um voucher de passeio ou lazer com todos os campos disponíveis.\n\n**Campos de details:**\n- `activity_name` - Nome da atividade ou passeio\n- `location` - Local da atividade\n- `address` - Endereço completo\n- `date` - Data (formato livre)\n- `time` - Horário de início (ex: \"09:00\")\n- `duration` - Duração estimada\n- `meeting_point` - Ponto de encontro (destacado no app)\n- `meeting_point_latitude` / `meeting_point_longitude` - Coordenadas do ponto de encontro\n- `company_name` - Nome da empresa operadora\n- `guide_name` - Nome do guia responsável\n- `guide` - Descrição do tipo de guia\n- `contact_phone` - Telefone de contato (clicável: ligação e WhatsApp)\n- `group_size` - Tamanho máximo do grupo\n- `route` - Rota ou percurso\n- `included` - O que está incluso\n- `dress_code` - Traje recomendado\n- `what_to_bring` - O que levar\n- `accessibility` - Info de acessibilidade\n- `weight_limit` - Limite de peso\n- `cancellation_policy` - Política de cancelamento\n- `weather_policy` - Política para clima\n- `notes` - Observações\n- `reservation_code` - Código de reserva\n- `venue` - Nome do local/estabelecimento (para ingressos)\n- `sector` - Setor (para ingressos)\n- `seat` - Assento ou área\n- `gate` - Portão de entrada\n- `latitude` / `longitude` - Coordenadas do local"
          },
          "response": [
            {
              "name": "201 - Voucher criado",
              "originalRequest": null,
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-voucher\",\n  \"event_id\": \"uuid-event\",\n  \"type\": \"leisure\",\n  \"title\": \"Voo SP → RJ\",\n  \"status\": \"active\",\n  \"valid_from\": \"2026-06-15T06:00:00Z\",\n  \"valid_to\": \"2026-06-15T10:00:00Z\",\n  \"details\": {},\n  \"guests\": [\n    {\n      \"user_id\": \"uuid-user\",\n      \"full_name\": \"João Silva\",\n      \"email\": \"joao@email.com\"\n    }\n  ],\n  \"created_at\": \"2026-03-15T10:00:00Z\"\n}"
            }
          ]
        },
        {
          "name": "Criar Voucher - Carro Alugado",
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Locação - Localiza GRU\",\n  \"description\": \"Carro alugado para o período do evento\",\n  \"type\": \"rental_car\",\n  \"code\": \"LOC-001\",\n  \"valid_from\": \"2026-06-15T00:00:00Z\",\n  \"valid_to\": \"2026-06-20T23:59:59Z\",\n  \"details\": {\n    \"rental_company\": \"Localiza\",\n    \"car_model\": \"Toyota Corolla\",\n    \"car_category\": \"Sedan Intermediário\",\n    \"color\": \"Prata\",\n    \"pickup_location\": \"Aeroporto de Guarulhos - Loja 12\",\n    \"pickup_latitude\": -23.4356,\n    \"pickup_longitude\": -46.4731,\n    \"dropoff_location\": \"Aeroporto Santos Dumont - Loja 3\",\n    \"dropoff_latitude\": -22.9104,\n    \"dropoff_longitude\": -43.1631,\n    \"pickup_date\": \"2026-06-15\",\n    \"pickup_time\": \"10:00\",\n    \"dropoff_date\": \"2026-06-20\",\n    \"dropoff_time\": \"10:00\",\n    \"driver_name\": \"João Silva\",\n    \"car_rental_contact\": \"+5511999998888\",\n    \"insurance\": \"Cobertura Total\",\n    \"extras\": \"GPS, Cadeira infantil\",\n    \"gps\": \"GPS integrado + Apple CarPlay\",\n    \"mileage_policy\": \"Km livre\",\n    \"fuel_policy\": \"Devolver com tanque cheio\",\n    \"license_plate\": \"ABC-1D23\",\n    \"reservation_code\": \"LOC-789456\",\n    \"notes\": \"Apresentar CNH e cartão de crédito no balcão\"\n  },\n  \"guests\": [\n    {\n      \"user_id\": \"{{user_id}}\"\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers"
              ]
            },
            "description": "Cria um voucher de carro alugado com dados completos da locação.\n\n**Campos de details:**\n- `rental_company` - Nome da locadora\n- `pickup_location` / `dropoff_location` - Locais de retirada e devolução\n- `pickup_date` / `pickup_time` - Data e hora de retirada (YYYY-MM-DD / HH:mm)\n- `dropoff_date` / `dropoff_time` - Data e hora de devolução\n- `driver_name` - Nome do condutor principal\n- `car_rental_contact` - Telefone da locadora (clicável no app)\n- `reservation_code` - Código da reserva\n- Coordenadas geográficas para links de mapa\n\n**Versão pendente:** Use `requires_guest_input: true` para que o convidado preencha os dados.\n**Pré-seleção:** Use tipo `pre_rental_car` para oferecer opções de locadoras."
          },
          "response": [
            {
              "name": "201 - Voucher criado",
              "originalRequest": null,
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-voucher\",\n  \"event_id\": \"uuid-event\",\n  \"type\": \"rental_car\",\n  \"title\": \"Voo SP → RJ\",\n  \"status\": \"active\",\n  \"valid_from\": \"2026-06-15T06:00:00Z\",\n  \"valid_to\": \"2026-06-15T10:00:00Z\",\n  \"details\": {},\n  \"guests\": [\n    {\n      \"user_id\": \"uuid-user\",\n      \"full_name\": \"João Silva\",\n      \"email\": \"joao@email.com\"\n    }\n  ],\n  \"created_at\": \"2026-03-15T10:00:00Z\"\n}"
            }
          ]
        },
        {
          "name": "Criar Voucher - Transporte Terrestre",
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Trem NYC → Washington DC\",\n  \"description\": \"Acela Express - Business Class\",\n  \"type\": \"ground_transport\",\n  \"code\": \"AMT-001\",\n  \"valid_from\": \"2026-06-20T00:00:00Z\",\n  \"valid_to\": \"2026-06-20T23:59:59Z\",\n  \"details\": {\n    \"origin\": \"Penn Station, New York\",\n    \"origin_latitude\": 40.7506,\n    \"origin_longitude\": -73.9935,\n    \"destination\": \"Union Station, Washington DC\",\n    \"destination_latitude\": 38.8977,\n    \"destination_longitude\": -77.0066,\n    \"departure_date\": \"2026-06-20\",\n    \"departure_time\": \"08:00\",\n    \"arrival_date\": \"2026-06-20\",\n    \"arrival_time\": \"10:50\",\n    \"company\": \"Amtrak\",\n    \"vehicle_type\": \"Trem Acela Express\",\n    \"vehicle_number\": \"Trem 2153\",\n    \"seat_number\": \"Vagão 4, Assento 7B\",\n    \"seat_class\": \"Business Class\",\n    \"platform\": \"Plataforma 11 Oeste\",\n    \"terminal\": \"Penn Station - Nível Inferior\",\n    \"estimated_duration\": \"2h50\",\n    \"amenities\": \"Wi-Fi, tomadas 110V, vagão-restaurante\",\n    \"contact_phone\": \"+18002727245\",\n    \"booking_reference\": \"AMT-926481\",\n    \"notes\": \"Check-in no ClubAcela Lounge disponível 1h antes da partida.\"\n  },\n  \"guests\": [\n    {\n      \"user_id\": \"{{user_id}}\"\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers"
              ]
            },
            "description": "Cria um voucher de transporte terrestre (ônibus, trem, balsa, van).\n\n**Campos de details:**\n- `origin` / `destination` - Locais de embarque e desembarque\n- `departure_date` / `departure_time` - Data e hora de partida (YYYY-MM-DD / HH:mm)\n- `arrival_date` / `arrival_time` - Data e hora de chegada\n- `company` - Nome da empresa de transporte\n- `vehicle_type` - Tipo: Ônibus Executivo, Trem, Balsa/Ferry, Van, Micro-ônibus, Metrô\n- `contact_phone` - Telefone de contato (clicável no app)\n- `booking_reference` - Código da reserva\n- Coordenadas geográficas para links de mapa"
          },
          "response": [
            {
              "name": "201 - Voucher criado",
              "originalRequest": null,
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-voucher\",\n  \"event_id\": \"uuid-event\",\n  \"type\": \"ground_transport\",\n  \"title\": \"Voo SP → RJ\",\n  \"status\": \"active\",\n  \"valid_from\": \"2026-06-15T06:00:00Z\",\n  \"valid_to\": \"2026-06-15T10:00:00Z\",\n  \"details\": {},\n  \"guests\": [\n    {\n      \"user_id\": \"uuid-user\",\n      \"full_name\": \"João Silva\",\n      \"email\": \"joao@email.com\"\n    }\n  ],\n  \"created_at\": \"2026-03-15T10:00:00Z\"\n}"
            }
          ]
        },
        {
          "name": "Criar Voucher - Seguro Viagem",
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Seguro Viagem - Allianz Platinum\",\n  \"description\": \"Cobertura internacional completa\",\n  \"type\": \"insurance\",\n  \"code\": \"ALLIANZ-001\",\n  \"valid_from\": \"2026-06-10T00:00:00Z\",\n  \"valid_to\": \"2026-06-20T23:59:59Z\",\n  \"reservation_notes\": \"Seguro cobre cancelamento de viagem até 48h antes. Em caso de sinistro, ligar para central antes de ir ao hospital. Número da apólice deve ser apresentado na imigração.\",\n  \"details\": {\n    \"provider\": \"Allianz Travel\",\n    \"policy\": \"AT-2026-BF001\",\n    \"coverage\": \"USD 250.000\",\n    \"emergency_phone\": \"+1 800 555 0199\",\n    \"plan_type\": \"Platinum Internacional\",\n    \"coverage_details\": \"Médica, odontológica, bagagem, cancelamento\",\n    \"notes\": \"Apresentar apólice impressa ou digital na imigração\"\n  },\n  \"guests\": [\n    {\n      \"user_id\": \"{{user_id}}\"\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers"
              ]
            },
            "description": "Cria um voucher de seguro viagem.\n\n**Campos de details:**\n- `provider` - Nome da seguradora\n- `policy` - Número da apólice\n- `coverage` - Valor da cobertura (ex: \"USD 250.000\")\n- `emergency_phone` - Telefone de emergência 24h (formato internacional com +, clicável no app para ligação e WhatsApp)\n- `plan_type` - Tipo do plano\n- `coverage_details` - Detalhes da cobertura\n- `notes` - Observações\n\n**Período de cobertura:** Definido por `valid_from` (início às 00:00) e `valid_to` (término às 23:59).\n\n**Observações da reserva:** Use `reservation_notes` para incluir instruções detalhadas, políticas e orientações.\n\n**Anexos:** Após criar o voucher, use `POST /vouchers/{id}/attachments` para anexar apólice em PDF, cartão do seguro, etc."
          },
          "response": [
            {
              "name": "201 - Voucher criado",
              "originalRequest": null,
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-voucher\",\n  \"event_id\": \"uuid-event\",\n  \"type\": \"travel_insurance\",\n  \"title\": \"Voo SP → RJ\",\n  \"status\": \"active\",\n  \"valid_from\": \"2026-06-15T06:00:00Z\",\n  \"valid_to\": \"2026-06-15T10:00:00Z\",\n  \"details\": {},\n  \"guests\": [\n    {\n      \"user_id\": \"uuid-user\",\n      \"full_name\": \"João Silva\",\n      \"email\": \"joao@email.com\"\n    }\n  ],\n  \"created_at\": \"2026-03-15T10:00:00Z\"\n}"
            }
          ]
        },
        {
          "name": "Listar Vouchers com Escolha Pendente",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers?event_id={{event_id}}&pending_choice=true",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                },
                {
                  "key": "pending_choice",
                  "value": "true"
                }
              ]
            },
            "description": "Lista vouchers de pré-seleção (pre_flight/pre_hotel/pre_rental_car) que ainda não foram respondidos pelo convidado."
          },
          "response": [
            {
              "name": "200 - Vouchers listados",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "[\n  {\n    \"id\": \"uuid-voucher\",\n    \"event_id\": \"uuid-event\",\n    \"type\": \"flight\",\n    \"title\": \"Voo SP → RJ\",\n    \"status\": \"active\",\n    \"valid_from\": \"2026-06-15T06:00:00Z\",\n    \"valid_to\": \"2026-06-15T10:00:00Z\",\n    \"details\": {},\n    \"guests\": [\n      {\n        \"user_id\": \"uuid-user\",\n        \"full_name\": \"João Silva\",\n        \"email\": \"joao@email.com\"\n      }\n    ],\n    \"created_at\": \"2026-03-15T10:00:00Z\"\n  }\n]"
            }
          ]
        },
        {
          "name": "Listar Vouchers Rejeitados",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers?event_id={{event_id}}&rejected=true",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                },
                {
                  "key": "rejected",
                  "value": "true"
                }
              ]
            },
            "description": "Lista vouchers de pré-seleção que foram rejeitados (convidado escolheu 'Nenhuma das opções').\n\nRetorna vouchers com `rejection_reason` preenchido."
          },
          "response": [
            {
              "name": "200 - Vouchers listados",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "[\n  {\n    \"id\": \"uuid-voucher\",\n    \"event_id\": \"uuid-event\",\n    \"type\": \"flight\",\n    \"title\": \"Voo SP → RJ\",\n    \"status\": \"active\",\n    \"valid_from\": \"2026-06-15T06:00:00Z\",\n    \"valid_to\": \"2026-06-15T10:00:00Z\",\n    \"details\": {},\n    \"guests\": [\n      {\n        \"user_id\": \"uuid-user\",\n        \"full_name\": \"João Silva\",\n        \"email\": \"joao@email.com\"\n      }\n    ],\n    \"created_at\": \"2026-03-15T10:00:00Z\"\n  }\n]"
            }
          ]
        },
        {
          "name": "Listar Vouchers Recusados (Declined)",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers?event_id={{event_id}}&declined=true",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                },
                {
                  "key": "declined",
                  "value": "true"
                }
              ]
            },
            "description": "Lista vouchers em que o convidado informou que não participará da atividade.\n\nRetorna vouchers com `declined_at` preenchido e opcionalmente `decline_reason` com o motivo informado.\n\nO convidado pode reverter a decisão a qualquer momento, o que limpa os campos `declined_at` e `decline_reason`."
          },
          "response": [
            {
              "name": "200 - Vouchers listados",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "[\n  {\n    \"id\": \"uuid-voucher\",\n    \"event_id\": \"uuid-event\",\n    \"type\": \"flight\",\n    \"title\": \"Voo SP → RJ\",\n    \"status\": \"active\",\n    \"valid_from\": \"2026-06-15T06:00:00Z\",\n    \"valid_to\": \"2026-06-15T10:00:00Z\",\n    \"details\": {},\n    \"guests\": [\n      {\n        \"user_id\": \"uuid-user\",\n        \"full_name\": \"João Silva\",\n        \"email\": \"joao@email.com\"\n      }\n    ],\n    \"created_at\": \"2026-03-15T10:00:00Z\"\n  }\n]"
            }
          ]
        },
        {
          "name": "Listar Recusas de Vouchers (Changes)",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers/changes?event_id={{event_id}}&change_type=declined",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers",
                "changes"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                },
                {
                  "key": "change_type",
                  "value": "declined"
                }
              ]
            },
            "description": "Lista o histórico de recusas de vouchers pelos convidados.\n\nInclui o motivo informado (se houver) e o timestamp da recusa.\n\nUse `change_type=undeclined` para ver reversões de recusa."
          },
          "response": [
            {
              "name": "200 - Vouchers listados",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "[\n  {\n    \"id\": \"uuid-voucher\",\n    \"event_id\": \"uuid-event\",\n    \"type\": \"flight\",\n    \"title\": \"Voo SP → RJ\",\n    \"status\": \"active\",\n    \"valid_from\": \"2026-06-15T06:00:00Z\",\n    \"valid_to\": \"2026-06-15T10:00:00Z\",\n    \"details\": {},\n    \"guests\": [\n      {\n        \"user_id\": \"uuid-user\",\n        \"full_name\": \"João Silva\",\n        \"email\": \"joao@email.com\"\n      }\n    ],\n    \"created_at\": \"2026-03-15T10:00:00Z\"\n  }\n]"
            }
          ]
        },
        {
          "name": "Listar Alterações de Vouchers",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers/changes?event_id={{event_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers",
                "changes"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                }
              ]
            },
            "description": "Lista todas as alterações feitas nos vouchers via app.\n\nPermite ao backoffice acompanhar escolhas de pré-seleção, preenchimento de dados pelo convidado, edições e mudanças de status.\n\n**Filtros disponíveis:**\n- `event_id` - Filtrar por evento\n- `since` - Data ISO 8601, retorna alterações após esta data\n- `change_type` - Tipo: `choice_made`, `details_updated`, `status_changed`, `edited`, `created`\n- `voucher_id` - Filtrar por voucher específico\n- `limit` - Máximo de resultados (default: 100, máx: 500)\n- `offset` - Offset para paginação"
          },
          "response": [
            {
              "name": "200 - Vouchers listados",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "[\n  {\n    \"id\": \"uuid-voucher\",\n    \"event_id\": \"uuid-event\",\n    \"type\": \"flight\",\n    \"title\": \"Voo SP → RJ\",\n    \"status\": \"active\",\n    \"valid_from\": \"2026-06-15T06:00:00Z\",\n    \"valid_to\": \"2026-06-15T10:00:00Z\",\n    \"details\": {},\n    \"guests\": [\n      {\n        \"user_id\": \"uuid-user\",\n        \"full_name\": \"João Silva\",\n        \"email\": \"joao@email.com\"\n      }\n    ],\n    \"created_at\": \"2026-03-15T10:00:00Z\"\n  }\n]"
            }
          ]
        },
        {
          "name": "Listar Alterações Desde Data",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers/changes?event_id={{event_id}}&since=2025-01-20T00:00:00Z",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers",
                "changes"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                },
                {
                  "key": "since",
                  "value": "2025-01-20T00:00:00Z"
                }
              ]
            },
            "description": "Lista alterações de vouchers feitas após uma data específica.\n\nFluxo recomendado:\n1. Primeira consulta sem `since` para obter todas\n2. Armazene o `changed_at` mais recente\n3. Próximas consultas use `since` para obter apenas novidades"
          },
          "response": [
            {
              "name": "200 - Vouchers listados",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "[\n  {\n    \"id\": \"uuid-voucher\",\n    \"event_id\": \"uuid-event\",\n    \"type\": \"flight\",\n    \"title\": \"Voo SP → RJ\",\n    \"status\": \"active\",\n    \"valid_from\": \"2026-06-15T06:00:00Z\",\n    \"valid_to\": \"2026-06-15T10:00:00Z\",\n    \"details\": {},\n    \"guests\": [\n      {\n        \"user_id\": \"uuid-user\",\n        \"full_name\": \"João Silva\",\n        \"email\": \"joao@email.com\"\n      }\n    ],\n    \"created_at\": \"2026-03-15T10:00:00Z\"\n  }\n]"
            }
          ]
        },
        {
          "name": "Listar Escolhas de Pré-Seleção",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers/changes?event_id={{event_id}}&change_type=choice_made",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers",
                "changes"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                },
                {
                  "key": "change_type",
                  "value": "choice_made"
                }
              ]
            },
            "description": "Lista apenas as escolhas feitas por convidados em vouchers de pré-seleção (pre_flight, pre_hotel, pre_rental_car).\n\nInclui a opção selecionada e, em caso de rejeição, o motivo informado."
          },
          "response": [
            {
              "name": "200 - Vouchers listados",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "[\n  {\n    \"id\": \"uuid-voucher\",\n    \"event_id\": \"uuid-event\",\n    \"type\": \"flight\",\n    \"title\": \"Voo SP → RJ\",\n    \"status\": \"active\",\n    \"valid_from\": \"2026-06-15T06:00:00Z\",\n    \"valid_to\": \"2026-06-15T10:00:00Z\",\n    \"details\": {},\n    \"guests\": [\n      {\n        \"user_id\": \"uuid-user\",\n        \"full_name\": \"João Silva\",\n        \"email\": \"joao@email.com\"\n      }\n    ],\n    \"created_at\": \"2026-03-15T10:00:00Z\"\n  }\n]"
            }
          ]
        },
        {
          "name": "Criar Vouchers em Lote",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"vouchers\": [\n    {\n      \"event_id\": \"{{event_id}}\",\n      \"title\": \"Almoço - Dia 1\",\n      \"code\": \"LUNCH-D1-001\",\n      \"type\": \"meal\",\n      \"valid_from\": \"2025-03-15T12:00:00Z\",\n      \"valid_to\": \"2025-03-15T14:00:00Z\",\n      \"requires_usage_control\": true,\n      \"details\": {\n        \"restaurant\": \"Restaurante do Evento\",\n        \"date\": \"15/03/2025\",\n        \"time\": \"12:00\",\n        \"meal_type\": \"Almoço Executivo\"\n      },\n      \"guests\": [\n        {\n          \"user_id\": \"{{user_id}}\"\n        }\n      ]\n    },\n    {\n      \"event_id\": \"{{event_id}}\",\n      \"title\": \"Almoço - Dia 2\",\n      \"code\": \"LUNCH-D2-001\",\n      \"type\": \"meal\",\n      \"valid_from\": \"2025-03-16T12:00:00Z\",\n      \"valid_to\": \"2025-03-16T14:00:00Z\",\n      \"requires_usage_control\": true,\n      \"details\": {\n        \"restaurant\": \"Restaurante do Evento\",\n        \"date\": \"16/03/2025\",\n        \"time\": \"12:00\",\n        \"meal_type\": \"Almoço Executivo\"\n      },\n      \"guests\": [\n        {\n          \"user_id\": \"{{user_id}}\"\n        }\n      ]\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers/bulk",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers",
                "bulk"
              ]
            },
            "description": "Cria múltiplos vouchers em uma única requisição.\n\n**Limite:** máximo 100 vouchers por requisição."
          },
          "response": [
            {
              "name": "201 - Vouchers criados",
              "originalRequest": null,
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"created\": [\n    {\n      \"id\": \"uuid-voucher\",\n      \"event_id\": \"uuid-event\",\n      \"type\": \"flight\",\n      \"title\": \"Voo SP → RJ\",\n      \"status\": \"active\",\n      \"valid_from\": \"2026-06-15T06:00:00Z\",\n      \"valid_to\": \"2026-06-15T10:00:00Z\",\n      \"details\": {},\n      \"guests\": [\n        {\n          \"user_id\": \"uuid-user\",\n          \"full_name\": \"João Silva\",\n          \"email\": \"joao@email.com\"\n        }\n      ],\n      \"created_at\": \"2026-03-15T10:00:00Z\"\n    }\n  ],\n  \"count\": 1\n}"
            }
          ]
        },
        {
          "name": "Listar Reservas Pendentes",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers?event_id={{event_id}}&reservation_status=pending_reservation",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                },
                {
                  "key": "reservation_status",
                  "value": "pending_reservation"
                }
              ]
            },
            "description": "Lista vouchers com reserva pendente de confirmação pela operação.\n\nApós o convidado fazer uma escolha em um pré-voucher (pre_flight/pre_hotel/pre_rental_car), o voucher convertido recebe `reservation_status: pending_reservation`.\n\n**Valores possíveis:**\n- `pending_reservation` — Aguardando confirmação da operação\n- `confirmed` — Reserva confirmada\n- `cancelled` — Reserva cancelada"
          },
          "response": [
            {
              "name": "200 - Vouchers listados",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "[\n  {\n    \"id\": \"uuid-voucher\",\n    \"event_id\": \"uuid-event\",\n    \"type\": \"flight\",\n    \"title\": \"Voo SP → RJ\",\n    \"status\": \"active\",\n    \"valid_from\": \"2026-06-15T06:00:00Z\",\n    \"valid_to\": \"2026-06-15T10:00:00Z\",\n    \"details\": {},\n    \"guests\": [\n      {\n        \"user_id\": \"uuid-user\",\n        \"full_name\": \"João Silva\",\n        \"email\": \"joao@email.com\"\n      }\n    ],\n    \"created_at\": \"2026-03-15T10:00:00Z\"\n  }\n]"
            }
          ]
        },
        {
          "name": "Listar Reservas Confirmadas",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers?event_id={{event_id}}&reservation_status=confirmed",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                },
                {
                  "key": "reservation_status",
                  "value": "confirmed"
                }
              ]
            },
            "description": "Lista vouchers com reserva já confirmada pela operação."
          },
          "response": [
            {
              "name": "200 - Vouchers listados",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "[\n  {\n    \"id\": \"uuid-voucher\",\n    \"event_id\": \"uuid-event\",\n    \"type\": \"flight\",\n    \"title\": \"Voo SP → RJ\",\n    \"status\": \"active\",\n    \"valid_from\": \"2026-06-15T06:00:00Z\",\n    \"valid_to\": \"2026-06-15T10:00:00Z\",\n    \"details\": {},\n    \"guests\": [\n      {\n        \"user_id\": \"uuid-user\",\n        \"full_name\": \"João Silva\",\n        \"email\": \"joao@email.com\"\n      }\n    ],\n    \"created_at\": \"2026-03-15T10:00:00Z\"\n  }\n]"
            }
          ]
        },
        {
          "name": "Atualizar Voucher",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"guests\": [\n    {\n      \"user_id\": \"{{user_id}}\"\n    }\n  ],\n  \"type\": \"flight\",\n  \"title\": \"Voo GRU → CDG (atualizado)\",\n  \"description\": \"Atualização do voo internacional\",\n  \"code\": \"AF-456-UPD\",\n  \"valid_from\": \"2026-08-10T00:00:00Z\",\n  \"valid_to\": \"2026-08-22T23:59:59Z\",\n  \"status\": \"active\",\n  \"requires_usage_control\": false,\n  \"requires_guest_input\": false,\n  \"hotel_reservation_id\": null,\n  \"reservation_status\": \"confirmed\",\n  \"reservation_notes\": \"Localizador atualizado: XYZ789\",\n  \"details\": {\n    \"airline\": \"Air France\",\n    \"locator\": \"XYZ789\",\n    \"terminal\": \"\",\n    \"segments\": [\n      {\n        \"flight_number\": \"AF459\",\n        \"origin\": \"GRU\",\n        \"destination\": \"CDG\",\n        \"departure_date\": \"2026-08-10\",\n        \"departure_time\": \"22:00\",\n        \"arrival_date\": \"2026-08-11\",\n        \"arrival_time\": \"14:30\"\n      }\n    ]\n  }\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers/{{voucher_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers",
                "{{voucher_id}}"
              ]
            },
            "description": "Atualiza um voucher existente.\n\n**Aceita o mesmo payload do POST** — campos identificadores (`event_id`, `guests`, `user_id`, `email`) são silenciosamente ignorados, permitindo reutilizar o mesmo body usado na criação.\n\n**Correção v5.5.3:** o PUT de vouchers não falha mais por webhook interno referenciando `external_id`; esse campo não pertence ao voucher.\n\n**Comportamento de campos:**\n- **Campo ausente**: mantém valor atual\n- **Campo com string vazia (`\"\"`)**: ignorado (mantém valor atual) — inclusive dentro de objetos/arrays de `details`\n- **Campo com `null`**: limpa o campo (somente em campos nullable: `description`, `reservation_status`, `reservation_notes`, `hotel_reservation_id`, etc.)\n\n**Campos atualizáveis:** `title`, `description`, `valid_from`, `valid_to`, `code`, `status`, `type`, `details`, `requires_usage_control`, `requires_guest_input`, `reservation_status`, `reservation_notes`, `hotel_reservation_id`\n\n**Validações preservadas:**\n- Quando `type` + `details` são enviados juntos, as validações por tipo (datas/horários obrigatórios para timeline, códigos IATA para voos) são aplicadas igual ao POST.\n- `valid_from`/`valid_to`: formato ISO obrigatório quando enviados.\n- `status`: `active`, `used`, `expired`, `cancelled`.\n- `reservation_status`: `pending_reservation`, `confirmed`, `cancelled`."
          },
          "response": [
            {
              "name": "Voucher atualizado",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [],
              "body": "{\n  \"voucher\": {\n    \"id\": \"uuid-voucher\",\n    \"title\": \"Título Atualizado\",\n    \"status\": \"used\",\n    \"updated_at\": \"2026-03-25T14:00:00Z\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Confirmar Reserva (Operação)",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reservation_status\": \"confirmed\",\n  \"reservation_notes\": \"Reserva confirmada junto ao fornecedor. Localizador: XYZ789.\",\n  \"details\": {\n    \"locator\": \"XYZ789\",\n    \"seat\": \"14A\",\n    \"class\": \"Executiva\"\n  }\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers/{{voucher_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers",
                "{{voucher_id}}"
              ]
            },
            "description": "Confirma a reserva de um voucher e adiciona os dados da reserva.\n\nUse após efetuar a reserva junto ao fornecedor (companhia aérea, hotel, locadora, etc.).\n\n**Fluxo:**\n1. Convidado escolhe opção no pré-voucher → `reservation_status: pending_reservation`\n2. Operação efetua reserva junto ao fornecedor\n3. Operação atualiza voucher com status `confirmed` + dados da reserva\n4. App do convidado remove o badge 'Aguardando confirmação'"
          },
          "response": [
            {
              "name": "200 - Reserva confirmada",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true\n}"
            }
          ]
        },
        {
          "name": "Cancelar Reserva (Operação)",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reservation_status\": \"cancelled\",\n  \"reservation_notes\": \"Voo cancelado pela companhia aérea. Novo voucher será emitido.\"\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers/{{voucher_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers",
                "{{voucher_id}}"
              ]
            },
            "description": "Cancela a reserva de um voucher.\n\nUse quando a reserva não pode ser confirmada ou foi cancelada pelo fornecedor."
          },
          "response": [
            {
              "name": "200 - Reserva cancelada",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true\n}"
            }
          ]
        },
        {
          "name": "Listar Alterações de Reserva",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers/changes?event_id={{event_id}}&change_type=reservation_updated",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers",
                "changes"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                },
                {
                  "key": "change_type",
                  "value": "reservation_updated"
                }
              ]
            },
            "description": "Lista apenas as alterações de status de reserva (`reservation_status` e `reservation_notes`)."
          },
          "response": [
            {
              "name": "200 - Vouchers listados",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "[\n  {\n    \"id\": \"uuid-voucher\",\n    \"event_id\": \"uuid-event\",\n    \"type\": \"flight\",\n    \"title\": \"Voo SP → RJ\",\n    \"status\": \"active\",\n    \"valid_from\": \"2026-06-15T06:00:00Z\",\n    \"valid_to\": \"2026-06-15T10:00:00Z\",\n    \"details\": {},\n    \"guests\": [\n      {\n        \"user_id\": \"uuid-user\",\n        \"full_name\": \"João Silva\",\n        \"email\": \"joao@email.com\"\n      }\n    ],\n    \"created_at\": \"2026-03-15T10:00:00Z\"\n  }\n]"
            }
          ]
        },
        {
          "name": "Deletar Voucher",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers/{{voucher_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers",
                "{{voucher_id}}"
              ]
            },
            "description": "Remove um voucher permanentemente."
          },
          "response": [
            {
              "name": "200 - Voucher removido",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true\n}"
            }
          ]
        },
        {
          "name": "Listar Anexos do Voucher",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers/{{voucher_id}}/attachments",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers",
                "{{voucher_id}}",
                "attachments"
              ]
            },
            "description": "Lista todos os anexos (arquivos) de um voucher."
          },
          "response": [
            {
              "name": "200 - Vouchers listados",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "[\n  {\n    \"id\": \"uuid-voucher\",\n    \"event_id\": \"uuid-event\",\n    \"type\": \"flight\",\n    \"title\": \"Voo SP → RJ\",\n    \"status\": \"active\",\n    \"valid_from\": \"2026-06-15T06:00:00Z\",\n    \"valid_to\": \"2026-06-15T10:00:00Z\",\n    \"details\": {},\n    \"guests\": [\n      {\n        \"user_id\": \"uuid-user\",\n        \"full_name\": \"João Silva\",\n        \"email\": \"joao@email.com\"\n      }\n    ],\n    \"created_at\": \"2026-03-15T10:00:00Z\"\n  }\n]"
            }
          ]
        },
        {
          "name": "Registrar Anexo do Voucher",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"file_name\": \"bilhete-aereo.pdf\",\n  \"file_type\": \"application/pdf\",\n  \"file_size\": 102400,\n  \"storage_path\": \"vouchers/{{voucher_id}}/bilhete-aereo.pdf\",\n  \"uploaded_by\": \"{{user_id}}\"\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers/{{voucher_id}}/attachments",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers",
                "{{voucher_id}}",
                "attachments"
              ]
            },
            "description": "Registra os metadados de um anexo.\n\n**Nota:** O arquivo deve ser enviado primeiro para o storage."
          },
          "response": [
            {
              "name": "201 - Anexo registrado",
              "originalRequest": null,
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-attachment\",\n  \"file_name\": \"bilhete.pdf\",\n  \"storage_path\": \"voucher-attachments/uuid/bilhete.pdf\"\n}"
            }
          ]
        },
        {
          "name": "Criar Voucher - Multi-Guest (v5.0)",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    var jsonData = pm.response.json();",
                  "    if (jsonData.voucher) {",
                  "        pm.collectionVariables.set('voucher_id', jsonData.voucher.id);",
                  "        if (jsonData.voucher.voucher_guests && jsonData.voucher.voucher_guests.length > 0) {",
                  "            pm.collectionVariables.set('voucher_guest_id', jsonData.voucher.voucher_guests[0].id);",
                  "        }",
                  "    }",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Voo GRU → SDU - Ida\",\n  \"description\": \"Passagem aérea para grupo\",\n  \"code\": \"LATAM-MULTI-001\",\n  \"type\": \"flight\",\n  \"valid_from\": \"2026-06-15T00:00:00Z\",\n  \"valid_to\": \"2026-06-15T23:59:59Z\",\n  \"guests\": [\n    { \"user_id\": \"{{user_id}}\" },\n    { \"guest_id\": \"uuid-do-event-guest\" },\n    { \"pending_guest_id\": \"uuid-do-pending-guest\" },\n    { \"external_id\": \"CRM-12345\" },\n    { \"email\": \"convidado@email.com\" }\n  ],\n  \"details\": {\n    \"segments\": [\n      {\n        \"origin\": \"GRU\",\n        \"destination\": \"SDU\",\n        \"departure_date\": \"15/06/2026\",\n        \"departure_time\": \"08:30\",\n        \"arrival_time\": \"09:45\",\n        \"airline\": \"LATAM\",\n        \"flight_number\": \"LA3021\",\n        \"duration\": \"1h15\"\n      }\n    ],\n    \"class\": \"Executiva\",\n    \"baggage\": \"2x23kg\",\n    \"locator\": \"MULTI001\"\n  }\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers"
              ]
            },
            "description": "Cria um voucher vinculado a múltiplos convidados usando o campo `guests[]`.\n\n**Identificadores aceitos por item de `guests` (v5.6):**\n- `user_id` — UUID do usuário registrado\n- `guest_id` — UUID do registro em `event_guests`\n- `pending_guest_id` — UUID do registro em `pending_guests`\n- `external_id` — identificador externo (ex.: ID do CRM/ERP)\n- `email` — e-mail do convidado (registrado ou pendente)\n\n**Prioridade quando mais de um é enviado no mesmo item:** `user_id > guest_id > pending_guest_id > external_id > email`\n\n**Resolução de `external_id` (escopo: `event_id`):**\n1. `event_guests.external_id` no evento\n2. Tabela de aliases (preserva vínculo após merges de conta / reconvites)\n3. `pending_guests.external_id` no evento\n\nIdentificadores que não puderem ser resolvidos retornam em `errors[]`; os demais são vinculados normalmente.\n\n**Retrocompatibilidade:** Os campos `user_id` e `email` no nível raiz continuam funcionando para vincular um único convidado.\n\n**Resposta:** Inclui `voucher_guests` com os registros criados."
          },
          "response": [
            {
              "name": "Voucher multi-guest criado",
              "originalRequest": {
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"event_id\": \"uuid\",\n  \"title\": \"Voo GRU → SDU\",\n  \"code\": \"MULTI-001\",\n  \"type\": \"flight\",\n  \"valid_from\": \"2026-06-15T00:00:00Z\",\n  \"valid_to\": \"2026-06-15T23:59:59Z\",\n  \"guests\": [\n    { \"user_id\": \"uuid-1\" },\n    { \"email\": \"guest@email.com\" }\n  ],\n  \"details\": { \"segments\": [...] }\n}"
                },
                "url": {
                  "raw": "{{base_url}}/backoffice-api/vouchers",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "backoffice-api",
                    "vouchers"
                  ]
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"voucher\": {\n    \"id\": \"uuid-voucher\",\n    \"event_id\": \"uuid-evento\",\n    \"title\": \"Voo GRU → SDU\",\n    \"type\": \"flight\",\n    \"status\": \"active\",\n    \"voucher_guests\": [\n      {\n        \"id\": \"uuid-vg-1\",\n        \"voucher_id\": \"uuid-voucher\",\n        \"user_id\": \"uuid-1\",\n        \"pending_guest_email\": null,\n        \"status\": \"active\",\n        \"created_at\": \"2026-03-25T10:00:00Z\"\n      },\n      {\n        \"id\": \"uuid-vg-2\",\n        \"voucher_id\": \"uuid-voucher\",\n        \"user_id\": null,\n        \"pending_guest_email\": \"guest@email.com\",\n        \"status\": \"active\",\n        \"created_at\": \"2026-03-25T10:00:00Z\"\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "Adicionar Convidados ao Voucher (v5.0)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"guests\": [\n    { \"user_id\": \"{{user_id}}\" },\n    { \"guest_id\": \"uuid-do-event-guest\" },\n    { \"pending_guest_id\": \"uuid-do-pending-guest\" },\n    { \"external_id\": \"CRM-12345\" },\n    { \"email\": \"novo-convidado@email.com\" }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers/{{voucher_id}}/guests",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers",
                "{{voucher_id}}",
                "guests"
              ]
            },
            "description": "Adiciona um ou mais convidados a um voucher existente.\n\n**Identificadores aceitos por item de `guests` (v5.6):** `user_id`, `guest_id`, `pending_guest_id`, `external_id`, `email`.\n\n**Prioridade quando vários são enviados no mesmo item:** `user_id > guest_id > pending_guest_id > external_id > email`.\n\n**Resolução de `external_id` (escopo: o `event_id` do voucher):** event_guests → tabela de aliases → pending_guests.\n\nE-mails são resolvidos automaticamente para `user_id` quando o usuário já existe; caso contrário, ficam como pendentes (`pending_guest_email`) e são vinculados ao se cadastrar."
          },
          "response": [
            {
              "name": "Convidados adicionados",
              "originalRequest": {
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"guests\": [\n    { \"email\": \"novo@email.com\" }\n  ]\n}"
                },
                "url": {
                  "raw": "{{base_url}}/backoffice-api/vouchers/{{voucher_id}}/guests",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "backoffice-api",
                    "vouchers",
                    "{{voucher_id}}",
                    "guests"
                  ]
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"voucher_guests\": [\n    {\n      \"id\": \"uuid-vg-new\",\n      \"voucher_id\": \"uuid-voucher\",\n      \"user_id\": null,\n      \"pending_guest_email\": \"novo@email.com\",\n      \"status\": \"active\",\n      \"created_at\": \"2026-03-25T10:00:00Z\"\n    }\n  ]\n}"
            }
          ]
        },
        {
          "name": "Remover Convidado do Voucher (v5.0)",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers/{{voucher_id}}/guests/{{voucher_guest_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers",
                "{{voucher_id}}",
                "guests",
                "{{voucher_guest_id}}"
              ]
            },
            "description": "Remove um convidado específico de um voucher.\n\n**Novo em v5.0.** O `voucher_guest_id` é o `id` do registro na tabela `voucher_guests`, não o `user_id`.\n\nO convidado removido não terá mais acesso ao voucher no app."
          },
          "response": [
            {
              "name": "Convidado removido",
              "originalRequest": {
                "method": "DELETE",
                "url": {
                  "raw": "{{base_url}}/backoffice-api/vouchers/{{voucher_id}}/guests/{{voucher_guest_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "backoffice-api",
                    "vouchers",
                    "{{voucher_id}}",
                    "guests",
                    "{{voucher_guest_id}}"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"success\": true,\n  \"message\": \"Guest removed from voucher\"\n}"
            }
          ]
        },
        {
          "name": "Criar Voucher Hotel com Reserva (v5.0)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Quarto 301 - Suíte Deluxe Vista Mar\",\n  \"type\": \"hotel\",\n  \"code\": \"CP-301\",\n  \"valid_from\": \"2026-06-15T00:00:00Z\",\n  \"valid_to\": \"2026-06-18T23:59:59Z\",\n  \"hotel_reservation_id\": \"{{hotel_reservation_id}}\",\n  \"guests\": [\n    { \"user_id\": \"{{user_id}}\" },\n    { \"email\": \"acompanhante@email.com\" }\n  ],\n  \"details\": {\n    \"hotel_name\": \"Copacabana Palace\",\n    \"room_type\": \"Suíte Deluxe Vista Mar\",\n    \"check_in\": \"2026-06-15T15:00:00Z\",\n    \"check_out\": \"2026-06-18T12:00:00Z\",\n    \"breakfast\": \"Café da manhã buffet incluso\",\n    \"floor\": \"3º andar\",\n    \"amenities\": \"Wi-Fi, Piscina, Spa\"\n  }\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/vouchers",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "vouchers"
              ]
            },
            "description": "Cria um voucher de hotel vinculado a uma reserva e com múltiplos convidados.\n\n**Novo em v5.0:** O campo `hotel_reservation_id` vincula o quarto a uma reserva de hotel previamente criada. Cada voucher de hotel com `hotel_reservation_id` representa um quarto dentro da reserva.\n\n**Fluxo recomendado:**\n1. Crie a reserva de hotel via POST /hotel-reservations\n2. Crie os vouchers (quartos) com `hotel_reservation_id` apontando para a reserva\n3. Vincule os convidados de cada quarto via `guests[]`"
          },
          "response": [
            {
              "name": "201 - Voucher criado",
              "originalRequest": null,
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-voucher\",\n  \"event_id\": \"uuid-event\",\n  \"type\": \"hotel\",\n  \"title\": \"Voo SP → RJ\",\n  \"status\": \"active\",\n  \"valid_from\": \"2026-06-15T06:00:00Z\",\n  \"valid_to\": \"2026-06-15T10:00:00Z\",\n  \"details\": {},\n  \"guests\": [\n    {\n      \"user_id\": \"uuid-user\",\n      \"full_name\": \"João Silva\",\n      \"email\": \"joao@email.com\"\n    }\n  ],\n  \"created_at\": \"2026-03-15T10:00:00Z\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "🏨 Hotel Reservations (v5.0)",
      "description": "Gerenciamento de reservas de hotel para agrupamento de quartos. Cada reserva contém múltiplos vouchers (quartos), e cada quarto pode ter múltiplos convidados.",
      "item": [
        {
          "name": "Listar Reservas de Hotel",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 200) {",
                  "    var jsonData = pm.response.json();",
                  "    if (jsonData.hotel_reservations && jsonData.hotel_reservations.length > 0) {",
                  "        pm.collectionVariables.set('hotel_reservation_id', jsonData.hotel_reservations[0].id);",
                  "        console.log('hotel_reservation_id salvo: ' + jsonData.hotel_reservations[0].id);",
                  "    }",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/hotel-reservations?event_id={{event_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "hotel-reservations"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                }
              ]
            },
            "description": "Lista todas as reservas de hotel de um evento com quartos e convidados vinculados.\n\n**Novo em v5.0.** Cada reserva inclui um array `rooms` com os vouchers (quartos) vinculados, que por sua vez incluem `voucher_guests` com os convidados."
          },
          "response": [
            {
              "name": "Lista de reservas",
              "originalRequest": {
                "method": "GET",
                "url": {
                  "raw": "{{base_url}}/backoffice-api/hotel-reservations?event_id={{event_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "backoffice-api",
                    "hotel-reservations"
                  ],
                  "query": [
                    {
                      "key": "event_id",
                      "value": "{{event_id}}"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"hotel_reservations\": [\n    {\n      \"id\": \"uuid-reserva\",\n      \"event_id\": \"uuid-evento\",\n      \"title\": \"Reserva Copacabana Palace\",\n      \"code\": \"CP-2026-001\",\n      \"hotel_name\": \"Copacabana Palace\",\n      \"check_in\": \"2026-06-15T15:00:00Z\",\n      \"check_out\": \"2026-06-18T12:00:00Z\",\n      \"details\": { \"address\": \"Av. Atlântica, 1702\" },\n      \"rooms\": [\n        {\n          \"id\": \"uuid-quarto-1\",\n          \"title\": \"Quarto 301 - Suíte Deluxe\",\n          \"type\": \"hotel\",\n          \"voucher_guests\": [\n            { \"id\": \"uuid-vg-1\", \"user_id\": \"uuid-user-1\", \"status\": \"active\" },\n            { \"id\": \"uuid-vg-2\", \"user_id\": \"uuid-user-2\", \"status\": \"active\" }\n          ]\n        },\n        {\n          \"id\": \"uuid-quarto-2\",\n          \"title\": \"Quarto 302 - Standard\",\n          \"type\": \"hotel\",\n          \"voucher_guests\": [\n            { \"id\": \"uuid-vg-3\", \"user_id\": \"uuid-user-3\", \"status\": \"active\" }\n          ]\n        }\n      ]\n    }\n  ]\n}"
            }
          ]
        },
        {
          "name": "Obter Reserva de Hotel",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/hotel-reservations/{{hotel_reservation_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "hotel-reservations",
                "{{hotel_reservation_id}}"
              ]
            },
            "description": "Obtém detalhes de uma reserva de hotel com todos os quartos e convidados vinculados."
          },
          "response": [
            {
              "name": "200 - Reserva encontrada",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-reserva\",\n  \"event_id\": \"uuid-event\",\n  \"title\": \"Reserva Copacabana Palace\",\n  \"hotel_name\": \"Copacabana Palace\",\n  \"code\": \"CP-2026-001\",\n  \"check_in\": \"2026-06-15T15:00:00Z\",\n  \"check_out\": \"2026-06-18T12:00:00Z\",\n  \"total_rooms\": 15\n}"
            },
            {
              "name": "404 - Não encontrada",
              "originalRequest": null,
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": \"Hotel reservation not found\"\n}"
            }
          ]
        },
        {
          "name": "Criar Reserva de Hotel",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    var jsonData = pm.response.json();",
                  "    if (jsonData.hotel_reservation) {",
                  "        pm.collectionVariables.set('hotel_reservation_id', jsonData.hotel_reservation.id);",
                  "        console.log('hotel_reservation_id salvo: ' + jsonData.hotel_reservation.id);",
                  "    }",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Reserva Copacabana Palace\",\n  \"code\": \"CP-2026-001\",\n  \"hotel_name\": \"Copacabana Palace\",\n  \"check_in\": \"2026-06-15T15:00:00Z\",\n  \"check_out\": \"2026-06-18T12:00:00Z\",\n  \"total_rooms\": 15,\n  \"details\": {\n    \"address\": \"Av. Atlântica, 1702 - Copacabana, Rio de Janeiro\",\n    \"phone\": \"+55 21 2548-7070\",\n    \"email\": \"reservas@copacabanapalace.com\",\n    \"website\": \"https://www.copacabanapalace.com\",\n    \"reservation_code\": \"CP-789456\",\n    \"online_check_in_url\": \"https://hotel.com/checkin/CP-789456\",\n    \"wifi_network\": \"CopaGuest\",\n    \"wifi_password\": \"COPA2025VIP\",\n    \"breakfast\": \"Café da manhã buffet incluso (06h-10h30)\",\n    \"amenities\": \"Wi-Fi, Piscina, Spa, Academia, Estacionamento\",\n    \"check_in_policy\": \"Check-in a partir das 15h. Apresentar documento com foto.\",\n    \"check_out_policy\": \"Check-out até 12h. Late check-out sujeito a disponibilidade.\",\n    \"cancellation_policy\": \"Cancelamento gratuito até 48h antes do check-in.\",\n    \"notes\": \"Hóspedes do grupo têm acesso ao lounge executivo.\"\n  }\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/hotel-reservations",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "hotel-reservations"
              ]
            },
            "description": "Cria uma reserva de hotel que servirá como agrupador de quartos.\n\n**Campos obrigatórios:** `event_id`, `title`\n\n**Campos opcionais:** `code`, `hotel_name`, `check_in` (ISO), `check_out` (ISO), `details` (JSONB livre), `total_rooms` (integer), `rooms` (array), `rooming_config`, `rooming_status`\n\n**Campo `details` (JSONB livre — paridade com voucher tipo `hotel`):**\n\nUse para armazenar todas as informações descritivas do hotel que aparecerão nos vouchers de quarto. Campos sugeridos (todos opcionais):\n\n- `address` — Endereço completo\n- `phone` — Telefone do hotel\n- `email` — E-mail de reservas\n- `website` — Site oficial\n- `reservation_code` — Código/localizador da reserva\n- `online_check_in_url` — URL para web check-in\n- `wifi_network` — Nome da rede Wi-Fi\n- `wifi_password` — Senha do Wi-Fi\n- `breakfast` — Informações sobre café da manhã\n- `amenities` — Comodidades do hotel\n- `check_in_policy` — Política e horário de check-in\n- `check_out_policy` — Política e horário de check-out\n- `cancellation_policy` — Política de cancelamento\n- `notes` — Observações gerais\n\n> Como `details` é JSONB livre, qualquer campo adicional é aceito (ex: `parking`, `pets_allowed`, `concierge`, `transfer_included`).\n\n**Fluxo completo:**\n1. Crie a reserva (este endpoint) — pode incluir `rooms[]` para criar tudo de uma vez (ver request abaixo)\n2. Ou crie quartos depois via vouchers com `hotel_reservation_id`\n3. Vincule convidados via `guests[]` no voucher ou via POST /vouchers/{id}/guests"
          },
          "response": [
            {
              "name": "Reserva criada",
              "originalRequest": {
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"event_id\": \"uuid\",\n  \"title\": \"Reserva Copacabana Palace\",\n  \"hotel_name\": \"Copacabana Palace\"\n}"
                },
                "url": {
                  "raw": "{{base_url}}/backoffice-api/hotel-reservations",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "backoffice-api",
                    "hotel-reservations"
                  ]
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"hotel_reservation\": {\n    \"id\": \"uuid-reserva\",\n    \"event_id\": \"uuid-evento\",\n    \"title\": \"Reserva Copacabana Palace\",\n    \"code\": null,\n    \"hotel_name\": \"Copacabana Palace\",\n    \"check_in\": null,\n    \"check_out\": null,\n    \"details\": {},\n    \"created_at\": \"2026-03-25T10:00:00Z\",\n    \"updated_at\": \"2026-03-25T10:00:00Z\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Criar Reserva com Quartos Pré-Alocados (v5.1)",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    var jsonData = pm.response.json();",
                  "    if (jsonData.hotel_reservation) {",
                  "        pm.collectionVariables.set('hotel_reservation_id', jsonData.hotel_reservation.id);",
                  "        console.log('hotel_reservation_id salvo: ' + jsonData.hotel_reservation.id);",
                  "    }",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Reserva Copacabana Palace\",\n  \"hotel_name\": \"Copacabana Palace\",\n  \"code\": \"CP-2026-001\",\n  \"check_in\": \"2026-06-15T15:00:00Z\",\n  \"check_out\": \"2026-06-18T12:00:00Z\",\n  \"total_rooms\": 15,\n  \"details\": {\n    \"address\": \"Av. Atlântica, 1702 - Copacabana, Rio de Janeiro\",\n    \"phone\": \"+55 21 2548-7070\",\n    \"reservation_code\": \"CP-789456\",\n    \"online_check_in_url\": \"https://hotel.com/checkin/CP-789456\",\n    \"wifi_network\": \"CopaGuest\",\n    \"wifi_password\": \"COPA2025VIP\",\n    \"breakfast\": \"Café da manhã buffet incluso (06h-10h30)\",\n    \"amenities\": \"Wi-Fi, Piscina, Spa, Academia\",\n    \"check_in_policy\": \"Check-in a partir das 15h\",\n    \"check_out_policy\": \"Check-out até 12h\",\n    \"cancellation_policy\": \"Cancelamento gratuito até 48h antes\"\n  },\n  \"rooms\": [\n    {\n      \"title\": \"Quarto 301 - Suíte Deluxe\",\n      \"code\": \"CP-301\",\n      \"max_occupancy\": 3,\n      \"room_type\": \"Suíte Deluxe Vista Mar\",\n      \"description\": \"Suíte com varanda e vista para a praia de Copacabana.\",\n      \"details\": {\n        \"floor\": \"3º andar\",\n        \"bed_configuration\": \"1 cama king + 1 sofá-cama\",\n        \"view\": \"Vista mar\",\n        \"smoking\": false,\n        \"breakfast\": \"Buffet incluso\",\n        \"amenities\": \"Cofre, frigobar, ar-condicionado, TV 55\\\"\"\n      },\n      \"guests\": [\n        { \"email\": \"joao@email.com\" },\n        { \"user_id\": \"uuid-maria\" }\n      ]\n    },\n    {\n      \"title\": \"Quarto 302 - Standard\",\n      \"code\": \"CP-302\",\n      \"max_occupancy\": 2,\n      \"room_type\": \"Standard\",\n      \"details\": {\n        \"floor\": \"3º andar\",\n        \"bed_configuration\": \"2 camas de solteiro\",\n        \"view\": \"Vista cidade\"\n      },\n      \"guests\": []\n    },\n    {\n      \"title\": \"Quarto 303 - Triplo\",\n      \"code\": \"CP-303\",\n      \"max_occupancy\": 3,\n      \"room_type\": \"Triplo\"\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/hotel-reservations",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "hotel-reservations"
              ]
            },
            "description": "Cria uma reserva de hotel com quartos e convidados pré-alocados em uma única chamada (v5.1).\n\n**Novo em v5.1:** O array `rooms[]` permite criar quartos (vouchers hotel) com convidados já alocados.\n\n- Quartos com `guests[]` recebem `allocated_by: \"api\"` no voucher_guests\n- Quartos com `guests: []` ficam vazios para alocação via rooming list\n- `total_rooms` define a capacidade total (inclui quartos não criados no sistema)\n- `valid_from`/`valid_to` dos vouchers são herdados de `check_in`/`check_out`\n\n**`details` da reserva** (JSONB livre — paridade total com voucher tipo `hotel`):\n- `address`, `phone`, `email`, `website`, `reservation_code`, `online_check_in_url`\n- `wifi_network`, `wifi_password`\n- `breakfast`, `amenities`\n- `check_in_policy`, `check_out_policy`, `cancellation_policy`\n- `notes` (e qualquer campo extra)\n\n**`details` de cada quarto** (JSONB livre):\n- `floor` — Andar\n- `bed_configuration` — Configuração das camas (ex: \"1 king\", \"2 solteiros\")\n- `view` — Vista (mar, cidade, jardim)\n- `breakfast` — Café da manhã específico do quarto\n- `smoking` (bool) — Permite fumantes\n- `accessibility` — Recursos de acessibilidade\n- `amenities` — Comodidades específicas (cofre, frigobar, etc.)\n- `notes` — Observações específicas\n\n**Campos do quarto (raiz):** `title` (obrigatório), `code`, `max_occupancy`, `room_type`, `description`, `details`, `guests`."
          },
          "response": [
            {
              "name": "Reserva com quartos criada",
              "originalRequest": {
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"event_id\": \"uuid\",\n  \"title\": \"Reserva Copacabana Palace\",\n  \"hotel_name\": \"Copacabana Palace\",\n  \"total_rooms\": 15,\n  \"rooms\": [\n    { \"title\": \"Quarto 301\", \"guests\": [{ \"email\": \"joao@email.com\" }] }\n  ]\n}"
                },
                "url": {
                  "raw": "{{base_url}}/backoffice-api/hotel-reservations",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "backoffice-api",
                    "hotel-reservations"
                  ]
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"hotel_reservation\": {\n    \"id\": \"uuid-reserva\",\n    \"event_id\": \"uuid-evento\",\n    \"title\": \"Reserva Copacabana Palace\",\n    \"code\": \"CP-2026-001\",\n    \"hotel_name\": \"Copacabana Palace\",\n    \"check_in\": \"2026-06-15T15:00:00Z\",\n    \"check_out\": \"2026-06-18T12:00:00Z\",\n    \"total_rooms\": 15,\n    \"rooming_config\": null,\n    \"rooming_status\": null,\n    \"created_at\": \"2026-03-26T10:00:00Z\",\n    \"updated_at\": \"2026-03-26T10:00:00Z\"\n  },\n  \"rooms_created\": [\n    {\n      \"voucher\": {\n        \"id\": \"uuid-voucher-301\",\n        \"title\": \"Quarto 301 - Suíte Deluxe\",\n        \"code\": \"CP-301\",\n        \"type\": \"hotel\",\n        \"status\": \"active\",\n        \"hotel_reservation_id\": \"uuid-reserva\"\n      },\n      \"voucher_guests\": [\n        {\n          \"id\": \"uuid-vg-1\",\n          \"user_id\": \"uuid-joao\",\n          \"status\": \"active\",\n          \"allocated_by\": \"api\"\n        },\n        {\n          \"id\": \"uuid-vg-2\",\n          \"user_id\": \"uuid-maria\",\n          \"status\": \"active\",\n          \"allocated_by\": \"api\"\n        }\n      ]\n    },\n    {\n      \"voucher\": {\n        \"id\": \"uuid-voucher-302\",\n        \"title\": \"Quarto 302 - Standard\",\n        \"code\": \"CP-302\",\n        \"type\": \"hotel\",\n        \"status\": \"active\",\n        \"hotel_reservation_id\": \"uuid-reserva\"\n      },\n      \"voucher_guests\": []\n    }\n  ]\n}"
            }
          ]
        },
        {
          "name": "Criar Reserva com Quarto com Datas Próprias (v5.8)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Reserva com datas mistas\",\n  \"hotel_name\": \"Copacabana Palace\",\n  \"check_in\": \"2026-06-15T15:00:00Z\",\n  \"check_out\": \"2026-06-18T12:00:00Z\",\n  \"rooms\": [\n    {\n      \"title\": \"Quarto padrão (datas do hotel)\",\n      \"max_occupancy\": 2,\n      \"guests\": []\n    },\n    {\n      \"title\": \"Quarto VIP (chega 1 dia antes, sai 1 dia depois)\",\n      \"max_occupancy\": 2,\n      \"check_in\": \"2026-06-14T15:00:00Z\",\n      \"check_out\": \"2026-06-19T12:00:00Z\",\n      \"guests\": [\n        { \"email\": \"vip1@empresa.com\" },\n        { \"email\": \"vip2@empresa.com\" }\n      ]\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/hotel-reservations",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "hotel-reservations"
              ]
            },
            "description": "Exemplo v5.8: cada quarto pode ter `check_in` e `check_out` próprios.\n\n- Quando informados, sobrescrevem as datas do hotel apenas para aquele quarto e são gravados em `details.custom_check_in`/`details.custom_check_out`.\n- Devem ser enviados juntos e `check_out` > `check_in`.\n- Quartos com datas próprias **exigem `guests[]`** porque ficam fora da sugestão automática de rooming (`suggest-rooming` ignora esses quartos).\n- Quartos sem essas datas continuam herdando as datas da reserva (comportamento anterior preservado)."
          }
        },
        {
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"title\": \"Reserva Copacabana Palace - Atualizada\",\n  \"code\": \"CP-2026-001\",\n  \"hotel_name\": \"Copacabana Palace\",\n  \"check_in\": \"2026-06-16T15:00:00Z\",\n  \"check_out\": \"2026-06-19T12:00:00Z\",\n  \"total_rooms\": 20,\n  \"rooming_status\": \"collecting\",\n  \"rooming_config\": {\n    \"enabled\": true,\n    \"max_guests_per_room\": 2,\n    \"matching_rules\": [\"gender\"],\n    \"deadline\": \"2026-06-10T23:59:59Z\",\n    \"instructions\": \"Escolha até 1 colega de quarto.\"\n  },\n  \"details\": {\n    \"address\": \"Av. Atlântica, 1702\",\n    \"phone\": \"+55 21 2548-7070\",\n    \"notes\": \"Late checkout disponível\"\n  },\n  \"rooms\": [\n    {\n      \"title\": \"Quarto 305 - Suíte\",\n      \"code\": \"CP-305\",\n      \"max_occupancy\": 2,\n      \"room_type\": \"suite\",\n      \"guests\": [{ \"email\": \"novo.hospede@empresa.com\" }]\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/hotel-reservations/{{hotel_reservation_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "hotel-reservations",
                "{{hotel_reservation_id}}"
              ]
            },
            "description": "Atualiza os dados de uma reserva de hotel.\n\n**Aceita o mesmo payload do POST** — `event_id` é silenciosamente ignorado. O array `rooms[]`, quando enviado, **adiciona novos quartos** à reserva (não substitui os existentes).\n\n**Comportamento de campos:**\n- **Ausente**: mantém valor atual\n- **String vazia (`\"\"`)**: ignorado (mantém valor atual)\n- **`null`**: limpa o campo (apenas em campos nullable: `code`, `hotel_name`, `total_rooms`, `details` — limpa para `{}`)\n\n**Campos atualizáveis:** `title`, `code`, `hotel_name`, `check_in`, `check_out`, `details`, `rooming_config`, `rooming_status`, `total_rooms`, `rooms[]`\n\n**`rooming_config` (JSONB):**\n- `enabled` (bool), `max_guests_per_room` (int), `matching_rules` (string[]), `deadline` (ISO), `instructions` (string)\n\n**`rooming_status`:** `draft` → `collecting` → `closed` → `allocated`\n\n**`rooms[]`** (mesma estrutura do POST): cria novos quartos (vouchers tipo hotel) vinculados à reserva e aloca os convidados informados via `voucher_guests` com `allocated_by: \"api\"`."
          },
          "response": [
            {
              "name": "200 - Reserva atualizada",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-reserva\",\n  \"title\": \"Reserva Copacabana Palace - Atualizada\",\n  \"hotel_name\": \"Copacabana Palace\",\n  \"code\": \"CP-2026-001\",\n  \"check_in\": \"2026-06-16T15:00:00Z\",\n  \"check_out\": \"2026-06-19T12:00:00Z\",\n  \"total_rooms\": 15,\n  \"rooming_status\": \"collecting\",\n  \"rooming_config\": {\n    \"enabled\": true,\n    \"max_guests_per_room\": 2,\n    \"matching_rules\": [\n      \"gender\"\n    ],\n    \"deadline\": \"2026-06-10T23:59:59Z\"\n  }\n}"
            }
          ],
          "name": "Atualizar Reserva de Hotel"
        },
        {
          "name": "Deletar Reserva de Hotel",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/hotel-reservations/{{hotel_reservation_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "hotel-reservations",
                "{{hotel_reservation_id}}"
              ]
            },
            "description": "Remove uma reserva de hotel.\n\n**Atenção:** Deletar uma reserva NÃO deleta os vouchers (quartos) vinculados. Os vouchers permanecem ativos, mas perdem a referência à reserva."
          },
          "response": [
            {
              "name": "200 - Reserva removida",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true\n}"
            }
          ]
        },
        {
          "name": "Listar Preferências de Rooming",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/hotel-reservations/{{hotel_reservation_id}}/rooming-preferences",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "hotel-reservations",
                "{{hotel_reservation_id}}",
                "rooming-preferences"
              ]
            },
            "description": "Lista as preferências de quarto enviadas pelos convidados para esta reserva.\n\n**Retorna:** Array de preferências com perfis dos convidados e dos colegas preferidos.\n\n**Resposta:**\n```json\n{\n  \"preferences\": [\n    {\n      \"id\": \"uuid\",\n      \"hotel_reservation_id\": \"uuid\",\n      \"user_id\": \"uuid\",\n      \"preferred_roommate_ids\": [\"uuid-1\", \"uuid-2\"],\n      \"notes\": \"Prefiro andar alto\",\n      \"submitted_at\": \"2026-06-05T10:00:00Z\",\n      \"profile\": { \"full_name\": \"João Silva\", \"email\": \"joao@email.com\" },\n      \"preferred_profiles\": [\n        { \"id\": \"uuid-1\", \"full_name\": \"Maria Santos\" }\n      ]\n    }\n  ]\n}\n```"
          },
          "response": [
            {
              "name": "200 - Preferências listadas",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "[\n  {\n    \"user_id\": \"uuid-user\",\n    \"preferred_roommates\": [\n      \"uuid-user2\"\n    ],\n    \"gender\": \"male\",\n    \"submitted_at\": \"2026-03-15T10:00:00Z\"\n  }\n]"
            }
          ]
        },
        {
          "name": "Gerar Sugestão de Rooming (IA)",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/hotel-reservations/{{hotel_reservation_id}}/rooming-suggest",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "hotel-reservations",
                "{{hotel_reservation_id}}",
                "rooming-suggest"
              ]
            },
            "description": "Executa o algoritmo de matching inteligente para sugerir a distribuição de convidados nos quartos.\n\n**Prioridades do algoritmo:**\n1. Matches mútuos (A escolheu B e B escolheu A)\n2. Match unilateral com compatibilidade de regras\n3. Agrupamento por regras sem preferência explícita\n4. Preenchimento até `max_guests_per_room`\n\n**Regras de compatibilidade (`matching_rules`):**\n- `gender` — Agrupa por gênero (campo `custom_data.gender` do perfil)\n- `department` — Agrupa por departamento (campo `custom_data.department`)\n\n**Resposta:**\n```json\n{\n  \"rooms\": [\n    {\n      \"voucher_id\": \"uuid-quarto\",\n      \"title\": \"Quarto 301\",\n      \"suggested_guests\": [\n        { \"user_id\": \"uuid-1\", \"full_name\": \"João Silva\" },\n        { \"user_id\": \"uuid-2\", \"full_name\": \"Maria Santos\" }\n      ]\n    }\n  ],\n  \"unmatched\": [\n    { \"user_id\": \"uuid-5\", \"full_name\": \"Pedro Lima\" }\n  ]\n}\n```\n\n**Nota:** Este endpoint apenas sugere — não altera dados. Use `rooming-confirm` para confirmar a alocação."
          },
          "response": [
            {
              "name": "200 - Sugestão gerada",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"rooms\": [\n    {\n      \"room_number\": 1,\n      \"guests\": [\n        {\n          \"user_id\": \"uuid-user\",\n          \"full_name\": \"João Silva\"\n        }\n      ]\n    }\n  ],\n  \"unallocated\": []\n}"
            }
          ]
        },
        {
          "name": "Confirmar Alocação de Rooming",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"allocations\": [\n    {\n      \"voucher_id\": \"uuid-quarto-301\",\n      \"user_ids\": [\"uuid-user-1\", \"uuid-user-2\"]\n    },\n    {\n      \"voucher_id\": \"uuid-quarto-302\",\n      \"user_ids\": [\"uuid-user-3\"]\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/hotel-reservations/{{hotel_reservation_id}}/rooming-confirm",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "hotel-reservations",
                "{{hotel_reservation_id}}",
                "rooming-confirm"
              ]
            },
            "description": "Confirma a alocação de quartos, criando os registros de `voucher_guests` automaticamente.\n\n**Body:**\n- `allocations[]` — Array de objetos com:\n  - `voucher_id` — ID do voucher (quarto)\n  - `user_ids` — Array de UUIDs dos convidados a alocar\n\n**Comportamento:**\n1. Cria `voucher_guests` com `allocated_by: 'rooming_auto'` e `status: 'active'`\n2. Atualiza `rooming_status` da reserva para `allocated`\n3. Retorna resumo da alocação\n\n**Resposta:**\n```json\n{\n  \"success\": true,\n  \"allocated_count\": 3,\n  \"rooms_filled\": 2\n}\n```"
          },
          "response": [
            {
              "name": "200 - Alocação confirmada",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"allocated_rooms\": 10\n}"
            }
          ]
        },
        {
          "name": "Consultar Rooming List",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/hotel-reservations/{{hotel_reservation_id}}/rooming-list",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "hotel-reservations",
                "{{hotel_reservation_id}}",
                "rooming-list"
              ]
            },
            "description": "Retorna o rooming list completo de uma reserva com quartos, convidados e perfis.\n\n**Resposta:**\n```json\n{\n  \"reservation\": {\n    \"id\": \"uuid\",\n    \"title\": \"Reserva Copacabana Palace\",\n    \"hotel_name\": \"Copacabana Palace\",\n    \"check_in\": \"2026-06-15T15:00:00Z\",\n    \"check_out\": \"2026-06-18T12:00:00Z\",\n    \"rooming_status\": \"allocated\"\n  },\n  \"rooms\": [\n    {\n      \"voucher_id\": \"uuid\",\n      \"title\": \"Quarto 301\",\n      \"code\": \"CP-301\",\n      \"guests\": [\n        {\n          \"user_id\": \"uuid\",\n          \"full_name\": \"João Silva\",\n          \"email\": \"joao@email.com\",\n          \"phone\": \"+5511999999999\",\n          \"allocated_by\": \"rooming_auto\",\n          \"status\": \"active\"\n        }\n      ]\n    }\n  ],\n  \"summary\": {\n    \"total_rooms\": 10,\n    \"occupied_rooms\": 8,\n    \"total_guests\": 15,\n    \"empty_rooms\": 2\n  }\n}\n```"
          },
          "response": [
            {
              "name": "200 - Rooming list",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"summary\": {\n    \"total_rooms\": 15,\n    \"created_rooms\": 10,\n    \"allocated_guests\": 18\n  },\n  \"rooms\": []\n}"
            }
          ]
        },
        {
          "name": "Rooming List Consolidado (Evento)",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/hotel-reservations?event_id={{event_id}}&format=rooming-list",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "hotel-reservations"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                },
                {
                  "key": "format",
                  "value": "rooming-list"
                }
              ]
            },
            "description": "Retorna o rooming list consolidado de TODAS as reservas de hotel do evento.\n\n**Query params:**\n- `event_id` (obrigatório) — ID do evento\n- `format=rooming-list` — Ativa o formato consolidado\n\n**Resposta:**\n```json\n{\n  \"event_id\": \"uuid\",\n  \"reservations\": [\n    {\n      \"id\": \"uuid\",\n      \"title\": \"Reserva Copacabana Palace\",\n      \"hotel_name\": \"Copacabana Palace\",\n      \"rooming_status\": \"allocated\",\n      \"rooms\": [...],\n      \"summary\": { \"total_rooms\": 10, \"occupied_rooms\": 8 }\n    }\n  ],\n  \"total_summary\": {\n    \"total_reservations\": 2,\n    \"total_rooms\": 20,\n    \"total_guests\": 35,\n    \"occupancy_percent\": 87.5\n  }\n}\n```"
          },
          "response": [
            {
              "name": "200 - Rooming consolidado",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"reservations\": [\n    {\n      \"summary\": {\n        \"total_rooms\": 15,\n        \"created_rooms\": 10,\n        \"allocated_guests\": 18\n      },\n      \"rooms\": []\n    }\n  ]\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "📋 Agenda",
      "description": "Gerenciamento de itens da agenda do evento",
      "item": [
        {
          "name": "Listar Todos os Itens",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 200) {",
                  "    var jsonData = pm.response.json();",
                  "    if (jsonData.agenda_items && jsonData.agenda_items.length > 0) {",
                  "        pm.collectionVariables.set('agenda_item_id', jsonData.agenda_items[0].id);",
                  "    }",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/agenda",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "agenda"
              ]
            },
            "description": "Lista todos os itens de agenda de todos os eventos."
          },
          "response": [
            {
              "name": "200 - Lista de itens",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "[\n  {\n    \"id\": \"uuid-agenda-item\",\n    \"event_id\": \"uuid-event\",\n    \"title\": \"Palestra de Abertura\",\n    \"type\": \"session\",\n    \"start_time\": \"2026-06-15T09:00:00Z\",\n    \"end_time\": \"2026-06-15T10:30:00Z\",\n    \"location\": \"Auditório Principal\",\n    \"description\": \"Palestra inaugural do evento\",\n    \"speakers\": [\n      \"Dr. Carlos Mendes\"\n    ],\n    \"allow_qa\": true,\n    \"requires_confirmation\": false,\n    \"capacity\": null\n  }\n]"
            }
          ]
        },
        {
          "name": "Listar Itens por Evento",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/agenda?event_id={{event_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "agenda"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                }
              ]
            },
            "description": "Lista todos os itens de agenda de um evento específico."
          },
          "response": [
            {
              "name": "Lista de itens de agenda",
              "originalRequest": {
                "method": "GET",
                "url": {
                  "raw": "{{base_url}}/backoffice-api/agenda?event_id={{event_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "backoffice-api",
                    "agenda"
                  ],
                  "query": [
                    {
                      "key": "event_id",
                      "value": "{{event_id}}"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"agenda_items\": [\n    {\n      \"id\": \"uuid\",\n      \"event_id\": \"uuid\",\n      \"title\": \"Palestra de Abertura\",\n      \"description\": \"Palestra principal do evento\",\n      \"start_time\": \"2025-03-15T09:00:00Z\",\n      \"end_time\": \"2025-03-15T10:00:00Z\",\n      \"type\": \"session\",\n      \"location\": \"Auditório Principal\",\n      \"speakers\": [\"João Silva\", \"Maria Santos\"],\n      \"capacity\": 500,\n      \"requires_confirmation\": false,\n      \"allow_qa\": true\n    }\n  ]\n}"
            }
          ]
        },
        {
          "name": "Obter Item por ID",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/agenda/{{agenda_item_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "agenda",
                "{{agenda_item_id}}"
              ]
            },
            "description": "Obtém os detalhes de um item de agenda."
          },
          "response": [
            {
              "name": "200 - Item encontrado",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-agenda-item\",\n  \"event_id\": \"uuid-event\",\n  \"title\": \"Palestra de Abertura\",\n  \"type\": \"session\",\n  \"start_time\": \"2026-06-15T09:00:00Z\",\n  \"end_time\": \"2026-06-15T10:30:00Z\",\n  \"location\": \"Auditório Principal\",\n  \"description\": \"Palestra inaugural do evento\",\n  \"speakers\": [\n    \"Dr. Carlos Mendes\"\n  ],\n  \"allow_qa\": true,\n  \"requires_confirmation\": false,\n  \"capacity\": null\n}"
            },
            {
              "name": "404 - Não encontrado",
              "originalRequest": null,
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": \"Agenda item not found\"\n}"
            }
          ]
        },
        {
          "name": "Criar Item - Sessão com Q&A",
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    var jsonData = pm.response.json();",
                  "    if (jsonData.agenda_item) {",
                  "        pm.collectionVariables.set('agenda_item_id', jsonData.agenda_item.id);",
                  "    }",
                  "}"
                ],
                "type": "text/javascript"
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Palestra de Abertura\",\n  \"description\": \"Palestra principal sobre o futuro da tecnologia\",\n  \"rich_description\": \"## Sobre a Palestra\\n\\nNesta palestra, abordaremos:\\n\\n- Tendências de 2025\\n- IA Generativa\\n- Sustentabilidade em Tech\\n\\n[Mais informações](https://evento.com/keynote)\",\n  \"start_time\": \"2025-03-15T09:00:00Z\",\n  \"end_time\": \"2025-03-15T10:00:00Z\",\n  \"type\": \"session\",\n  \"location\": \"Auditório Principal\",\n  \"speakers\": [\"João Silva - CEO TechCorp\", \"Maria Santos - CTO Inovação\"],\n  \"capacity\": 500,\n  \"requires_confirmation\": false,\n  \"allow_qa\": true\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/agenda",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "agenda"
              ]
            },
            "description": "Cria um item de agenda do tipo `session` com Q&A habilitado.\n\n**Campos obrigatórios:** `event_id`, `title`, `start_time`, `end_time`\n\n**Campos opcionais:** `description`, `rich_description` (HTML), `location`, `speakers` (array de strings), `type` (session|activity|break|meal|transfer|free_time), `allow_qa` (boolean), `requires_confirmation` (boolean), `capacity` (integer)\n\nQuando `allow_qa: true`, os convidados podem enviar perguntas visíveis na aba Q&A do item."
          },
          "response": [
            {
              "name": "201 - Item criado",
              "originalRequest": null,
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-agenda-item\",\n  \"event_id\": \"uuid-event\",\n  \"title\": \"Palestra de Abertura\",\n  \"type\": \"session\",\n  \"start_time\": \"2026-06-15T09:00:00Z\",\n  \"end_time\": \"2026-06-15T10:30:00Z\",\n  \"location\": \"Auditório Principal\",\n  \"description\": \"Palestra inaugural do evento\",\n  \"speakers\": [\n    \"Dr. Carlos Mendes\"\n  ],\n  \"allow_qa\": true,\n  \"requires_confirmation\": false,\n  \"capacity\": null\n}"
            }
          ]
        },
        {
          "name": "Criar Item - Atividade com Vagas Limitadas",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Atividade: React Avançado\",\n  \"description\": \"Aprenda técnicas avançadas de React com especialistas\",\n  \"rich_description\": \"## Requisitos\\n\\n- Notebook com Node.js 18+\\n- Conhecimento básico de React\\n\\n## O que você vai aprender\\n\\n1. Server Components\\n2. Suspense e Concurrent Mode\\n3. Performance Optimization\",\n  \"start_time\": \"2025-03-15T14:00:00Z\",\n  \"end_time\": \"2025-03-15T17:00:00Z\",\n  \"type\": \"activity\",\n  \"location\": \"Sala 101\",\n  \"speakers\": [\"Pedro Desenvolvedor\"],\n  \"capacity\": 30,\n  \"requires_confirmation\": true,\n  \"allow_qa\": true\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/agenda",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "agenda"
              ]
            },
            "description": "Cria um item de agenda do tipo `activity` com controle de vagas.\n\n**Campos obrigatórios:** `event_id`, `title`, `start_time`, `end_time`\n\nQuando `requires_confirmation: true` e `capacity` é definido, o app controla inscrições até atingir o limite. Convidados podem confirmar/cancelar presença na atividade."
          },
          "response": [
            {
              "name": "201 - Item criado",
              "originalRequest": null,
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-agenda-item\",\n  \"event_id\": \"uuid-event\",\n  \"title\": \"Palestra de Abertura\",\n  \"type\": \"session\",\n  \"start_time\": \"2026-06-15T09:00:00Z\",\n  \"end_time\": \"2026-06-15T10:30:00Z\",\n  \"location\": \"Auditório Principal\",\n  \"description\": \"Palestra inaugural do evento\",\n  \"speakers\": [\n    \"Dr. Carlos Mendes\"\n  ],\n  \"allow_qa\": true,\n  \"requires_confirmation\": false,\n  \"capacity\": null\n}"
            }
          ]
        },
        {
          "name": "Criar Item - Coffee Break",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Coffee Break\",\n  \"description\": \"Pausa para networking e café\",\n  \"start_time\": \"2025-03-15T10:30:00Z\",\n  \"end_time\": \"2025-03-15T11:00:00Z\",\n  \"type\": \"break\",\n  \"location\": \"Foyer Principal\"\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/agenda",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "agenda"
              ]
            },
            "description": "Cria um intervalo na programação."
          },
          "response": [
            {
              "name": "201 - Item criado",
              "originalRequest": null,
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-agenda-item\",\n  \"event_id\": \"uuid-event\",\n  \"title\": \"Palestra de Abertura\",\n  \"type\": \"session\",\n  \"start_time\": \"2026-06-15T09:00:00Z\",\n  \"end_time\": \"2026-06-15T10:30:00Z\",\n  \"location\": \"Auditório Principal\",\n  \"description\": \"Palestra inaugural do evento\",\n  \"speakers\": [\n    \"Dr. Carlos Mendes\"\n  ],\n  \"allow_qa\": true,\n  \"requires_confirmation\": false,\n  \"capacity\": null\n}"
            }
          ]
        },
        {
          "name": "Criar Itens em Lote",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"agenda_items\": [\n    {\n      \"event_id\": \"{{event_id}}\",\n      \"title\": \"Abertura\",\n      \"description\": \"Boas-vindas e apresentação do evento\",\n      \"start_time\": \"2025-03-15T08:30:00Z\",\n      \"end_time\": \"2025-03-15T09:00:00Z\",\n      \"type\": \"session\",\n      \"location\": \"Auditório Principal\"\n    },\n    {\n      \"event_id\": \"{{event_id}}\",\n      \"title\": \"Palestra: O Futuro da IA\",\n      \"start_time\": \"2025-03-15T09:00:00Z\",\n      \"end_time\": \"2025-03-15T10:00:00Z\",\n      \"type\": \"session\",\n      \"location\": \"Auditório Principal\",\n      \"speakers\": [\"Dr. Carlos AI\"],\n      \"allow_qa\": true\n    },\n    {\n      \"event_id\": \"{{event_id}}\",\n      \"title\": \"Coffee Break\",\n      \"start_time\": \"2025-03-15T10:00:00Z\",\n      \"end_time\": \"2025-03-15T10:30:00Z\",\n      \"type\": \"break\",\n      \"location\": \"Foyer\"\n    },\n    {\n      \"event_id\": \"{{event_id}}\",\n      \"title\": \"Networking: Startups em 2025\",\n      \"start_time\": \"2025-03-15T10:30:00Z\",\n      \"end_time\": \"2025-03-15T12:00:00Z\",\n      \"type\": \"networking\",\n      \"location\": \"Auditório Principal\",\n      \"speakers\": [\"Ana Founder\", \"Bruno VC\", \"Carla Tech\"]\n    },\n    {\n      \"event_id\": \"{{event_id}}\",\n      \"title\": \"Almoço\",\n      \"start_time\": \"2025-03-15T12:00:00Z\",\n      \"end_time\": \"2025-03-15T14:00:00Z\",\n      \"type\": \"meal\",\n      \"location\": \"Restaurante\"\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/agenda/bulk",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "agenda",
                "bulk"
              ]
            },
            "description": "Cria múltiplos itens de agenda em uma única chamada.\n\nEnvie um array `items[]` com os mesmos campos do POST individual. Todos os itens devem pertencer ao mesmo evento.\n\nRetorna `{ \"created\": [...], \"count\": N }`."
          },
          "response": [
            {
              "name": "201 - Itens criados",
              "originalRequest": null,
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"created\": [\n    {\n      \"id\": \"uuid-agenda-item\",\n      \"event_id\": \"uuid-event\",\n      \"title\": \"Palestra de Abertura\",\n      \"type\": \"session\",\n      \"start_time\": \"2026-06-15T09:00:00Z\",\n      \"end_time\": \"2026-06-15T10:30:00Z\",\n      \"location\": \"Auditório Principal\",\n      \"description\": \"Palestra inaugural do evento\",\n      \"speakers\": [\n        \"Dr. Carlos Mendes\"\n      ],\n      \"allow_qa\": true,\n      \"requires_confirmation\": false,\n      \"capacity\": null\n    }\n  ],\n  \"count\": 1\n}"
            }
          ]
        },
        {
          "name": "Atualizar Item",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"title\": \"Workshop de React - Turma Extra\",\n  \"description\": \"Workshop hands-on com React e TypeScript\",\n  \"rich_description\": \"<p>Sessão prática...</p>\",\n  \"type\": \"workshop\",\n  \"start_time\": \"2026-06-15T14:00:00Z\",\n  \"end_time\": \"2026-06-15T17:00:00Z\",\n  \"location\": \"Sala 201\",\n  \"speakers\": [\"Pedro Desenvolvedor\", \"Ana Programadora\"],\n  \"capacity\": 50,\n  \"requires_confirmation\": true,\n  \"allow_qa\": true\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/agenda/{{agenda_item_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "agenda",
                "{{agenda_item_id}}"
              ]
            },
            "description": "Atualiza um item de agenda existente.\n\n**Aceita o mesmo payload do POST** — `event_id` é silenciosamente ignorado.\n\n**Comportamento de campos:**\n- **Ausente**: mantém valor atual\n- **String vazia (`\"\"`)**: ignorado (mantém valor atual)\n- **`null`**: limpa o campo (apenas em campos nullable: `description`, `rich_description`, `location`, `speakers`, `capacity`)\n\n**Campos atualizáveis:** `title`, `description`, `rich_description`, `start_time`, `end_time`, `location`, `type`, `speakers`, `capacity`, `requires_confirmation`, `allow_qa`\n\n**Validações preservadas:**\n- `type`: `session`, `break`, `meal`, `networking`, `activity`, `workshop`, `keynote`, `panel`\n- `start_time`/`end_time`: formato ISO obrigatório quando enviados\n- `capacity`: inteiro positivo ou `null`"
          },
          "response": [
            {
              "name": "200 - Item atualizado",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-agenda-item\",\n  \"event_id\": \"uuid-event\",\n  \"title\": \"Palestra de Abertura\",\n  \"type\": \"session\",\n  \"start_time\": \"2026-06-15T09:00:00Z\",\n  \"end_time\": \"2026-06-15T10:30:00Z\",\n  \"location\": \"Auditório Principal\",\n  \"description\": \"Palestra inaugural do evento\",\n  \"speakers\": [\n    \"Dr. Carlos Mendes\"\n  ],\n  \"allow_qa\": true,\n  \"requires_confirmation\": false,\n  \"capacity\": null\n}"
            }
          ]
        },
        {
          "name": "Deletar Item",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/agenda/{{agenda_item_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "agenda",
                "{{agenda_item_id}}"
              ]
            },
            "description": "Remove um item de agenda permanentemente."
          },
          "response": [
            {
              "name": "200 - Item removido",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true\n}"
            }
          ]
        },
        {
          "name": "Listar Anexos do Item",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/agenda/{{agenda_item_id}}/attachments",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "agenda",
                "{{agenda_item_id}}",
                "attachments"
              ]
            },
            "description": "Lista todos os anexos de um item de agenda."
          },
          "response": [
            {
              "name": "200 - Anexos listados",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "[\n  {\n    \"id\": \"uuid\",\n    \"file_name\": \"slides.pdf\",\n    \"file_type\": \"application/pdf\",\n    \"file_size\": 2048000,\n    \"storage_path\": \"agenda-attachments/uuid/slides.pdf\",\n    \"created_at\": \"2026-03-15T10:00:00Z\"\n  }\n]"
            }
          ]
        },
        {
          "name": "Listar Mensagens (Q&A)",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/agenda/{{agenda_item_id}}/messages",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "agenda",
                "{{agenda_item_id}}",
                "messages"
              ]
            },
            "description": "Lista todas as mensagens de perguntas e respostas de um item."
          },
          "response": [
            {
              "name": "200 - Mensagens listadas",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "[\n  {\n    \"id\": \"uuid\",\n    \"message\": \"Qual o horário de início?\",\n    \"user_id\": \"uuid-user\",\n    \"is_organizer_reply\": false,\n    \"created_at\": \"2026-03-15T10:00:00Z\"\n  }\n]"
            }
          ]
        }
      ]
    },
    {
      "name": "🔔 Notifications",
      "description": "Envio de notificações e consulta de preferências dos convidados",
      "item": [
        {
          "name": "Consultar Preferências de Notificação",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/notifications/preferences-stats?event_id={{event_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "notifications",
                "preferences-stats"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                }
              ]
            },
            "description": "Retorna estatísticas sobre as preferências de notificação dos convidados de um evento.\n\nInclui contagem de habilitados/desabilitados por categoria e lista de usuários que desativaram alguma categoria.\n\n**Categorias:** `event_updates`, `agenda_reminders`, `qa_replies`, `chat_messages`, `voucher_updates`, `survey_reminders`"
          },
          "response": [
            {
              "name": "200 - Preferências",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"user_id\": \"uuid-user\",\n  \"event_updates\": true,\n  \"chat_messages\": true,\n  \"agenda_reminders\": true,\n  \"voucher_updates\": true,\n  \"survey_reminders\": true,\n  \"qa_replies\": true\n}"
            }
          ]
        },
        {
          "name": "Enviar para Todos do Evento",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Bem-vindos ao Evento!\",\n  \"message\": \"O evento começa em 30 minutos. Estamos aguardando você no credenciamento!\",\n  \"type\": \"info\"\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/notifications",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "notifications"
              ]
            },
            "description": "Envia notificação para TODOS os convidados do evento.\n\n**Tipos:** `info`, `warning`, `success`, `alert`"
          },
          "response": [
            {
              "name": "Notificação enviada para todos",
              "originalRequest": {
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"event_id\": \"uuid\",\n  \"title\": \"Bem-vindos!\",\n  \"message\": \"O evento começa em 30 minutos.\",\n  \"type\": \"info\"\n}"
                },
                "url": {
                  "raw": "{{base_url}}/backoffice-api/notifications",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "backoffice-api",
                    "notifications"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"notification_count\": 45,\n  \"push_sent\": 38,\n  \"broadcast\": {\n    \"id\": \"uuid-broadcast\",\n    \"event_id\": \"uuid-evento\",\n    \"title\": \"Bem-vindos!\",\n    \"message\": \"O evento começa em 30 minutos.\",\n    \"notification_type\": \"info\",\n    \"target_count\": 45,\n    \"in_app_sent\": 45,\n    \"push_sent\": 38,\n    \"targeted\": false,\n    \"created_at\": \"2026-03-26T10:00:00Z\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Enviar com Imagem",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Nova Atração Confirmada!\",\n  \"message\": \"Temos uma surpresa especial para vocês! Confira os detalhes.\",\n  \"type\": \"info\",\n  \"image_url\": \"https://example.com/event-banner.jpg\"\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/notifications",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "notifications"
              ]
            },
            "description": "Envia notificação com imagem anexada.\n\n**Campo:** `image_url` (URL HTTP(S) válida, máx. 2.000 caracteres)"
          },
          "response": [
            {
              "name": "200 - Notificação enviada",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"notification_id\": \"uuid-notification\",\n  \"delivery_count\": 25\n}"
            }
          ]
        },
        {
          "name": "Enviar para Usuários Específicos",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"user_ids\": [\"{{user_id}}\"],\n  \"title\": \"Lembrete Especial\",\n  \"message\": \"Você foi convidado para o jantar VIP às 20h.\",\n  \"type\": \"success\"\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/notifications",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "notifications"
              ]
            },
            "description": "Envia notificação apenas para usuários específicos.\n\n**Limite:** máximo 100 user_ids por requisição."
          },
          "response": [
            {
              "name": "200 - Notificação enviada",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"notification_id\": \"uuid-notification\",\n  \"delivery_count\": 25\n}"
            }
          ]
        },
        {
          "name": "Enviar com Botão de Confirmação",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Confirme sua Presença\",\n  \"message\": \"O evento começa amanhã! Por favor, confirme sua participação.\",\n  \"type\": \"alert\",\n  \"actions\": [\n    {\n      \"type\": \"confirm_attendance\",\n      \"label\": \"Confirmar Presença\"\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/notifications",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "notifications"
              ]
            },
            "description": "Envia uma notificação com um botão de ação do tipo `confirm_attendance`.\n\n**Payload de ações:**\n```json\n\"actions\": [{ \"type\": \"confirm_attendance\", \"label\": \"Confirmar Presença\" }]\n```\n\nO botão confirma automaticamente a presença do convidado no evento."
          },
          "response": [
            {
              "name": "200 - Notificação enviada",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"notification_id\": \"uuid-notification\",\n  \"delivery_count\": 25\n}"
            }
          ]
        },
        {
          "name": "Enviar com Link para Voucher",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"user_ids\": [\"{{user_id}}\"],\n  \"title\": \"Seu Voucher de Almoço\",\n  \"message\": \"O almoço será servido das 12h às 14h no restaurante do evento.\",\n  \"type\": \"info\",\n  \"actions\": [\n    {\n      \"type\": \"open_voucher\",\n      \"label\": \"Ver Voucher\",\n      \"payload\": {\n        \"voucherId\": \"{{voucher_id}}\"\n      }\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/notifications",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "notifications"
              ]
            },
            "description": "Envia uma notificação com deep link para um voucher específico.\n\n**Payload de ações:**\n```json\n\"actions\": [{ \"type\": \"open_voucher\", \"label\": \"Ver Voucher\", \"voucher_id\": \"uuid\" }]\n```"
          },
          "response": [
            {
              "name": "200 - Notificação enviada",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"notification_id\": \"uuid-notification\",\n  \"delivery_count\": 25\n}"
            }
          ]
        },
        {
          "name": "Enviar com Link para Agenda",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Palestra Começando!\",\n  \"message\": \"A palestra 'O Futuro da IA' começa em 15 minutos no Auditório Principal.\",\n  \"type\": \"warning\",\n  \"actions\": [\n    {\n      \"type\": \"open_agenda\",\n      \"label\": \"Ver na Agenda\",\n      \"payload\": {\n        \"agendaItemId\": \"{{agenda_item_id}}\"\n      }\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/notifications",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "notifications"
              ]
            },
            "description": "Envia uma notificação com deep link para um item da agenda.\n\n**Payload de ações:**\n```json\n\"actions\": [{ \"type\": \"open_agenda_item\", \"label\": \"Ver Agenda\", \"agenda_item_id\": \"uuid\" }]\n```"
          },
          "response": [
            {
              "name": "200 - Notificação enviada",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"notification_id\": \"uuid-notification\",\n  \"delivery_count\": 25\n}"
            }
          ]
        },
        {
          "name": "Enviar com Link Externo",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Responda nossa Pesquisa\",\n  \"message\": \"Sua opinião é muito importante! Responda nossa pesquisa de satisfação.\",\n  \"type\": \"info\",\n  \"actions\": [\n    {\n      \"type\": \"link\",\n      \"label\": \"Responder Pesquisa\",\n      \"payload\": {\n        \"url\": \"https://forms.exemplo.com/pesquisa-evento\"\n      }\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/notifications",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "notifications"
              ]
            },
            "description": "Envia uma notificação com link externo que abre no navegador.\n\n**Payload de ações:**\n```json\n\"actions\": [{ \"type\": \"open_url\", \"label\": \"Acessar\", \"url\": \"https://...\" }]\n```"
          },
          "response": [
            {
              "name": "200 - Notificação enviada",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"notification_id\": \"uuid-notification\",\n  \"delivery_count\": 25\n}"
            }
          ]
        },
        {
          "name": "Enviar com Imagem e Ações",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Promoção Exclusiva!\",\n  \"message\": \"Confira nossa oferta especial para participantes do evento.\",\n  \"type\": \"info\",\n  \"image_url\": \"https://example.com/promo-banner.jpg\",\n  \"actions\": [\n    {\n      \"type\": \"link\",\n      \"label\": \"Ver Oferta\",\n      \"payload\": {\n        \"url\": \"https://example.com/offer\"\n      }\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/notifications",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "notifications"
              ]
            },
            "description": "Envia notificação com imagem e botões de ação."
          },
          "response": [
            {
              "name": "200 - Notificação enviada",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"notification_id\": \"uuid-notification\",\n  \"delivery_count\": 25\n}"
            }
          ]
        },
        {
          "name": "Enviar com Múltiplas Ações",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"title\": \"Atenção: Mudança de Sala\",\n  \"message\": \"O workshop de React foi transferido para a Sala 201. Por favor, verifique a nova agenda.\",\n  \"type\": \"warning\",\n  \"actions\": [\n    {\n      \"type\": \"open_agenda\",\n      \"label\": \"Ver Agenda Atualizada\"\n    },\n    {\n      \"type\": \"open_event\",\n      \"label\": \"Ver Evento\"\n    }\n  ]\n}"
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/notifications",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "notifications"
              ]
            },
            "description": "Envia uma notificação com mais de um botão de ação.\n\nO array `actions[]` suporta até 3 ações simultâneas. Tipos disponíveis: `confirm_attendance`, `open_voucher`, `open_agenda_item`, `open_url`, `open_survey`.\n\nCada ação requer `type` e `label`, mais o campo específico do tipo (ex: `voucher_id`, `url`, `agenda_item_id`)."
          },
          "response": [
            {
              "name": "200 - Notificação enviada",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"notification_id\": \"uuid-notification\",\n  \"delivery_count\": 25\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "⏰ Notification Broadcasts",
      "description": "Notificações agendadas para envio futuro. Reaproveitam toda a engine multi-canal de /notifications. Cancelamento possível enquanto status = pending.",
      "item": [
        {
          "name": "Agendar Broadcast",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/backoffice-api/notification-broadcasts",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "notification-broadcasts"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"scheduled_at\": \"2026-06-15T14:00:00Z\",\n  \"title\": \"Lembrete: programação amanhã\",\n  \"message\": \"Confira sua agenda personalizada.\",\n  \"type\": \"info\",\n  \"channels\": [\"in_app\", \"push\"],\n  \"user_ids\": [],\n  \"actions\": [\n    { \"type\": \"open_event\", \"label\": \"Ver evento\" }\n  ]\n}"
            },
            "description": "Agenda uma notificação para envio futuro. `scheduled_at` deve ser >= now + 1 minuto. Omitir `user_ids` envia para todos os convidados confirmados. 15min antes do envio, o organizador recebe um lembrete interno."
          },
          "response": []
        },
        {
          "name": "Listar Broadcasts por Evento",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/notification-broadcasts?event_id={{event_id}}&status=pending",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "notification-broadcasts"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                },
                {
                  "key": "status",
                  "value": "pending",
                  "description": "pending | sent | cancelled"
                }
              ]
            },
            "description": "Lista broadcasts agendados. Filtros: `event_id` (obrigatório para OAuth clients), `status`."
          },
          "response": []
        },
        {
          "name": "Cancelar Broadcast Pendente",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/notification-broadcasts/{{broadcast_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "notification-broadcasts",
                "{{broadcast_id}}"
              ]
            },
            "description": "Cancela um broadcast ainda não enviado. Retorna `409` se já estiver em `sent` ou `cancelled`."
          },
          "response": []
        }
      ]
    },
    {
      "name": "👫 Companions",
      "description": "Gerenciamento de acompanhantes (vinculação PAC ↔ dependente)",
      "item": [
        {
          "name": "Listar Acompanhantes por Evento",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/companions?event_id={{event_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "companions"
              ],
              "query": [
                {
                  "key": "event_id",
                  "value": "{{event_id}}"
                }
              ]
            },
            "description": "Lista todos os vínculos de acompanhantes de um evento.\n\nRetorna a tabela `companion_links` com dados do PAC e do acompanhante."
          },
          "response": [
            {
              "name": "Lista de acompanhantes",
              "originalRequest": {
                "method": "GET",
                "url": {
                  "raw": "{{base_url}}/backoffice-api/companions?event_id={{event_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "backoffice-api",
                    "companions"
                  ],
                  "query": [
                    {
                      "key": "event_id",
                      "value": "{{event_id}}"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"companions\": [\n    {\n      \"id\": \"uuid\",\n      \"event_id\": \"uuid\",\n      \"primary_guest_id\": \"uuid-do-pac\",\n      \"companion_pending_guest_id\": \"uuid-pending\",\n      \"companion_name\": \"Maria Silva\",\n      \"companion_profile_completed\": true,\n      \"companion_profile_data\": {\n        \"cpf\": \"12345678909\",\n        \"birth_date\": \"1995-03-15\"\n      },\n      \"created_at\": \"2026-03-01T10:00:00Z\"\n    }\n  ]\n}"
            }
          ]
        },
        {
          "name": "Obter Acompanhante por ID",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/companions/{{companion_link_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "companions",
                "{{companion_link_id}}"
              ]
            },
            "description": "Obtém os detalhes de um vínculo de acompanhante específico."
          },
          "response": [
            {
              "name": "200 - Acompanhante encontrado",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": \"uuid-link\",\n  \"event_id\": \"uuid-event\",\n  \"primary_guest_id\": \"uuid-primary\",\n  \"companion_name\": \"Maria Silva\",\n  \"companion_pending_guest_id\": \"uuid-companion-pg\",\n  \"companion_profile_completed\": true,\n  \"created_at\": \"2026-03-15T10:00:00Z\"\n}"
            },
            {
              "name": "404 - Não encontrado",
              "originalRequest": null,
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": \"Companion link not found\"\n}"
            }
          ]
        },
        {
          "name": "Criar Vínculo de Acompanhante",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"primary_email\": \"pac@email.com\",\n  \"companion_email\": \"acompanhante@email.com\",\n  \"companion_name\": \"Maria Silva\"\n}\n\n// Identificadores alternativos (usar UM por lado):\n// \"primary_user_id\": \"uuid\"\n// \"primary_pending_guest_id\": \"uuid\"\n// \"primary_external_id\": \"EXT-001\"\n// \"companion_user_id\": \"uuid\"\n// \"companion_pending_guest_id\": \"uuid\"\n// \"companion_external_id\": \"EXT-002\""
            },
            "url": {
              "raw": "{{base_url}}/backoffice-api/companions",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "companions"
              ]
            },
            "description": "Cria um vínculo entre um passageiro principal (PAC) e um acompanhante.\n\n**Campos obrigatórios:**\n- `event_id` (UUID válido)\n- Pelo menos **um** identificador para o PAC e **um** para o acompanhante\n\n**Identificadores (usar um por lado, prioridade: user_id → pending_guest_id → external_id → email):**\n- `primary_email` / `companion_email` — email do convidado\n- `primary_user_id` / `companion_user_id` — UUID do usuário registrado\n- `primary_pending_guest_id` / `companion_pending_guest_id` — UUID do convidado pendente\n- `primary_external_id` / `companion_external_id` — ID externo do sistema parceiro\n\n**Campos opcionais:**\n- `companion_name` (string, máx. 200 chars - auto-detectado se não informado)\n\n**Funcionalidades:**\n- O PAC pode preencher documentos do acompanhante via app\n- Notificações do acompanhante sem conta são redirecionadas ao PAC\n- Acompanhantes sem conta podem ter pulseiras NFC vinculadas\n- Ao se cadastrar, o acompanhante herda os dados preenchidos pelo PAC"
          },
          "response": [
            {
              "name": "Vínculo criado",
              "originalRequest": {
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"event_id\": \"{{event_id}}\",\n  \"primary_email\": \"pac@email.com\",\n  \"companion_email\": \"acompanhante@email.com\"\n}"
                },
                "url": {
                  "raw": "{{base_url}}/backoffice-api/companions",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "backoffice-api",
                    "companions"
                  ]
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"companion_link\": {\n    \"id\": \"uuid\",\n    \"event_id\": \"uuid\",\n    \"primary_guest_id\": \"uuid\",\n    \"companion_pending_guest_id\": \"uuid\",\n    \"companion_name\": \"Maria Silva\",\n    \"companion_profile_completed\": false,\n    \"companion_profile_data\": {},\n    \"created_at\": \"2026-03-01T10:00:00Z\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Deletar Vínculo de Acompanhante",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/companions/{{companion_link_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "companions",
                "{{companion_link_id}}"
              ]
            },
            "description": "Remove o vínculo de acompanhante pelo ID direto do link.\n\n**URL:** `DELETE /companions/{companion_link_id}`\n\nRemove apenas o vínculo — o convidado pendente (se existir) permanece na lista do evento."
          },
          "response": [
            {
              "name": "200 - Vínculo removido",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true\n}"
            }
          ]
        },
        {
          "name": "Deletar Vínculo por Pending Guest ID",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{base_url}}/backoffice-api/companions?companion_pending_guest_id={{pending_guest_id}}&event_id={{event_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "backoffice-api",
                "companions"
              ],
              "query": [
                {
                  "key": "companion_pending_guest_id",
                  "value": "{{pending_guest_id}}",
                  "description": "UUID do convidado pendente vinculado como acompanhante"
                },
                {
                  "key": "event_id",
                  "value": "{{event_id}}",
                  "description": "UUID do evento"
                }
              ]
            },
            "description": "Remove o vínculo de acompanhante usando o `companion_pending_guest_id` e `event_id` como query parameters.\n\n**URL:** `DELETE /companions?companion_pending_guest_id={uuid}&event_id={uuid}`\n\nÚtil quando o integrador conhece o ID do convidado pendente mas não o ID do link."
          },
          "response": [
            {
              "name": "200 - Vínculo removido",
              "originalRequest": null,
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "⚙️ Edge Functions",
      "description": "Funções automáticas do sistema",
      "item": [
        {
          "name": "Enviar Lembretes de Pesquisa",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{base_url}}/send-survey-reminders",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "send-survey-reminders"
              ]
            },
            "description": "Envia lembretes de pesquisa de satisfação para participantes de eventos que terminaram nas últimas 24 horas.\n\nNormalmente executado via cron job."
          },
          "response": [
            {
              "name": "Lembretes enviados",
              "originalRequest": {
                "method": "POST",
                "url": {
                  "raw": "{{base_url}}/send-survey-reminders",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "send-survey-reminders"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"message\": \"Survey reminders processed\",\n  \"notified\": 15,\n  \"skipped\": 5,\n  \"eventsProcessed\": 3\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Webhooks",
      "description": "Gerenciamento de webhooks outbound. O backoffice cadastra URLs e tipos de eventos para receber notificações em tempo real quando convidados realizam ações (confirmação, check-in, preenchimento de vouchers — incluindo seleção de tamanho de camiseta, etc.).\n\nEventos disponíveis:\n- guest.confirmed, guest.declined, guest.checked_in, guest.daily_checked_in, guest.agenda_checked_in\n- guest.profile_updated, guest.document_uploaded, guest.document_deleted\n- voucher.guest_input_completed, voucher.details_updated, voucher.choice_made, voucher.declined, voucher.marked_used, voucher.reactivated\n- companion.profile_completed, companion.profile_updated\n- agenda.confirmed, agenda.cancelled\n- rooming.preference_submitted\n- contact.request_sent, contact.request_accepted\n\n## Headers enviados ao seu endpoint\n- `X-Webhook-Signature: sha256=<hex>` — HMAC-SHA256 do body com o secret\n- `X-Event-Type` — tipo do evento\n- `X-Delivery-Id` — ID único desta tentativa (muda em cada retry)\n- `X-Idempotency-Key` — **UUID estável da ocorrência** (igual em todos os retries). USE ESTE para deduplicar.\n- `X-Event-Id` — UUID do evento Be Invited\n\n## Idempotência (obrigatório implementar)\nPersista `X-Idempotency-Key` em uma tabela com PRIMARY KEY. Em cada webhook, tente INSERT — se conflitar, é duplicado, responda 200 e ignore. Garante exactly-once mesmo com retries.\n\n## Política de retentativa\n1m → 5m → 30m → 2h → 12h (5 tentativas, depois failed_permanent). Timeout 10s.\n\n## Controle de fila interno\nReserva atômica via FOR UPDATE SKIP LOCKED — múltiplos dispatchers concorrentes nunca pegam a mesma entrega. Lotes de 50 a cada 1 minuto.",
      "item": [
        {
          "name": "Listar Webhooks",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{access_token}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/webhook-management/webhooks",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "webhook-management",
                "webhooks"
              ]
            },
            "description": "Lista todos os endpoints de webhook configurados pelo cliente OAuth autenticado."
          }
        },
        {
          "name": "Criar Webhook",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{access_token}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"https://meu-backoffice.com/webhooks/beinvited\",\n  \"event_types\": [\n    \"guest.confirmed\",\n    \"guest.checked_in\",\n    \"voucher.guest_input_completed\",\n    \"voucher.choice_made\",\n    \"voucher.declined\",\n    \"voucher.marked_used\"\n  ],\n  \"event_id_filter\": null,\n  \"description\": \"Sincronização de presenças e vouchers\",\n  \"is_active\": true\n}"
            },
            "url": {
              "raw": "{{base_url}}/webhook-management/webhooks",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "webhook-management",
                "webhooks"
              ]
            },
            "description": "Cria um novo endpoint de webhook. **A resposta inclui o `secret` apenas nesta requisição** — guarde-o com segurança, ele não pode ser recuperado depois.\n\nUse `event_id_filter` (UUID) para receber eventos de apenas um evento específico."
          },
          "response": [
            {
              "name": "Webhook criado",
              "originalRequest": {
                "method": "POST",
                "url": {
                  "raw": "{{base_url}}/webhook-management/webhooks",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "webhook-management",
                    "webhooks"
                  ]
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "body": "{\n  \"id\": \"a1b2c3d4-...\",\n  \"url\": \"https://meu-backoffice.com/webhooks/beinvited\",\n  \"event_types\": [\"guest.confirmed\", \"voucher.guest_input_completed\"],\n  \"event_id_filter\": null,\n  \"is_active\": true,\n  \"description\": \"Sincronização\",\n  \"created_at\": \"2026-04-27T14:00:00Z\",\n  \"secret\": \"whsec_a1b2c3...\"\n}"
            }
          ]
        },
        {
          "name": "Obter Webhook por ID",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{access_token}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/webhook-management/webhooks/{{webhook_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "webhook-management",
                "webhooks",
                "{{webhook_id}}"
              ]
            }
          }
        },
        {
          "name": "Atualizar Webhook",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{access_token}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event_types\": [\"guest.confirmed\", \"guest.checked_in\"],\n  \"is_active\": true\n}"
            },
            "url": {
              "raw": "{{base_url}}/webhook-management/webhooks/{{webhook_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "webhook-management",
                "webhooks",
                "{{webhook_id}}"
              ]
            },
            "description": "Atualiza url, event_types, event_id_filter, is_active ou description. Não altera o secret."
          }
        },
        {
          "name": "Deletar Webhook",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{access_token}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/webhook-management/webhooks/{{webhook_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "webhook-management",
                "webhooks",
                "{{webhook_id}}"
              ]
            }
          }
        },
        {
          "name": "Histórico de Entregas",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{access_token}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/webhook-management/webhooks/{{webhook_id}}/deliveries",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "webhook-management",
                "webhooks",
                "{{webhook_id}}",
                "deliveries"
              ]
            },
            "description": "Retorna as últimas 100 tentativas de entrega para este endpoint, com status, código HTTP da resposta e mensagem de erro (se houver)."
          }
        },
        {
          "name": "Reenviar Entrega",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{access_token}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/webhook-management/webhooks/{{webhook_id}}/redeliver/{{delivery_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "webhook-management",
                "webhooks",
                "{{webhook_id}}",
                "redeliver",
                "{{delivery_id}}"
              ]
            },
            "description": "Reenfileira uma entrega antiga (útil para re-sincronizar após indisponibilidade do backoffice)."
          }
        },
        {
          "name": "Disparar Evento de Teste",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{access_token}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/webhook-management/webhooks/{{webhook_id}}/test",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "webhook-management",
                "webhooks",
                "{{webhook_id}}",
                "test"
              ]
            },
            "description": "Envia um payload `webhook.test` para validar a integração."
          }
        }
      ]
    }
  ],
  "event": [
    {
      "listen": "prerequest",
      "script": {
        "type": "text/javascript",
        "exec": [
          ""
        ]
      }
    },
    {
      "listen": "test",
      "script": {
        "type": "text/javascript",
        "exec": [
          ""
        ]
      }
    }
  ]
}