{
    "info": {
        "_postman_id": "c5a1d7f0-4a55-4d0e-9b0b-de5712ab0001",
        "name": "API do DestinoLab Paraty v1.2.0",
        "description": "Collection oficial da API do DestinoLab Paraty.\n\n1. Em Variables, preencha client_id e client_secret (a credencial que a sua empresa recebeu).\n2. Chame \"Quem sou eu\": o token é pedido e renovado sozinho.\n3. \"Buscar e listar atrativos\" preenche as variáveis poi e qr_uuid; \"Cadastrar ponto de coleta\" preenche ponto_de_coleta.\n4. Publicar conteúdo, criar roteiro, publicar oferta, informar reserva e registrar saída preenchem conteudo, roteiro, oferta, reserva e saida.\n\nDocumentação: https://docs.destinolabparaty.com.br/",
        "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
    },
    "auth": {
        "type": "bearer",
        "bearer": [
            {
                "key": "token",
                "value": "{{token}}",
                "type": "string"
            }
        ]
    },
    "event": [
        {
            "listen": "prerequest",
            "script": {
                "type": "text/javascript",
                "exec": [
                    "// Pede o token (client_credentials) e o renova 30 s antes de vencer.",
                    "const id = pm.collectionVariables.get('client_id');",
                    "const segredo = pm.collectionVariables.get('client_secret');",
                    "const expira = parseInt(pm.collectionVariables.get('token_expira') || '0', 10);",
                    "if (id && segredo && Date.now() > expira - 30000) {",
                    "    pm.sendRequest({",
                    "        url: pm.collectionVariables.get('auth_url') + '/oauth/token',",
                    "        method: 'POST',",
                    "        header: { 'Content-Type': 'application/x-www-form-urlencoded' },",
                    "        auth: { type: 'basic', basic: [{ key: 'username', value: id }, { key: 'password', value: segredo }] },",
                    "        body: { mode: 'urlencoded', urlencoded: [{ key: 'grant_type', value: 'client_credentials' }] },",
                    "    }, function (erro, resposta) {",
                    "        if (erro || resposta.code !== 200) {",
                    "            console.error('Não foi possível obter o token', erro || resposta.text());",
                    "            return;",
                    "        }",
                    "        const dados = resposta.json();",
                    "        pm.collectionVariables.set('token', dados.access_token);",
                    "        pm.collectionVariables.set('token_expira', String(Date.now() + dados.expires_in * 1000));",
                    "    });",
                    "}"
                ]
            }
        }
    ],
    "variable": [
        {
            "key": "base_url",
            "value": "https://api.destinolabparaty.com.br",
            "type": "string"
        },
        {
            "key": "auth_url",
            "value": "https://auth.destinolabparaty.com.br",
            "type": "string"
        },
        {
            "key": "client_id",
            "value": "",
            "type": "string"
        },
        {
            "key": "client_secret",
            "value": "",
            "type": "string"
        },
        {
            "key": "token",
            "value": "",
            "type": "string"
        },
        {
            "key": "token_expira",
            "value": "0",
            "type": "string"
        },
        {
            "key": "poi",
            "value": "PTY-POI-0001",
            "type": "string"
        },
        {
            "key": "qr_uuid",
            "value": "",
            "type": "string"
        },
        {
            "key": "ponto_de_coleta",
            "value": "",
            "type": "string"
        },
        {
            "key": "operador",
            "value": "",
            "type": "string"
        },
        {
            "key": "equipamento",
            "value": "",
            "type": "string"
        },
        {
            "key": "evento",
            "value": "",
            "type": "string"
        },
        {
            "key": "selo",
            "value": "PTY-SEL-0000000000",
            "type": "string"
        },
        {
            "key": "pagina",
            "value": "sobre",
            "type": "string"
        },
        {
            "key": "sub",
            "value": "",
            "type": "string"
        },
        {
            "key": "token_visitante",
            "value": "",
            "type": "string"
        },
        {
            "key": "client_id_do_app",
            "value": "",
            "type": "string"
        },
        {
            "key": "conteudo",
            "value": "",
            "type": "string"
        },
        {
            "key": "roteiro",
            "value": "",
            "type": "string"
        },
        {
            "key": "oferta",
            "value": "",
            "type": "string"
        },
        {
            "key": "reserva",
            "value": "",
            "type": "string"
        },
        {
            "key": "saida",
            "value": "",
            "type": "string"
        }
    ],
    "item": [
        {
            "name": "Autenticação",
            "description": "Integração máquina a máquina usa OAuth 2.1 client_credentials: troque o client_id e o client_secret por um access_token (JWT RS256, 15 minutos) e mande-o em Authorization: Bearer. Não há refresh token nesse fluxo: peça outro token quando o atual vencer. O segredo nunca vai em URL nem em corpo JSON.",
            "item": [
                {
                    "name": "Obter token (client_credentials)",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "if (pm.response.code < 300) {",
                                    "    const dados = pm.response.json();",
                                    "    if ((dados || {}).access_token) { pm.collectionVariables.set('token', (dados || {}).access_token); }",
                                    "}"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "POST",
                        "header": [],
                        "url": {
                            "raw": "{{auth_url}}/oauth/token",
                            "host": [
                                "{{auth_url}}"
                            ],
                            "path": [
                                "oauth",
                                "token"
                            ]
                        },
                        "description": "Autentique o client por HTTP Basic (client_id:client_secret). O token sai com todos os escopos do client; para pedir menos, mande scope com os escopos separados por espaço. Até 60 chamadas por minuto por IP; 30 falhas por minuto bloqueiam o client por até 1 minuto.",
                        "auth": {
                            "type": "basic",
                            "basic": [
                                {
                                    "key": "username",
                                    "value": "{{client_id}}",
                                    "type": "string"
                                },
                                {
                                    "key": "password",
                                    "value": "{{client_secret}}",
                                    "type": "string"
                                }
                            ]
                        },
                        "body": {
                            "mode": "urlencoded",
                            "urlencoded": [
                                {
                                    "key": "grant_type",
                                    "value": "client_credentials"
                                }
                            ]
                        }
                    },
                    "response": []
                },
                {
                    "name": "Quem sou eu (teste de conectividade)",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/cliente",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "cliente"
                            ]
                        },
                        "description": "Devolve o client, o parceiro e os escopos do token. É a primeira chamada a fazer depois de receber a credencial."
                    },
                    "response": []
                },
                {
                    "name": "Conferir um token",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "POST",
                        "header": [],
                        "url": {
                            "raw": "{{auth_url}}/oauth/introspeccao",
                            "host": [
                                "{{auth_url}}"
                            ],
                            "path": [
                                "oauth",
                                "introspeccao"
                            ]
                        },
                        "description": "RFC 7662. Cada client só enxerga os próprios tokens; token de outro client responde active: false.",
                        "auth": {
                            "type": "basic",
                            "basic": [
                                {
                                    "key": "username",
                                    "value": "{{client_id}}",
                                    "type": "string"
                                },
                                {
                                    "key": "password",
                                    "value": "{{client_secret}}",
                                    "type": "string"
                                }
                            ]
                        },
                        "body": {
                            "mode": "urlencoded",
                            "urlencoded": [
                                {
                                    "key": "token",
                                    "value": "{{token}}"
                                }
                            ]
                        }
                    },
                    "response": []
                },
                {
                    "name": "Revogar um token",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "POST",
                        "header": [],
                        "url": {
                            "raw": "{{auth_url}}/oauth/revogar",
                            "host": [
                                "{{auth_url}}"
                            ],
                            "path": [
                                "oauth",
                                "revogar"
                            ]
                        },
                        "description": "RFC 7009. A chamada seguinte com o token revogado já responde 401. Responde 200 mesmo se o token não existir.",
                        "auth": {
                            "type": "basic",
                            "basic": [
                                {
                                    "key": "username",
                                    "value": "{{client_id}}",
                                    "type": "string"
                                },
                                {
                                    "key": "password",
                                    "value": "{{client_secret}}",
                                    "type": "string"
                                }
                            ]
                        },
                        "body": {
                            "mode": "urlencoded",
                            "urlencoded": [
                                {
                                    "key": "token",
                                    "value": "{{token}}"
                                }
                            ]
                        }
                    },
                    "response": []
                },
                {
                    "name": "Descoberta OIDC",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{auth_url}}/.well-known/openid-configuration",
                            "host": [
                                "{{auth_url}}"
                            ],
                            "path": [
                                ".well-known",
                                "openid-configuration"
                            ]
                        },
                        "description": "Endereços e capacidades do provedor de identidade.",
                        "auth": {
                            "type": "noauth"
                        }
                    },
                    "response": []
                },
                {
                    "name": "Chaves públicas (JWKS)",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{auth_url}}/.well-known/jwks.json",
                            "host": [
                                "{{auth_url}}"
                            ],
                            "path": [
                                ".well-known",
                                "jwks.json"
                            ]
                        },
                        "description": "Para quem quiser validar a assinatura do JWT por conta própria. A chave roda a cada 90 dias; a anterior segue publicada por 24 h.",
                        "auth": {
                            "type": "noauth"
                        }
                    },
                    "response": []
                }
            ]
        },
        {
            "name": "Atrativos (POIs)",
            "description": "O catálogo canônico: um código (PTY-POI-0001) e um UUID de QR Code por atrativo, iguais para as cinco soluções. Quem cria e publica é a curadoria (a Prefeitura); as soluções leem o que está publicado.",
            "item": [
                {
                    "name": "Buscar e listar atrativos",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });",
                                    "if (pm.response.code < 300) {",
                                    "    const dados = pm.response.json();",
                                    "    if ((((dados || {}).dados || {})[0] || {}).codigo) { pm.collectionVariables.set('poi', (((dados || {}).dados || {})[0] || {}).codigo); }",
                                    "    if ((((dados || {}).dados || {})[0] || {}).qr_uuid) { pm.collectionVariables.set('qr_uuid', (((dados || {}).dados || {})[0] || {}).qr_uuid); }",
                                    "}"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/pois?busca=praia&limite=20",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "pois"
                            ],
                            "query": [
                                {
                                    "key": "busca",
                                    "value": "praia",
                                    "description": "Texto no nome ou no nome traduzido (2 a 100 caracteres)",
                                    "disabled": false
                                },
                                {
                                    "key": "qr_uuid",
                                    "value": "",
                                    "description": "UUID lido no QR Code do atrativo: devolve o atrativo dono dele",
                                    "disabled": true
                                },
                                {
                                    "key": "categoria",
                                    "value": "",
                                    "description": "Código da categoria (inclui as filhas), como praia ou historico",
                                    "disabled": true
                                },
                                {
                                    "key": "tipo",
                                    "value": "",
                                    "description": "atrativo, equipamento, servico, area, ponto_embarque ou trilha",
                                    "disabled": true
                                },
                                {
                                    "key": "proximo_de",
                                    "value": "",
                                    "description": "lat,lng; exige raio_m e acrescenta distancia_m em cada item",
                                    "disabled": true
                                },
                                {
                                    "key": "raio_m",
                                    "value": "",
                                    "description": "Raio em metros, de 1 a 200000",
                                    "disabled": true
                                },
                                {
                                    "key": "atualizado_apos",
                                    "value": "",
                                    "description": "ISO 8601 com fuso: só o que mudou depois (sincronização incremental)",
                                    "disabled": true
                                },
                                {
                                    "key": "idioma",
                                    "value": "",
                                    "description": "pt-BR, en-US, es-ES ou fr-FR: idioma de nome e resumo, com fallback para pt-BR",
                                    "disabled": true
                                },
                                {
                                    "key": "slug",
                                    "value": "",
                                    "description": "Filtra pelo slug",
                                    "disabled": true
                                },
                                {
                                    "key": "status",
                                    "value": "",
                                    "description": "Só a curadoria: rascunho, em_revisao, publicado, suspenso, arquivado",
                                    "disabled": true
                                },
                                {
                                    "key": "limite",
                                    "value": "20",
                                    "description": "1 a 200 (padrão 50)",
                                    "disabled": false
                                },
                                {
                                    "key": "depois",
                                    "value": "",
                                    "description": "Cursor da página anterior",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Só os publicados (a curadoria vê todos). Cada item traz o qr_uuid. Paginação por cursor: repita a chamada com depois = pagina.proximo enquanto tem_mais for verdadeiro."
                    },
                    "response": []
                },
                {
                    "name": "Detalhe do atrativo",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/pois/{{poi}}?incluir=midias,horarios,tarifas",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "pois",
                                "{{poi}}"
                            ],
                            "query": [
                                {
                                    "key": "incluir",
                                    "value": "midias,horarios,tarifas",
                                    "description": "Seções extras, separadas por vírgula: midias, horarios, tarifas, operadores, acessibilidade",
                                    "disabled": false
                                }
                            ]
                        },
                        "description": "Traz o qr_uuid, os textos nos quatro idiomas e a geometria. Devolve ETag; com If-None-Match igual responde 304."
                    },
                    "response": []
                },
                {
                    "name": "Criar atrativo (curadoria)",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 201', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([201]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "description": "Gerado a cada envio"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/pois",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "pois"
                            ]
                        },
                        "description": "Só a Prefeitura. O código e o qr_uuid são gerados aqui e não mudam mais. Publicar exige nome, coordenadas, ao menos uma categoria e i18n.pt-BR.resumo.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"nome\": \"Praça da Matriz\",\n    \"tipo\": \"atrativo\",\n    \"status\": \"rascunho\",\n    \"localizacao\": {\n        \"latitude\": -23.2178,\n        \"longitude\": -44.7131\n    },\n    \"categorias\": [\n        \"historico\"\n    ],\n    \"i18n\": {\n        \"pt-BR\": {\n            \"resumo\": \"Praça central do Centro Histórico, diante da Igreja Matriz.\"\n        }\n    }\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Alterar atrativo",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "PATCH",
                        "header": [
                            {
                                "key": "If-Match",
                                "value": "W/\"5\""
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/pois/{{poi}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "pois",
                                "{{poi}}"
                            ]
                        },
                        "description": "Exige If-Match com o ETag lido no GET (428 sem o cabeçalho; 412 se outro alterou antes). Ausente = não mexer; null = limpar. O qr_uuid e o código não são editáveis.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"contato\": {\n        \"site\": \"https://exemplo.org\"\n    },\n    \"visitacao\": {\n        \"exige_guia\": true\n    }\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Anexar imagem ao atrativo",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 201', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([201]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "description": "Gerado a cada envio"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/pois/{{poi}}/midias",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "pois",
                                "{{poi}}",
                                "midias"
                            ]
                        },
                        "description": "multipart/form-data com o campo arquivo (JPEG, PNG ou WebP, até 12 MB) e os demais campos como texto; ou JSON com url do domínio de mídia. texto_alt é obrigatório: a API recusa imagem sem descrição.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"url\": \"https://img.destinolabparaty.com.br/attractions/lula-beach/exemplo.jpg\",\n    \"texto_alt\": \"Praia de areia clara com uma casa de veraneio entre coqueiros.\",\n    \"credito\": \"Nome do autor, CC BY 2.0\",\n    \"licenca\": \"CC BY 2.0\",\n    \"legenda\": \"A Praia da Lula vista do mar\",\n    \"principal\": false,\n    \"ordem\": 1\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Categorias",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/categorias",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "categorias"
                            ]
                        },
                        "description": "Pública. Cache de 1 hora.",
                        "auth": {
                            "type": "noauth"
                        }
                    },
                    "response": []
                },
                {
                    "name": "Catálogo aberto (JSON)",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/catalogo/aberto.json",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "catalogo",
                                "aberto.json"
                            ]
                        },
                        "description": "Pública. Todos os atrativos publicados num arquivo só, em formato aberto. Cache de 5 minutos.",
                        "auth": {
                            "type": "noauth"
                        }
                    },
                    "response": []
                },
                {
                    "name": "Catálogo aberto (GeoJSON)",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/catalogo/aberto.geojson",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "catalogo",
                                "aberto.geojson"
                            ]
                        },
                        "description": "Pública. FeatureCollection (RFC 7946) que abre direto no QGIS.",
                        "auth": {
                            "type": "noauth"
                        }
                    },
                    "response": []
                }
            ]
        },
        {
            "name": "Check-ins",
            "description": "Qualquer das cinco soluções registra que alguém esteve num atrativo. O atrativo vem pelo código ou pelo UUID lido no QR Code. O check-in pode ser anônimo (só conta) ou levar o sub do visitante que fez login na solução. Nome, e-mail, telefone ou documento de visitante nunca entram aqui: campo desconhecido é recusado com 422.",
            "item": [
                {
                    "name": "Registrar check-in",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200 ou 201', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200,201]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "description": "Gerado a cada envio"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/checkins",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "checkins"
                            ]
                        },
                        "description": "Responde 201 com criado: true. Se a referencia_externa já foi usada pela solução, responde 200 com o check-in que já existia e criado: false. O check-in não carimba o passaporte: isso é POST /v1/passaporte/carimbos.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"qr_uuid\": \"{{qr_uuid}}\",\n    \"origem\": \"qr\",\n    \"pessoas\": 2,\n    \"ocorrido_em\": \"2026-12-27T10:30:00-03:00\",\n    \"referencia_externa\": \"app-778\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Listar check-ins",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/checkins?poi={{poi}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "checkins"
                            ],
                            "query": [
                                {
                                    "key": "poi",
                                    "value": "{{poi}}",
                                    "description": "Código do atrativo",
                                    "disabled": false
                                },
                                {
                                    "key": "de",
                                    "value": "",
                                    "description": "Dia inicial, AAAA-MM-DD (fuso de Paraty)",
                                    "disabled": true
                                },
                                {
                                    "key": "ate",
                                    "value": "",
                                    "description": "Dia final, AAAA-MM-DD, incluído",
                                    "disabled": true
                                },
                                {
                                    "key": "limite",
                                    "value": "",
                                    "description": "1 a 200 (padrão 50)",
                                    "disabled": true
                                },
                                {
                                    "key": "depois",
                                    "value": "",
                                    "description": "Cursor da página anterior",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Cada solução vê só os seus; a curadoria vê os de todas. Do mais recente para o mais antigo."
                    },
                    "response": []
                }
            ]
        },
        {
            "name": "Resíduos: pontos de coleta, pesagens e destinação",
            "description": "Quem opera a coleta cadastra os pontos que mantém dentro de cada atrativo (quantos forem precisos) e depois informa quanto saiu de cada ponto, por material. Peso sempre em gramas, inteiro: 12,4 kg é 12400. Cada ponto só é alterado, e só recebe pesagem, de quem o cadastrou. As outras soluções e o portal leem.",
            "item": [
                {
                    "name": "Cadastrar ponto de coleta num atrativo",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200 ou 201', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200,201]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });",
                                    "if (pm.response.code < 300) {",
                                    "    const dados = pm.response.json();",
                                    "    if ((dados || {}).codigo) { pm.collectionVariables.set('ponto_de_coleta', (dados || {}).codigo); }",
                                    "}"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "description": "Gerado a cada envio"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/pois/{{poi}}/pontos-de-coleta",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "pois",
                                "{{poi}}",
                                "pontos-de-coleta"
                            ]
                        },
                        "description": "O código do ponto (PTY-COL-0001) é gerado aqui. Repetir a mesma referencia_externa devolve 200 com o ponto que já existe, sem criar outro.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"nome\": \"Lixeira da entrada da praia\",\n    \"descricao\": \"Ao lado do quiosque, na chegada dos barcos.\",\n    \"tipo\": \"lixeira\",\n    \"materiais\": [\n        \"plastico\",\n        \"metal\"\n    ],\n    \"localizacao\": {\n        \"latitude\": -23.19671,\n        \"longitude\": -44.62951\n    },\n    \"capacidade_litros\": 240,\n    \"referencia_externa\": \"RS-PT-01\",\n    \"instalado_em\": \"2026-10-20\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Pontos de coleta de um atrativo",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/pois/{{poi}}/pontos-de-coleta",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "pois",
                                "{{poi}}",
                                "pontos-de-coleta"
                            ],
                            "query": [
                                {
                                    "key": "status",
                                    "value": "",
                                    "description": "ativo ou inativo",
                                    "disabled": true
                                },
                                {
                                    "key": "limite",
                                    "value": "",
                                    "description": "1 a 200",
                                    "disabled": true
                                },
                                {
                                    "key": "depois",
                                    "value": "",
                                    "description": "Cursor da página anterior",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Cada ponto vem com o total já coletado nele e a data da última coleta."
                    },
                    "response": []
                },
                {
                    "name": "Todos os pontos de coleta",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });",
                                    "if (pm.response.code < 300) {",
                                    "    const dados = pm.response.json();",
                                    "    if ((((dados || {}).dados || {})[0] || {}).codigo) { pm.collectionVariables.set('ponto_de_coleta', (((dados || {}).dados || {})[0] || {}).codigo); }",
                                    "}"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/pontos-de-coleta",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "pontos-de-coleta"
                            ],
                            "query": [
                                {
                                    "key": "poi",
                                    "value": "",
                                    "description": "Código do atrativo",
                                    "disabled": true
                                },
                                {
                                    "key": "status",
                                    "value": "",
                                    "description": "ativo ou inativo",
                                    "disabled": true
                                },
                                {
                                    "key": "limite",
                                    "value": "",
                                    "description": "1 a 200",
                                    "disabled": true
                                },
                                {
                                    "key": "depois",
                                    "value": "",
                                    "description": "Cursor da página anterior",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "A mesma lista, sem partir de um atrativo."
                    },
                    "response": []
                },
                {
                    "name": "Detalhe do ponto de coleta",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/pontos-de-coleta/{{ponto_de_coleta}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "pontos-de-coleta",
                                "{{ponto_de_coleta}}"
                            ]
                        },
                        "description": "Com os totais do ponto."
                    },
                    "response": []
                },
                {
                    "name": "Alterar ponto de coleta",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "PATCH",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/pontos-de-coleta/{{ponto_de_coleta}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "pontos-de-coleta",
                                "{{ponto_de_coleta}}"
                            ]
                        },
                        "description": "Mesmos campos do cadastro, todos opcionais. Para desativar um ponto, mande status: inativo (o histórico de coletas permanece). Só quem cadastrou o ponto altera.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"status\": \"inativo\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Registrar quanto foi coletado",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200 ou 201', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200,201]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "description": "Gerado a cada envio"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/pontos-de-coleta/{{ponto_de_coleta}}/coletas",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "pontos-de-coleta",
                                "{{ponto_de_coleta}}",
                                "coletas"
                            ]
                        },
                        "description": "Uma chamada por material pesado. Repetir a mesma referencia_externa devolve 200 com a coleta que já existe.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"material\": \"plastico\",\n    \"peso_gramas\": 12400,\n    \"coletado_em\": \"2026-11-02T08:00:00-03:00\",\n    \"referencia_externa\": \"pes-2026-11-02-01\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Coletas de um ponto",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/pontos-de-coleta/{{ponto_de_coleta}}/coletas",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "pontos-de-coleta",
                                "{{ponto_de_coleta}}",
                                "coletas"
                            ],
                            "query": [
                                {
                                    "key": "de",
                                    "value": "",
                                    "description": "Dia inicial, AAAA-MM-DD",
                                    "disabled": true
                                },
                                {
                                    "key": "ate",
                                    "value": "",
                                    "description": "Dia final, AAAA-MM-DD, incluído",
                                    "disabled": true
                                },
                                {
                                    "key": "limite",
                                    "value": "",
                                    "description": "1 a 200",
                                    "disabled": true
                                },
                                {
                                    "key": "depois",
                                    "value": "",
                                    "description": "Cursor da página anterior",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Da mais recente para a mais antiga."
                    },
                    "response": []
                },
                {
                    "name": "Registrar a destinação do que foi coletado",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200 ou 201', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200,201]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "description": "Gerado a cada envio"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/destinacoes",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "destinacoes"
                            ]
                        },
                        "description": "Para onde foi o resíduo, por material. Uma chamada por remessa. É o que fecha o ciclo no painel: coletado e destinado.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"material\": \"plastico\",\n    \"peso_gramas\": 310000,\n    \"destino_tipo\": \"projeto_social\",\n    \"destino_nome\": \"Cooperativa de catadores de Paraty\",\n    \"destinado_em\": \"2026-11-30T09:00:00-03:00\",\n    \"referencia_externa\": \"dest-2026-11\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Destinações registradas",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/destinacoes",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "destinacoes"
                            ],
                            "query": [
                                {
                                    "key": "material",
                                    "value": "",
                                    "description": "Filtra por material",
                                    "disabled": true
                                },
                                {
                                    "key": "destino_tipo",
                                    "value": "",
                                    "description": "Filtra por tipo de destino",
                                    "disabled": true
                                },
                                {
                                    "key": "de",
                                    "value": "",
                                    "description": "Dia inicial, AAAA-MM-DD",
                                    "disabled": true
                                },
                                {
                                    "key": "ate",
                                    "value": "",
                                    "description": "Dia final, AAAA-MM-DD, incluído",
                                    "disabled": true
                                },
                                {
                                    "key": "limite",
                                    "value": "",
                                    "description": "1 a 200",
                                    "disabled": true
                                },
                                {
                                    "key": "depois",
                                    "value": "",
                                    "description": "Cursor da página anterior",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Da mais recente para a mais antiga."
                    },
                    "response": []
                }
            ]
        },
        {
            "name": "Conteúdo das soluções e roteiros",
            "description": "A ficha do atrativo é da curadoria. Cada solução acrescenta a sua camada: a narrativa, a interpretação ambiental, a memória, a orientação de conduta, e os roteiros que ligam atrativos. O portal e as outras soluções leem e mostram com o nome de quem assinou. Só quem publicou altera ou retira. O texto é puro: quem exibe faz o escape.",
            "item": [
                {
                    "name": "Publicar conteúdo num atrativo",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200 ou 201', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200,201]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });",
                                    "if (pm.response.code < 300) {",
                                    "    const dados = pm.response.json();",
                                    "    if ((dados || {}).uuid) { pm.collectionVariables.set('conteudo', (dados || {}).uuid); }",
                                    "}"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "description": "Gerado a cada envio"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/pois/{{poi}}/conteudos",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "pois",
                                "{{poi}}",
                                "conteudos"
                            ]
                        },
                        "description": "Precisa de ao menos um entre texto, url e midia. Toda imagem exige texto_alt.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"tipo\": \"narrativa\",\n    \"idioma\": \"pt-BR\",\n    \"titulo\": \"A rua que a maré lava\",\n    \"texto\": \"Na lua cheia a maré entra pelas ruas do centro. Foi desenhado assim, para lavar a cidade.\",\n    \"url\": \"https://historias.destinolabparaty.com.br/centro-historico\",\n    \"midia\": {\n        \"tipo\": \"audio\",\n        \"url\": \"https://cdn.exemplo.org/centro-historico.mp3\"\n    },\n    \"referencia_externa\": \"ip-centro-01\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Conteúdos de um atrativo",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/pois/{{poi}}/conteudos",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "pois",
                                "{{poi}}",
                                "conteudos"
                            ],
                            "query": [
                                {
                                    "key": "solucao",
                                    "value": "",
                                    "description": "cashpago, diaspora, interact, fuba ou reciclo",
                                    "disabled": true
                                },
                                {
                                    "key": "tipo",
                                    "value": "",
                                    "description": "Filtra por tipo",
                                    "disabled": true
                                },
                                {
                                    "key": "idioma",
                                    "value": "",
                                    "description": "Filtra por idioma",
                                    "disabled": true
                                },
                                {
                                    "key": "limite",
                                    "value": "",
                                    "description": "1 a 200",
                                    "disabled": true
                                },
                                {
                                    "key": "depois",
                                    "value": "",
                                    "description": "Cursor da página anterior",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Os publicados de todas as soluções (e os ocultos de quem pergunta)."
                    },
                    "response": []
                },
                {
                    "name": "Um conteúdo",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/conteudos/{{conteudo}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "conteudos",
                                "{{conteudo}}"
                            ]
                        },
                        "description": "Pelo uuid."
                    },
                    "response": []
                },
                {
                    "name": "Alterar um conteúdo",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "PATCH",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/conteudos/{{conteudo}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "conteudos",
                                "{{conteudo}}"
                            ]
                        },
                        "description": "Só os campos enviados mudam. Os mesmos campos da criação.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"status\": \"oculto\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Retirar um conteúdo",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 204', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([204]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "DELETE",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/conteudos/{{conteudo}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "conteudos",
                                "{{conteudo}}"
                            ]
                        },
                        "description": "Responde 204. A referencia_externa fica livre para um novo envio."
                    },
                    "response": []
                },
                {
                    "name": "Criar roteiro digital",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200 ou 201', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200,201]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });",
                                    "if (pm.response.code < 300) {",
                                    "    const dados = pm.response.json();",
                                    "    if ((dados || {}).codigo) { pm.collectionVariables.set('roteiro', (dados || {}).codigo); }",
                                    "}"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "description": "Gerado a cada envio"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/roteiros",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "roteiros"
                            ]
                        },
                        "description": "As paradas vão na ordem da lista. O código (PTY-ROT-003) é gerado aqui.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"titulo\": \"Paraty em histórias\",\n    \"resumo\": \"Do cais à praça, a pé, em uma hora e meia.\",\n    \"duracao_minutos\": 90,\n    \"dificuldade\": \"facil\",\n    \"perfil\": \"cultural\",\n    \"paradas\": [\n        {\n            \"poi\": \"{{poi}}\",\n            \"tempo_sugerido_min\": 20,\n            \"nota\": \"Comece aqui.\"\n        }\n    ],\n    \"referencia_externa\": \"ip-rot-01\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Roteiros publicados",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/roteiros",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "roteiros"
                            ],
                            "query": [
                                {
                                    "key": "solucao",
                                    "value": "",
                                    "description": "Quem assina",
                                    "disabled": true
                                },
                                {
                                    "key": "poi",
                                    "value": "",
                                    "description": "Roteiros que passam por este atrativo",
                                    "disabled": true
                                },
                                {
                                    "key": "limite",
                                    "value": "",
                                    "description": "1 a 200",
                                    "disabled": true
                                },
                                {
                                    "key": "depois",
                                    "value": "",
                                    "description": "Cursor da página anterior",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Sem as paradas; peça o roteiro pelo código para vê-las."
                    },
                    "response": []
                },
                {
                    "name": "Um roteiro, com as paradas",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/roteiros/{{roteiro}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "roteiros",
                                "{{roteiro}}"
                            ]
                        },
                        "description": "Pelo código."
                    },
                    "response": []
                },
                {
                    "name": "Substituir um roteiro",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "PUT",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/roteiros/{{roteiro}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "roteiros",
                                "{{roteiro}}"
                            ]
                        },
                        "description": "Troca o roteiro inteiro, com as paradas. O que não vier no corpo sai. Mesmos campos da criação.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"titulo\": \"Paraty em histórias\",\n    \"paradas\": [\n        {\n            \"poi\": \"{{poi}}\"\n        }\n    ]\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                }
            ]
        },
        {
            "name": "Ofertas, grade de saídas e reservas",
            "description": "A solução que vende publica a oferta de um operador homologado e mantém a grade de saídas. As outras leem para mostrar disponibilidade, e qualquer solução com o escopo informa a reserva que vendeu: o centro controla as vagas. Dinheiro sempre em centavos, inteiro. Nenhum nome, e-mail ou telefone do comprador entra aqui: quando a pessoa é conhecida, vem só o sub.",
            "item": [
                {
                    "name": "Publicar oferta",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200 ou 201', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200,201]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });",
                                    "if (pm.response.code < 300) {",
                                    "    const dados = pm.response.json();",
                                    "    if ((dados || {}).codigo) { pm.collectionVariables.set('oferta', (dados || {}).codigo); }",
                                    "}"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "description": "Gerado a cada envio"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/ofertas",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "ofertas"
                            ]
                        },
                        "description": "O operador precisa estar homologado. O código (PTY-OFR-0021) é gerado aqui.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"operador\": \"{{operador}}\",\n    \"poi\": \"{{poi}}\",\n    \"titulo\": \"Passeio de escuna pelas ilhas\",\n    \"resumo\": \"Cinco horas, quatro paradas para banho.\",\n    \"duracao_minutos\": 300,\n    \"preco_centavos\": 18000,\n    \"capacidade_saida\": 80,\n    \"idiomas\": [\n        \"pt\",\n        \"en\"\n    ],\n    \"referencia_externa\": \"viva-exp-778\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Ofertas publicadas",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/ofertas",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "ofertas"
                            ],
                            "query": [
                                {
                                    "key": "solucao",
                                    "value": "",
                                    "description": "Quem vende",
                                    "disabled": true
                                },
                                {
                                    "key": "operador",
                                    "value": "",
                                    "description": "Código do operador",
                                    "disabled": true
                                },
                                {
                                    "key": "poi",
                                    "value": "",
                                    "description": "Código do atrativo",
                                    "disabled": true
                                },
                                {
                                    "key": "status",
                                    "value": "",
                                    "description": "rascunho, publicada, pausada ou encerrada",
                                    "disabled": true
                                },
                                {
                                    "key": "limite",
                                    "value": "",
                                    "description": "1 a 200",
                                    "disabled": true
                                },
                                {
                                    "key": "depois",
                                    "value": "",
                                    "description": "Cursor da página anterior",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "As publicadas de todas as soluções (e as demais de quem pergunta)."
                    },
                    "response": []
                },
                {
                    "name": "Uma oferta",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/ofertas/{{oferta}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "ofertas",
                                "{{oferta}}"
                            ]
                        },
                        "description": "Pelo código."
                    },
                    "response": []
                },
                {
                    "name": "Alterar uma oferta",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "PATCH",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/ofertas/{{oferta}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "ofertas",
                                "{{oferta}}"
                            ]
                        },
                        "description": "Só os campos enviados mudam. Os mesmos campos da criação.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"preco_centavos\": 19000,\n    \"status\": \"pausada\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Substituir a grade de saídas do período",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "PUT",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/ofertas/{{oferta}}/saidas",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "ofertas",
                                "{{oferta}}",
                                "saidas"
                            ]
                        },
                        "description": "Mande todas as saídas entre de e ate (até 92 dias, até 500 saídas). Saída do período que não vier some se ninguém reservou; se há reserva, fica cancelada. Não dá para baixar vagas_total abaixo do que já foi reservado.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"de\": \"2026-12-27\",\n    \"ate\": \"2026-12-27\",\n    \"saidas\": [\n        {\n            \"inicio_em\": \"2026-12-27T10:00:00-03:00\",\n            \"fim_em\": \"2026-12-27T15:00:00-03:00\",\n            \"vagas_total\": 80\n        }\n    ]\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Grade de saídas e vagas livres",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/ofertas/{{oferta}}/saidas",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "ofertas",
                                "{{oferta}}",
                                "saidas"
                            ],
                            "query": [
                                {
                                    "key": "de",
                                    "value": "",
                                    "description": "Dia inicial, AAAA-MM-DD",
                                    "disabled": true
                                },
                                {
                                    "key": "ate",
                                    "value": "",
                                    "description": "Dia final, AAAA-MM-DD, incluído",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Por padrão, de hoje a 30 dias."
                    },
                    "response": []
                },
                {
                    "name": "Informar uma reserva",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200 ou 201', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200,201]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });",
                                    "if (pm.response.code < 300) {",
                                    "    const dados = pm.response.json();",
                                    "    if ((dados || {}).codigo) { pm.collectionVariables.set('reserva', (dados || {}).codigo); }",
                                    "}"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "description": "Gerado a cada envio"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/reservas",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "reservas"
                            ]
                        },
                        "description": "A saída é identificada pela oferta e pelo inicio_em. A reserva pode ser numa oferta de outra solução. Sem vaga, responde 409.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"oferta\": \"{{oferta}}\",\n    \"inicio_em\": \"2026-12-27T10:00:00-03:00\",\n    \"quantidade\": 2,\n    \"valor_total_centavos\": 36000,\n    \"referencia_externa\": \"db-res-5521\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Reservas da solução",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/reservas",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "reservas"
                            ],
                            "query": [
                                {
                                    "key": "oferta",
                                    "value": "",
                                    "description": "Código da oferta",
                                    "disabled": true
                                },
                                {
                                    "key": "status",
                                    "value": "",
                                    "description": "Filtra por status",
                                    "disabled": true
                                },
                                {
                                    "key": "limite",
                                    "value": "",
                                    "description": "1 a 200",
                                    "disabled": true
                                },
                                {
                                    "key": "depois",
                                    "value": "",
                                    "description": "Cursor da página anterior",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "As que a solução fez e as que caíram nas ofertas dela, da mais recente para a mais antiga."
                    },
                    "response": []
                },
                {
                    "name": "Uma reserva",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/reservas/{{reserva}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "reservas",
                                "{{reserva}}"
                            ]
                        },
                        "description": "Visível para quem vendeu e para quem é dono da oferta."
                    },
                    "response": []
                },
                {
                    "name": "Mudar o status de uma reserva",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "PATCH",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/reservas/{{reserva}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "reservas",
                                "{{reserva}}"
                            ]
                        },
                        "description": "Cancelar devolve as vagas à saída. Reserva cancelada, realizada ou no_show não muda mais.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"status\": \"cancelada\",\n    \"cancelado_motivo\": \"Mar agitado\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                }
            ]
        },
        {
            "name": "Registro de saída e ocorrências",
            "description": "Quem ordena os passeios informa cada saída ao partir e o retorno ao voltar. A gestão consulta o que ainda está fora: numa emergência, sabe quem saiu, em que embarcação e com quantas pessoas. Só contagem: nenhum nome de passageiro ou de condutor.",
            "item": [
                {
                    "name": "Registrar uma saída",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200 ou 201', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200,201]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });",
                                    "if (pm.response.code < 300) {",
                                    "    const dados = pm.response.json();",
                                    "    if ((dados || {}).codigo) { pm.collectionVariables.set('saida', (dados || {}).codigo); }",
                                    "}"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "description": "Gerado a cada envio"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/saidas",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "saidas"
                            ]
                        },
                        "description": "Ao partir. O código (PTY-SAI-000342) é gerado aqui.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"operador\": \"{{operador}}\",\n    \"passageiros\": 62,\n    \"tripulantes\": 4,\n    \"retorno_previsto_em\": \"2026-12-27T15:00:00-03:00\",\n    \"roteiro\": \"Ilha Comprida, Lagoa Azul e Praia da Lula\",\n    \"referencia_externa\": \"viva-saida-9911\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Uma saída",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/saidas/{{saida}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "saidas",
                                "{{saida}}"
                            ]
                        },
                        "description": "Só quem registrou vê."
                    },
                    "response": []
                },
                {
                    "name": "Informar o retorno",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "PATCH",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/saidas/{{saida}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "saidas",
                                "{{saida}}"
                            ]
                        },
                        "description": "Mandar retorno_em encerra a saída. Também corrige passageiros, tripulantes, roteiro e retorno previsto.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"retorno_em\": \"2026-12-27T14:52:00-03:00\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Saídas que ainda não voltaram",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/saidas/em-aberto",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "saidas",
                                "em-aberto"
                            ],
                            "query": [
                                {
                                    "key": "limite",
                                    "value": "",
                                    "description": "1 a 200",
                                    "disabled": true
                                },
                                {
                                    "key": "depois",
                                    "value": "",
                                    "description": "Cursor da página anterior",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Consulta da gestão e da Defesa Civil. em_atraso é verdadeiro quando o retorno previsto já passou."
                    },
                    "response": []
                },
                {
                    "name": "Abrir ocorrência",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 201', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([201]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "description": "Gerado a cada envio"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/ocorrencias",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "ocorrencias"
                            ]
                        },
                        "description": "Numa saída, num atrativo ou nos dois. A saída passa ao status ocorrencia. Não escreva nome de pessoa na descrição.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"saida\": \"{{saida}}\",\n    \"tipo\": \"pane\",\n    \"gravidade\": \"media\",\n    \"descricao\": \"Motor parou perto da Ilha Comprida.\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                }
            ]
        },
        {
            "name": "Passaporte",
            "description": "Carimbos por atrativo visitado, emitidos pelas cinco soluções na conta única do visitante. A solução fala em sub; o centro resolve a pessoa. Exige que o visitante tenha autorizado a solução a carimbar.",
            "item": [
                {
                    "name": "Carimbar o passaporte",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200 ou 201', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200,201]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/passaporte/carimbos",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "passaporte",
                                "carimbos"
                            ]
                        },
                        "description": "201 com criado: true e as conquistas novas; 200 se o carimbo já existia (um por visitante, atrativo e solução).",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"sub\": \"{{sub}}\",\n    \"poi\": \"{{poi}}\",\n    \"origem\": \"qr\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Catálogo de conquistas",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/passaporte/conquistas",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "passaporte",
                                "conquistas"
                            ]
                        },
                        "description": "Pública. As conquistas e as regras que as liberam.",
                        "auth": {
                            "type": "noauth"
                        }
                    },
                    "response": []
                }
            ]
        },
        {
            "name": "Operadores, equipamentos e selos",
            "description": "Prestadores de serviço turístico e suas embarcações e veículos. As soluções veem só os homologados. O documento (CPF ou CNPJ) é cifrado e só volta mascarado.",
            "item": [
                {
                    "name": "Listar operadores",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });",
                                    "if (pm.response.code < 300) {",
                                    "    const dados = pm.response.json();",
                                    "    if ((((dados || {}).dados || {})[0] || {}).codigo) { pm.collectionVariables.set('operador', (((dados || {}).dados || {})[0] || {}).codigo); }",
                                    "}"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/operadores",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "operadores"
                            ],
                            "query": [
                                {
                                    "key": "categoria",
                                    "value": "",
                                    "description": "nautico_escuna, nautico_barco, nautico_lancha, jipe, guia, receptivo, hospedagem, alimentacao, outro",
                                    "disabled": true
                                },
                                {
                                    "key": "busca",
                                    "value": "",
                                    "description": "Texto no nome",
                                    "disabled": true
                                },
                                {
                                    "key": "status",
                                    "value": "",
                                    "description": "Só a curadoria",
                                    "disabled": true
                                },
                                {
                                    "key": "limite",
                                    "value": "",
                                    "description": "1 a 200",
                                    "disabled": true
                                },
                                {
                                    "key": "depois",
                                    "value": "",
                                    "description": "Cursor da página anterior",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Só os homologados (a curadoria vê todos)."
                    },
                    "response": []
                },
                {
                    "name": "Detalhe do operador",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/operadores/{{operador}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "operadores",
                                "{{operador}}"
                            ]
                        },
                        "description": "Operador não homologado responde 404 para quem não é da curadoria."
                    },
                    "response": []
                },
                {
                    "name": "Cadastrar operador",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 201', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([201]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "description": "Gerado a cada envio"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/operadores",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "operadores"
                            ]
                        },
                        "description": "Nasce pendente. O documento é validado, cifrado e não se repete na base.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"nome_fantasia\": \"Escuna Vitória\",\n    \"tipo_pessoa\": \"juridica\",\n    \"documento\": \"11.222.333/0001-81\",\n    \"categoria\": \"nautico_escuna\",\n    \"email\": \"contato@exemplo.org\",\n    \"telefone\": \"+55 24 99999-0000\",\n    \"cadastur\": \"12.345678.90.0001-2\",\n    \"cadastur_validade\": \"2027-03-01\",\n    \"origem_cadastro\": \"oficina\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Mudar o status de homologação",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/operadores/{{operador}}/homologacao",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "operadores",
                                "{{operador}}",
                                "homologacao"
                            ]
                        },
                        "description": "pendente → em_analise → homologado → suspenso. homologado, recusado e suspenso são atos da curadoria; recusado e suspenso exigem motivo.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"status\": \"homologado\",\n    \"cadastur_situacao\": \"regular\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Equipamentos do operador",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });",
                                    "if (pm.response.code < 300) {",
                                    "    const dados = pm.response.json();",
                                    "    if ((((dados || {}).dados || {})[0] || {}).codigo) { pm.collectionVariables.set('equipamento', (((dados || {}).dados || {})[0] || {}).codigo); }",
                                    "}"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/operadores/{{operador}}/equipamentos",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "operadores",
                                "{{operador}}",
                                "equipamentos"
                            ]
                        },
                        "description": "Com o selo de cada um, quando emitido."
                    },
                    "response": []
                },
                {
                    "name": "Cadastrar equipamento",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 201', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([201]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "description": "Gerado a cada envio"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/operadores/{{operador}}/equipamentos",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "operadores",
                                "{{operador}}",
                                "equipamentos"
                            ]
                        },
                        "description": "Tipos: escuna, lancha, barco, jipe, van, bicicleta, outro.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"tipo\": \"escuna\",\n    \"nome\": \"Vitória V\",\n    \"registro_capitania\": \"3811000001\",\n    \"capacidade_passageiros\": 80,\n    \"ano_fabricacao\": 2012\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Emitir ou trocar o selo (curadoria)",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/equipamentos/{{equipamento}}/selo",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "equipamentos",
                                "{{equipamento}}",
                                "selo"
                            ]
                        },
                        "description": "O código novo invalida o anterior na hora.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"validade\": \"2027-11-07\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Verificar selo",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/selos/{{selo}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "selos",
                                "{{selo}}"
                            ]
                        },
                        "description": "Pública: é o que o turista confere ao apontar a câmera para o adesivo. situacao: homologado, vencido, suspenso, nao_homologado ou equipamento_inativo. Código desconhecido responde 404.",
                        "auth": {
                            "type": "noauth"
                        }
                    },
                    "response": []
                }
            ]
        },
        {
            "name": "Painel (dashboards)",
            "description": "O que as cinco soluções mandaram para o centro, somado. É de onde o portal e os dashboards leem. Só agregados: nenhuma informação de pessoa. Período padrão: os últimos 30 dias; máximo de 366 dias.",
            "item": [
                {
                    "name": "Indicadores do destino",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/painel/indicadores?de=2026-12-01&ate=2026-12-31",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "painel",
                                "indicadores"
                            ],
                            "query": [
                                {
                                    "key": "de",
                                    "value": "2026-12-01",
                                    "description": "Dia inicial, AAAA-MM-DD (fuso de Paraty)",
                                    "disabled": false
                                },
                                {
                                    "key": "ate",
                                    "value": "2026-12-31",
                                    "description": "Dia final, AAAA-MM-DD, incluído",
                                    "disabled": false
                                }
                            ]
                        },
                        "description": "Check-ins (total, pessoas, por solução, por origem e por dia), carimbos, resíduos por material, atrativos publicados, operadores homologados e contas de visitante."
                    },
                    "response": []
                },
                {
                    "name": "Indicadores por atrativo",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/painel/pois",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "painel",
                                "pois"
                            ],
                            "query": [
                                {
                                    "key": "de",
                                    "value": "",
                                    "description": "Dia inicial, AAAA-MM-DD",
                                    "disabled": true
                                },
                                {
                                    "key": "ate",
                                    "value": "",
                                    "description": "Dia final, AAAA-MM-DD, incluído",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Todos os atrativos publicados, do mais visitado para o menos, com check-ins, pessoas, carimbos, pontos de coleta ativos e gramas coletados no período."
                    },
                    "response": []
                }
            ]
        },
        {
            "name": "Agenda, busca e conteúdo",
            "description": "O que o portal mostra além dos atrativos: a agenda da cidade, a busca unificada, as páginas editoriais e os subdomínios das soluções.",
            "item": [
                {
                    "name": "Agenda do destino",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });",
                                    "if (pm.response.code < 300) {",
                                    "    const dados = pm.response.json();",
                                    "    if ((((dados || {}).dados || {})[0] || {}).codigo) { pm.collectionVariables.set('evento', (((dados || {}).dados || {})[0] || {}).codigo); }",
                                    "}"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/agenda",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "agenda"
                            ],
                            "query": [
                                {
                                    "key": "de",
                                    "value": "",
                                    "description": "ISO 8601 com fuso",
                                    "disabled": true
                                },
                                {
                                    "key": "ate",
                                    "value": "",
                                    "description": "ISO 8601 com fuso",
                                    "disabled": true
                                },
                                {
                                    "key": "poi",
                                    "value": "",
                                    "description": "Código do atrativo",
                                    "disabled": true
                                },
                                {
                                    "key": "limite",
                                    "value": "",
                                    "description": "1 a 200",
                                    "disabled": true
                                },
                                {
                                    "key": "depois",
                                    "value": "",
                                    "description": "Cursor",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Eventos publicados que ainda não acabaram, do mais próximo ao mais distante."
                    },
                    "response": []
                },
                {
                    "name": "Detalhe do evento",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/agenda/{{evento}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "agenda",
                                "{{evento}}"
                            ]
                        },
                        "description": "Aceita o código (PTY-AGD-0012) ou o slug."
                    },
                    "response": []
                },
                {
                    "name": "Criar evento (curadoria)",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 201', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([201]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "description": "Gerado a cada envio"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/agenda",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "agenda"
                            ]
                        },
                        "description": "inicio_em e fim_em exigem fuso. url_ingressos e imagem_capa precisam ser https.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"titulo\": \"Festa do Divino\",\n    \"resumo\": \"Procissão e música no Centro Histórico.\",\n    \"poi\": \"PTY-POI-0001\",\n    \"local\": \"Igreja Matriz\",\n    \"inicio_em\": \"2027-07-28T19:00:00-03:00\",\n    \"fim_em\": \"2027-07-28T23:00:00-03:00\",\n    \"gratuito\": true,\n    \"status\": \"publicado\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Alterar evento (curadoria)",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "PATCH",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/agenda/{{evento}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "agenda",
                                "{{evento}}"
                            ]
                        },
                        "description": "Mesmos campos, todos opcionais. status: rascunho, publicado ou cancelado.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"status\": \"cancelado\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Busca unificada",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/busca?q=praia",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "busca"
                            ],
                            "query": [
                                {
                                    "key": "q",
                                    "value": "praia",
                                    "description": "Texto da busca",
                                    "disabled": false
                                },
                                {
                                    "key": "idioma",
                                    "value": "",
                                    "description": "pt-BR, en-US, es-ES ou fr-FR",
                                    "disabled": true
                                },
                                {
                                    "key": "limite",
                                    "value": "",
                                    "description": "1 a 8",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Atrativos, páginas e agenda, até 8 de cada. Ignora acento e caixa e conhece sinônimos locais."
                    },
                    "response": []
                },
                {
                    "name": "Páginas editoriais",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/paginas?tipo=guia",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "paginas"
                            ],
                            "query": [
                                {
                                    "key": "tipo",
                                    "value": "guia",
                                    "description": "Tipo da página",
                                    "disabled": false
                                },
                                {
                                    "key": "idioma",
                                    "value": "",
                                    "description": "pt-BR, en-US, es-ES ou fr-FR",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Tipos: institucional, guia, noticia, ajuda, legal."
                    },
                    "response": []
                },
                {
                    "name": "Uma página editorial",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/paginas/{{pagina}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "paginas",
                                "{{pagina}}"
                            ],
                            "query": [
                                {
                                    "key": "idioma",
                                    "value": "",
                                    "description": "pt-BR, en-US, es-ES ou fr-FR",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "O corpo (conteudo) é Markdown. Sem tradução no idioma pedido vem o português, com fallback: true."
                    },
                    "response": []
                },
                {
                    "name": "Subdomínios das soluções",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/subdominios",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "subdominios"
                            ]
                        },
                        "description": "Para onde cada subdomínio do destino leva (experiencias., cultura., historias., natureza., circular.)."
                    },
                    "response": []
                }
            ]
        },
        {
            "name": "Conta do visitante (token de login)",
            "description": "Estas rotas só aceitam o token que o visitante obtém ao fazer login (Authorization Code + PKCE em auth.destinolabparaty.com.br/oauth/autorizar). Token de máquina recebe 403. Há uma única base de visitantes: cada solução recebe um sub diferente para a mesma pessoa e nunca coleta senha.",
            "item": [
                {
                    "name": "Dados do visitante",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/me",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "me"
                            ]
                        },
                        "description": "sub; com profile: nome, idioma e email_verificado; com email: o e-mail.",
                        "auth": {
                            "type": "bearer",
                            "bearer": [
                                {
                                    "key": "token",
                                    "value": "{{token_visitante}}",
                                    "type": "string"
                                }
                            ]
                        }
                    },
                    "response": []
                },
                {
                    "name": "Alterar nome e idioma",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "PATCH",
                        "header": [
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/v1/me",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "me"
                            ]
                        },
                        "description": "Campos: nome e idioma.",
                        "auth": {
                            "type": "bearer",
                            "bearer": [
                                {
                                    "key": "token",
                                    "value": "{{token_visitante}}",
                                    "type": "string"
                                }
                            ]
                        },
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"nome\": \"Joana M.\",\n    \"idioma\": \"fr-FR\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": []
                },
                {
                    "name": "Eliminar a conta (LGPD, art. 18, VI)",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 204', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([204]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "DELETE",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/me",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "me"
                            ]
                        },
                        "description": "Anonimiza na hora e revoga todos os tokens. Carimbos e check-ins ficam, sem dono, para a estatística.",
                        "auth": {
                            "type": "bearer",
                            "bearer": [
                                {
                                    "key": "token",
                                    "value": "{{token_visitante}}",
                                    "type": "string"
                                }
                            ]
                        }
                    },
                    "response": []
                },
                {
                    "name": "Reenviar a confirmação de e-mail",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 202', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([202]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "POST",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/me/email/verificacao",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "me",
                                "email",
                                "verificacao"
                            ]
                        },
                        "description": "202 com situacao: enviado ou ja_verificado. Até 3 por hora.",
                        "auth": {
                            "type": "bearer",
                            "bearer": [
                                {
                                    "key": "token",
                                    "value": "{{token_visitante}}",
                                    "type": "string"
                                }
                            ]
                        }
                    },
                    "response": []
                },
                {
                    "name": "Passaporte do visitante",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/me/passaporte",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "me",
                                "passaporte"
                            ]
                        },
                        "description": "Carimbos e conquistas, com o progresso de cada uma.",
                        "auth": {
                            "type": "bearer",
                            "bearer": [
                                {
                                    "key": "token",
                                    "value": "{{token_visitante}}",
                                    "type": "string"
                                }
                            ]
                        }
                    },
                    "response": []
                },
                {
                    "name": "Consentimentos dados",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/me/consentimentos",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "me",
                                "consentimentos"
                            ]
                        },
                        "description": "O que o visitante autorizou, por aplicação.",
                        "auth": {
                            "type": "bearer",
                            "bearer": [
                                {
                                    "key": "token",
                                    "value": "{{token_visitante}}",
                                    "type": "string"
                                }
                            ]
                        }
                    },
                    "response": []
                },
                {
                    "name": "Revogar um consentimento",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 204', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([204]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "DELETE",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/me/consentimentos/{{client_id_do_app}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "me",
                                "consentimentos",
                                "{{client_id_do_app}}"
                            ]
                        },
                        "description": "Encerra também os tokens daquela aplicação.",
                        "auth": {
                            "type": "bearer",
                            "bearer": [
                                {
                                    "key": "token",
                                    "value": "{{token_visitante}}",
                                    "type": "string"
                                }
                            ]
                        }
                    },
                    "response": []
                },
                {
                    "name": "Exportar os dados (LGPD, art. 18, V)",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});",
                                    "pm.test('traz X-Request-Id', function () { pm.response.to.have.header('X-Request-Id'); });"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "POST",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/v1/me/exportacao",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "v1",
                                "me",
                                "exportacao"
                            ]
                        },
                        "description": "JSON com tudo o que o centro guarda sobre o visitante.",
                        "auth": {
                            "type": "bearer",
                            "bearer": [
                                {
                                    "key": "token",
                                    "value": "{{token_visitante}}",
                                    "type": "string"
                                }
                            ]
                        }
                    },
                    "response": []
                }
            ]
        },
        {
            "name": "Saúde",
            "description": "Para monitoramento. Sem autenticação.",
            "item": [
                {
                    "name": "Processo vivo",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/saude",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "saude"
                            ]
                        },
                        "description": "Não toca no banco.",
                        "auth": {
                            "type": "noauth"
                        }
                    },
                    "response": []
                },
                {
                    "name": "Pronto para atender",
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test('status 200', function () {",
                                    "    pm.expect(pm.response.code).to.be.oneOf([200]);",
                                    "});"
                                ]
                            }
                        }
                    ],
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{base_url}}/saude/pronto",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "saude",
                                "pronto"
                            ]
                        },
                        "description": "Confere banco e segredos. 503 se algum falhar.",
                        "auth": {
                            "type": "noauth"
                        }
                    },
                    "response": []
                }
            ]
        }
    ]
}
