{
    "openapi": "3.1.0",
    "jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
    "info": {
        "title": "Agenda de Feiras",
        "version": "2.4.0",
        "summary": "Leitura da base publicada de feiras para agentes e integrações.",
        "description": "O contrato 2.4.0 é o mesmo das ferramentas MCP. O bearer é o access token OAuth (escopo feiras:read) ou, no plano API/IA Pro, uma chave de API com prefixo adf_k_. A chave não autentica o MCP. O plano de 30 dias recebe 403 com o link de upgrade. Não há exportação em massa: a página não passa do teto do plano."
    },
    "servers": [
        {
            "url": "https://agendadefeiras.com.br/api/v1"
        }
    ],
    "security": [
        {
            "bearer": []
        },
        {
            "apiKey": []
        }
    ],
    "tags": [
        {
            "name": "feiras"
        },
        {
            "name": "setores"
        },
        {
            "name": "locais"
        },
        {
            "name": "grade"
        }
    ],
    "paths": {
        "/feiras": {
            "get": {
                "tags": [
                    "feiras"
                ],
                "summary": "Lista feiras publicadas",
                "description": "Ordenação fixa: data_inicio crescente e, no empate, id crescente.",
                "parameters": [
                    {
                        "name": "de",
                        "in": "query",
                        "required": false,
                        "description": "Início do período, AAAA-MM-DD. A feira termina nessa data ou depois.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "ate",
                        "in": "query",
                        "required": false,
                        "description": "Fim do período, AAAA-MM-DD. A feira começa nessa data ou antes.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "cidade",
                        "in": "query",
                        "required": false,
                        "description": "Nome da cidade, sem a UF.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "uf",
                        "in": "query",
                        "required": false,
                        "description": "Sigla da UF, como SP.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "tipo",
                        "in": "query",
                        "required": false,
                        "description": "b2b, b2c ou misto. nao_informado devolve feiras com tipo vazio. Sem o parâmetro, a lista inclui as feiras sem tipo.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "acesso",
                        "in": "query",
                        "required": false,
                        "description": "aberto, ingresso ou profissionais. nao_informado devolve feiras sem acesso. Sem o parâmetro, a lista inclui as feiras sem acesso.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "segmento",
                        "in": "query",
                        "required": false,
                        "description": "Slug ou nome do setor.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "texto",
                        "in": "query",
                        "required": false,
                        "description": "Trecho do nome, da cidade ou da descrição.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "updated_since",
                        "in": "query",
                        "required": false,
                        "description": "Sincronização incremental. ISO 8601. Devolve feiras com atualizado_em igual ou posterior.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "cursor",
                        "in": "query",
                        "required": false,
                        "description": "Valor de next_cursor da página anterior.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "limite",
                        "in": "query",
                        "required": false,
                        "description": "Itens nesta página. O plano Anual corta em 50 e o API/IA Pro em 100. O servidor nunca passa de 100.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "pagina",
                        "in": "query",
                        "required": false,
                        "description": "Página numérica, começando em 1. O cursor tem prioridade.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "publico",
                        "in": "query",
                        "required": false,
                        "description": "Filtro opcional de taxonomia. Se a coluna ou a tabela ainda não existir, o parâmetro é ignorado. Exemplos: b2b, b2c, misto.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "setor",
                        "in": "query",
                        "required": false,
                        "description": "Filtro opcional de taxonomia. Se a coluna ou a tabela ainda não existir, o parâmetro é ignorado.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "subsetor",
                        "in": "query",
                        "required": false,
                        "description": "Filtro opcional de taxonomia. Se a coluna ou a tabela ainda não existir, o parâmetro é ignorado.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "tags",
                        "in": "query",
                        "required": false,
                        "description": "Filtro opcional de taxonomia. Se a coluna ou a tabela ainda não existir, o parâmetro é ignorado.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "porte",
                        "in": "query",
                        "required": false,
                        "description": "Filtro opcional de taxonomia. Se a coluna ou a tabela ainda não existir, o parâmetro é ignorado. Exemplos: mei, pequeno, medio, grande.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "gratuita",
                        "in": "query",
                        "required": false,
                        "description": "Filtro opcional de taxonomia. Se a coluna ou a tabela ainda não existir, o parâmetro é ignorado. Exemplos: 0, 1.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "tipo_evento",
                        "in": "query",
                        "required": false,
                        "description": "Filtro opcional de taxonomia. Se a coluna ou a tabela ainda não existir, o parâmetro é ignorado. Exemplos: feira, congresso, workshop, mostra, simposio.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "recorrencia",
                        "in": "query",
                        "required": false,
                        "description": "Filtro opcional de taxonomia. Se a coluna ou a tabela ainda não existir, o parâmetro é ignorado. Exemplos: anual, bienal, semestral, varias_edicoes, unica.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "internacional",
                        "in": "query",
                        "required": false,
                        "description": "Filtro opcional de taxonomia. Se a coluna ou a tabela ainda não existir, o parâmetro é ignorado. Exemplos: 0, 1.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "ambiente",
                        "in": "query",
                        "required": false,
                        "description": "Filtro opcional de taxonomia. Se a coluna ou a tabela ainda não existir, o parâmetro é ignorado. Exemplos: presencial, online, hibrido.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "publico_alvo",
                        "in": "query",
                        "required": false,
                        "description": "Filtro opcional de taxonomia. Se a coluna ou a tabela ainda não existir, o parâmetro é ignorado. Exemplos: industria, varejo, profissional, consumidor.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "acessibilidade",
                        "in": "query",
                        "required": false,
                        "description": "Filtro opcional de taxonomia. Se a coluna ou a tabela ainda não existir, o parâmetro é ignorado. Exemplos: 0, 1.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "pet_friendly",
                        "in": "query",
                        "required": false,
                        "description": "Filtro opcional de taxonomia. Se a coluna ou a tabela ainda não existir, o parâmetro é ignorado. Exemplos: 0, 1.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "nivel_verificacao",
                        "in": "query",
                        "required": false,
                        "description": "Filtro opcional de taxonomia. Se a coluna ou a tabela ainda não existir, o parâmetro é ignorado. O valor vigente é calendario_governo (Calendário oficial do governo). calendario_turismo no filtro equivale a calendario_governo. Exemplos: nao_verificada, fonte_oficial, verificada_equipe, site_oficial, calendario_promotora, calendario_pavilhao, calendario_governo.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Contrato 2.4.0.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListaFeiras"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Sem bearer válido.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Plano de 30 dias, conta sem assinatura ou bloqueada. A mensagem traz o link de upgrade.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Registro publicado não encontrado.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Limite de chamadas ou de resultados. A resposta inclui RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset e Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/feiras/{id}": {
            "get": {
                "tags": [
                    "feiras"
                ],
                "summary": "Feira pelo id",
                "description": "Id estável da feira publicada.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "description": "Id público ed- ou o número legado."
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Contrato 2.4.0.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/UmaFeira"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Sem bearer válido.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Plano de 30 dias, conta sem assinatura ou bloqueada. A mensagem traz o link de upgrade.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Registro publicado não encontrado.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Limite de chamadas ou de resultados. A resposta inclui RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset e Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/feiras/slug/{slug}/{ano}": {
            "get": {
                "tags": [
                    "feiras"
                ],
                "summary": "Feira pelo slug e ano",
                "description": "O slug e o ano também aparecem na URL canônica da ficha.",
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "ano",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Contrato 2.4.0.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/UmaFeira"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Sem bearer válido.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Plano de 30 dias, conta sem assinatura ou bloqueada. A mensagem traz o link de upgrade.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Registro publicado não encontrado.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Limite de chamadas ou de resultados. A resposta inclui RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset e Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/proximas": {
            "get": {
                "tags": [
                    "feiras"
                ],
                "summary": "Próximas feiras",
                "description": "Feiras publicadas que ainda não terminaram, na mesma ordem da busca.",
                "parameters": [
                    {
                        "name": "cidade",
                        "in": "query",
                        "required": false,
                        "description": "Nome da cidade.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "uf",
                        "in": "query",
                        "required": false,
                        "description": "Sigla da UF.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "segmento",
                        "in": "query",
                        "required": false,
                        "description": "Slug ou nome do setor.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "updated_since",
                        "in": "query",
                        "required": false,
                        "description": "Sincronização incremental. ISO 8601.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "cursor",
                        "in": "query",
                        "required": false,
                        "description": "Valor de next_cursor da página anterior.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "limite",
                        "in": "query",
                        "required": false,
                        "description": "Itens nesta página. Teto do plano, no máximo 100.",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Contrato 2.4.0.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListaFeiras"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Sem bearer válido.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Plano de 30 dias, conta sem assinatura ou bloqueada. A mensagem traz o link de upgrade.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Registro publicado não encontrado.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Limite de chamadas ou de resultados. A resposta inclui RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset e Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/setores": {
            "get": {
                "tags": [
                    "setores"
                ],
                "summary": "Setores",
                "description": "Vocabulário de setores e a quantidade de feiras publicadas.",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "Contrato 2.4.0.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListaSetores"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Sem bearer válido.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Plano de 30 dias, conta sem assinatura ou bloqueada. A mensagem traz o link de upgrade.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Registro publicado não encontrado.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Limite de chamadas ou de resultados. A resposta inclui RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset e Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/taxonomia": {
            "get": {
                "tags": [
                    "setores"
                ],
                "summary": "Taxonomia",
                "description": "Valores permitidos de cada eixo. ativo=false indica que o filtro ainda não altera a busca.",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "Contrato 2.4.0.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Taxonomia"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Sem bearer válido.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Plano de 30 dias, conta sem assinatura ou bloqueada. A mensagem traz o link de upgrade.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Registro publicado não encontrado.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Limite de chamadas ou de resultados. A resposta inclui RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset e Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/locais": {
            "get": {
                "tags": [
                    "locais"
                ],
                "summary": "Locais",
                "description": "Locais que têm ao menos uma feira publicada. Ordem: nome, depois id.",
                "parameters": [
                    {
                        "name": "cursor",
                        "in": "query",
                        "required": false,
                        "description": "Valor de next_cursor da página anterior.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "limite",
                        "in": "query",
                        "required": false,
                        "description": "Itens nesta página. Teto do plano, no máximo 100.",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Contrato 2.4.0.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListaLocais"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Sem bearer válido.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Plano de 30 dias, conta sem assinatura ou bloqueada. A mensagem traz o link de upgrade.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Registro publicado não encontrado.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Limite de chamadas ou de resultados. A resposta inclui RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset e Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/locais/{id}": {
            "get": {
                "tags": [
                    "locais"
                ],
                "summary": "Local pelo id",
                "description": "Local com feira publicada.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "description": "Id público lo- ou o número legado."
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Contrato 2.4.0.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/UmLocal"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Sem bearer válido.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Plano de 30 dias, conta sem assinatura ou bloqueada. A mensagem traz o link de upgrade.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Registro publicado não encontrado.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Limite de chamadas ou de resultados. A resposta inclui RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset e Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/palestrantes": {
            "get": {
                "tags": [
                    "grade"
                ],
                "summary": "Palestrantes",
                "description": "Pessoas com papel palestrante ou moderador em edição publicada.",
                "parameters": [
                    {
                        "name": "nome",
                        "in": "query",
                        "required": false,
                        "description": "Trecho do nome.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "empresa",
                        "in": "query",
                        "required": false,
                        "description": "Empresa citada na ficha.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "tema",
                        "in": "query",
                        "required": false,
                        "description": "Título ou trilha da sessão.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "feira",
                        "in": "query",
                        "required": false,
                        "description": "Id fe- ou ed-, ou slug.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "de",
                        "in": "query",
                        "required": false,
                        "description": "AAAA-MM-DD.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "ate",
                        "in": "query",
                        "required": false,
                        "description": "AAAA-MM-DD.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "cursor",
                        "in": "query",
                        "required": false,
                        "description": "Valor de next_cursor.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "limite",
                        "in": "query",
                        "required": false,
                        "description": "Teto do plano, no máximo 100.",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Contrato 2.4.0.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListaPalestrantes"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Sem bearer válido.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Plano de 30 dias, conta sem assinatura ou bloqueada. A mensagem traz o link de upgrade.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Registro publicado não encontrado.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Limite de chamadas ou de resultados. A resposta inclui RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset e Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/edicoes/{id}/programacao": {
            "get": {
                "tags": [
                    "grade"
                ],
                "summary": "Programação",
                "description": "Sessões da edição, em ordem de início.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "dia",
                        "in": "query",
                        "required": false,
                        "description": "AAAA-MM-DD.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "trilha",
                        "in": "query",
                        "required": false,
                        "description": "Nome da trilha.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "tipo",
                        "in": "query",
                        "required": false,
                        "description": "palestra, painel, workshop, keynote ou mesa_redonda.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "cursor",
                        "in": "query",
                        "required": false,
                        "description": "Valor de next_cursor.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "limite",
                        "in": "query",
                        "required": false,
                        "description": "Teto do plano, no máximo 100.",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Contrato 2.4.0.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListaProgramacao"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Sem bearer válido.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Plano de 30 dias, conta sem assinatura ou bloqueada. A mensagem traz o link de upgrade.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Registro publicado não encontrado.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Limite de chamadas ou de resultados. A resposta inclui RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset e Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/edicoes/{id}/expositores": {
            "get": {
                "tags": [
                    "grade"
                ],
                "summary": "Expositores",
                "description": "Empresas expositoras, patrocinadoras ou apoiadoras.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "nome",
                        "in": "query",
                        "required": false,
                        "description": "Trecho do nome.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "segmento",
                        "in": "query",
                        "required": false,
                        "description": "Slug do setor.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "cursor",
                        "in": "query",
                        "required": false,
                        "description": "Valor de next_cursor.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "limite",
                        "in": "query",
                        "required": false,
                        "description": "Teto do plano, no máximo 100.",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Contrato 2.4.0.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListaExpositores"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Sem bearer válido.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Plano de 30 dias, conta sem assinatura ou bloqueada. A mensagem traz o link de upgrade.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Registro publicado não encontrado.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Limite de chamadas ou de resultados. A resposta inclui RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset e Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        }
    },
    "components": {
        "securitySchemes": {
            "bearer": {
                "type": "http",
                "scheme": "bearer",
                "bearerFormat": "opaque",
                "description": "Access token opaco do OAuth do site, ou chave de API adf_k_ do plano API/IA Pro. Escopo feiras:read. A chave só vale na REST."
            },
            "apiKey": {
                "type": "apiKey",
                "in": "header",
                "name": "X-Api-Key",
                "description": "Alternativa ao bearer para a chave de API. O valor claro aparece uma vez na conta e o servidor guarda só o hash."
            }
        },
        "schemas": {
            "Feira": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                    "id",
                    "feira_id",
                    "slug",
                    "ano",
                    "nome",
                    "url",
                    "tipo",
                    "acesso",
                    "abrangencia",
                    "publico_faixa",
                    "faixa_publico",
                    "status",
                    "verificada",
                    "coletado_em",
                    "fonte",
                    "url_oficial",
                    "url_programacao",
                    "url_expositores",
                    "url_credenciamento",
                    "data_inicio",
                    "data_fim",
                    "atualizado_em",
                    "verificado_em",
                    "fonte_url",
                    "exemplo",
                    "online",
                    "itinerante",
                    "data_confirmada",
                    "horarios",
                    "periodicidade",
                    "edicao_num",
                    "edicao",
                    "destaque",
                    "descricao",
                    "descricao_longa",
                    "site",
                    "cidade",
                    "local",
                    "setores",
                    "promotor",
                    "organizador"
                ],
                "properties": {
                    "id": {
                        "type": "string",
                        "pattern": "^ed-[a-f0-9]{16,64}$",
                        "description": "Id público da edição (ed- e hash). Não é reaproveitado."
                    },
                    "feira_id": {
                        "type": "string",
                        "pattern": "^fe-[a-f0-9]{16,64}$",
                        "description": "Id público da feira, a marca que se repete a cada ano."
                    },
                    "status": {
                        "type": "string",
                        "enum": [
                            "confirmada",
                            "adiada",
                            "cancelada",
                            "realizada",
                            "a_confirmar"
                        ]
                    },
                    "faixa_publico": {
                        "anyOf": [
                            {
                                "type": "string",
                                "enum": [
                                    "ate_1000",
                                    "de_1000_a_5000",
                                    "de_5000_a_10000",
                                    "acima_de_10000"
                                ]
                            },
                            {
                                "type": "null"
                            }
                        ]
                    },
                    "verificada": {
                        "type": "boolean"
                    },
                    "coletado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "fonte": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Nome público da origem. Código interno de pista não sai."
                    },
                    "url_oficial": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "url_programacao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "url_expositores": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "url_credenciamento": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "slug": {
                        "type": "string"
                    },
                    "ano": {
                        "type": "integer"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "url": {
                        "type": "string",
                        "format": "uri",
                        "description": "URL canônica da ficha no site."
                    },
                    "tipo": {
                        "anyOf": [
                            {
                                "type": "string",
                                "enum": [
                                    "b2b",
                                    "b2c",
                                    "misto"
                                ]
                            },
                            {
                                "type": "null"
                            }
                        ]
                    },
                    "acesso": {
                        "anyOf": [
                            {
                                "type": "string",
                                "enum": [
                                    "aberto",
                                    "ingresso",
                                    "profissionais"
                                ]
                            },
                            {
                                "type": "null"
                            }
                        ]
                    },
                    "abrangencia": {
                        "anyOf": [
                            {
                                "type": "string",
                                "enum": [
                                    "municipal",
                                    "regional",
                                    "nacional",
                                    "internacional"
                                ]
                            },
                            {
                                "type": "null"
                            }
                        ]
                    },
                    "publico_faixa": {
                        "anyOf": [
                            {
                                "type": "string",
                                "enum": [
                                    "até 1.000",
                                    "de 1.000 a 5.000",
                                    "de 5.000 a 10.000",
                                    "acima de 10.000"
                                ]
                            },
                            {
                                "type": "null"
                            }
                        ]
                    },
                    "data_inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "data_fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "atualizado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "description": "Instante em America/Sao_Paulo, com offset."
                    },
                    "verificado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "fonte_url": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "URL pública usada na checagem. Não é a origem interna da importação."
                    },
                    "exemplo": {
                        "type": "boolean",
                        "description": "Verdadeiro quando a feira é fictícia de demonstração."
                    },
                    "online": {
                        "type": "boolean"
                    },
                    "itinerante": {
                        "type": "boolean"
                    },
                    "data_confirmada": {
                        "type": "boolean"
                    },
                    "horarios": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "periodicidade": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "edicao_num": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "edicao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "destaque": {
                        "type": "boolean"
                    },
                    "descricao": {
                        "type": "string"
                    },
                    "descricao_longa": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "site": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "cidade": {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                            "nome",
                            "uf",
                            "ibge"
                        ],
                        "properties": {
                            "nome": {
                                "type": "string"
                            },
                            "uf": {
                                "type": "string",
                                "minLength": 2,
                                "maxLength": 2
                            },
                            "ibge": {
                                "anyOf": [
                                    {
                                        "type": "string",
                                        "pattern": "^[0-9]{7}$",
                                        "description": "Código do município no IBGE."
                                    },
                                    {
                                        "type": "null"
                                    }
                                ]
                            }
                        }
                    },
                    "local": {
                        "anyOf": [
                            {
                                "type": "object",
                                "additionalProperties": false,
                                "required": [
                                    "id",
                                    "slug",
                                    "nome",
                                    "endereco",
                                    "lat",
                                    "lng",
                                    "cidade"
                                ],
                                "properties": {
                                    "id": {
                                        "type": "string",
                                        "description": "Id público lo- e hash. Não é reaproveitado."
                                    },
                                    "slug": {
                                        "type": "string"
                                    },
                                    "nome": {
                                        "type": "string"
                                    },
                                    "endereco": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "lat": {
                                        "anyOf": [
                                            {
                                                "type": "number",
                                                "minimum": -90,
                                                "maximum": 90
                                            },
                                            {
                                                "type": "null"
                                            }
                                        ]
                                    },
                                    "lng": {
                                        "anyOf": [
                                            {
                                                "type": "number",
                                                "minimum": -180,
                                                "maximum": 180
                                            },
                                            {
                                                "type": "null"
                                            }
                                        ]
                                    },
                                    "cidade": {
                                        "type": "object",
                                        "additionalProperties": false,
                                        "required": [
                                            "nome",
                                            "uf",
                                            "ibge"
                                        ],
                                        "properties": {
                                            "nome": {
                                                "type": "string"
                                            },
                                            "uf": {
                                                "type": "string",
                                                "minLength": 2,
                                                "maxLength": 2
                                            },
                                            "ibge": {
                                                "anyOf": [
                                                    {
                                                        "type": "string",
                                                        "pattern": "^[0-9]{7}$",
                                                        "description": "Código do município no IBGE."
                                                    },
                                                    {
                                                        "type": "null"
                                                    }
                                                ]
                                            }
                                        }
                                    }
                                }
                            },
                            {
                                "type": "null"
                            }
                        ]
                    },
                    "setores": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "additionalProperties": false,
                            "required": [
                                "id",
                                "slug",
                                "nome"
                            ],
                            "properties": {
                                "id": {
                                    "type": "integer",
                                    "minimum": 1
                                },
                                "slug": {
                                    "type": "string"
                                },
                                "nome": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "promotor": {
                        "anyOf": [
                            {
                                "type": "object",
                                "additionalProperties": false,
                                "required": [
                                    "id",
                                    "slug",
                                    "nome",
                                    "verificado",
                                    "site"
                                ],
                                "properties": {
                                    "id": {
                                        "type": "integer",
                                        "minimum": 1
                                    },
                                    "slug": {
                                        "type": "string"
                                    },
                                    "nome": {
                                        "type": "string"
                                    },
                                    "verificado": {
                                        "type": "boolean"
                                    },
                                    "site": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                }
                            },
                            {
                                "type": "null"
                            }
                        ]
                    },
                    "pessoa_promotora": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Nome de pessoa física que a fonte oficial publicou como promotora. Só sai na API e no MCP, para assinante ativo, com contatos_pessoais_publicados. Não entra em HTML, SEO, amostra grátis nem JSON-LD."
                    },
                    "organizador": {
                        "anyOf": [
                            {
                                "type": "object",
                                "additionalProperties": false,
                                "required": [
                                    "id",
                                    "nome",
                                    "site"
                                ],
                                "properties": {
                                    "id": {
                                        "type": "string",
                                        "pattern": "^or-[a-f0-9]{16,64}$"
                                    },
                                    "nome": {
                                        "type": "string"
                                    },
                                    "site": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                }
                            },
                            {
                                "type": "null"
                            }
                        ]
                    },
                    "nivel_verificacao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Nível da checagem. calendario_governo é o calendário oficial do governo (secretarias de agricultura e outros órgãos). O valor antigo calendario_turismo é gravado e filtrado como calendario_governo."
                    },
                    "nivel_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Rótulo em português. calendario_governo sai como Calendário oficial do governo."
                    },
                    "fonte_orgao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Nome do órgão de governo, quando a checagem veio de um calendário oficial."
                    },
                    "contato": {
                        "type": "object",
                        "additionalProperties": false,
                        "description": "Contato publicado, sempre com contato_tipo e fonte_url. pessoal_publicado só entra com a flag ligada, para assinante ativo, na API e no MCP. Pode faltar quando o teto diário estourou: a resposta traz aviso.",
                        "properties": {
                            "email": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "telefone": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "instagram": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "link_expor": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "contato_tipo": {
                                "type": "string",
                                "enum": [
                                    "comercial",
                                    "organizador",
                                    "corporativo",
                                    "pessoal_publicado"
                                ]
                            },
                            "fonte_url": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    },
                    "contatos": {
                        "type": "array",
                        "description": "Contatos desta resposta. Cada item conta no teto diário. pessoal_publicado não sai em HTML, SEO nem na amostra grátis.",
                        "items": {
                            "type": "object",
                            "additionalProperties": false,
                            "properties": {
                                "email": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "telefone": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "instagram": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "link_expor": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "contato_tipo": {
                                    "type": "string",
                                    "enum": [
                                        "comercial",
                                        "organizador",
                                        "corporativo",
                                        "pessoal_publicado"
                                    ]
                                },
                                "fonte_url": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                }
                            }
                        }
                    }
                }
            },
            "ListaFeiras": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                    "contrato",
                    "total",
                    "limite",
                    "next_cursor",
                    "feiras"
                ],
                "properties": {
                    "contrato": {
                        "type": "string",
                        "const": "2.4.0"
                    },
                    "total": {
                        "type": "integer",
                        "minimum": 0,
                        "description": "Total no filtro, não só nesta página."
                    },
                    "limite": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 100
                    },
                    "aviso": {
                        "type": "string",
                        "description": "Presente quando o teto diário de contatos cortou os campos de contato."
                    },
                    "next_cursor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Cursor opaco. Null encerra a lista."
                    },
                    "feiras": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "additionalProperties": false,
                            "required": [
                                "id",
                                "feira_id",
                                "slug",
                                "ano",
                                "nome",
                                "url",
                                "tipo",
                                "acesso",
                                "abrangencia",
                                "publico_faixa",
                                "faixa_publico",
                                "status",
                                "verificada",
                                "coletado_em",
                                "fonte",
                                "url_oficial",
                                "url_programacao",
                                "url_expositores",
                                "url_credenciamento",
                                "data_inicio",
                                "data_fim",
                                "atualizado_em",
                                "verificado_em",
                                "fonte_url",
                                "exemplo",
                                "online",
                                "itinerante",
                                "data_confirmada",
                                "horarios",
                                "periodicidade",
                                "edicao_num",
                                "edicao",
                                "destaque",
                                "descricao",
                                "descricao_longa",
                                "site",
                                "cidade",
                                "local",
                                "setores",
                                "promotor",
                                "organizador"
                            ],
                            "properties": {
                                "id": {
                                    "type": "string",
                                    "pattern": "^ed-[a-f0-9]{16,64}$",
                                    "description": "Id público da edição (ed- e hash). Não é reaproveitado."
                                },
                                "feira_id": {
                                    "type": "string",
                                    "pattern": "^fe-[a-f0-9]{16,64}$",
                                    "description": "Id público da feira, a marca que se repete a cada ano."
                                },
                                "status": {
                                    "type": "string",
                                    "enum": [
                                        "confirmada",
                                        "adiada",
                                        "cancelada",
                                        "realizada",
                                        "a_confirmar"
                                    ]
                                },
                                "faixa_publico": {
                                    "anyOf": [
                                        {
                                            "type": "string",
                                            "enum": [
                                                "ate_1000",
                                                "de_1000_a_5000",
                                                "de_5000_a_10000",
                                                "acima_de_10000"
                                            ]
                                        },
                                        {
                                            "type": "null"
                                        }
                                    ]
                                },
                                "verificada": {
                                    "type": "boolean"
                                },
                                "coletado_em": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "format": "date-time"
                                },
                                "fonte": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "description": "Nome público da origem. Código interno de pista não sai."
                                },
                                "url_oficial": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "url_programacao": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "url_expositores": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "url_credenciamento": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "slug": {
                                    "type": "string"
                                },
                                "ano": {
                                    "type": "integer"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "url": {
                                    "type": "string",
                                    "format": "uri",
                                    "description": "URL canônica da ficha no site."
                                },
                                "tipo": {
                                    "anyOf": [
                                        {
                                            "type": "string",
                                            "enum": [
                                                "b2b",
                                                "b2c",
                                                "misto"
                                            ]
                                        },
                                        {
                                            "type": "null"
                                        }
                                    ]
                                },
                                "acesso": {
                                    "anyOf": [
                                        {
                                            "type": "string",
                                            "enum": [
                                                "aberto",
                                                "ingresso",
                                                "profissionais"
                                            ]
                                        },
                                        {
                                            "type": "null"
                                        }
                                    ]
                                },
                                "abrangencia": {
                                    "anyOf": [
                                        {
                                            "type": "string",
                                            "enum": [
                                                "municipal",
                                                "regional",
                                                "nacional",
                                                "internacional"
                                            ]
                                        },
                                        {
                                            "type": "null"
                                        }
                                    ]
                                },
                                "publico_faixa": {
                                    "anyOf": [
                                        {
                                            "type": "string",
                                            "enum": [
                                                "até 1.000",
                                                "de 1.000 a 5.000",
                                                "de 5.000 a 10.000",
                                                "acima de 10.000"
                                            ]
                                        },
                                        {
                                            "type": "null"
                                        }
                                    ]
                                },
                                "data_inicio": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "format": "date"
                                },
                                "data_fim": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "format": "date"
                                },
                                "atualizado_em": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "format": "date-time",
                                    "description": "Instante em America/Sao_Paulo, com offset."
                                },
                                "verificado_em": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "format": "date"
                                },
                                "fonte_url": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "description": "URL pública usada na checagem. Não é a origem interna da importação."
                                },
                                "exemplo": {
                                    "type": "boolean",
                                    "description": "Verdadeiro quando a feira é fictícia de demonstração."
                                },
                                "online": {
                                    "type": "boolean"
                                },
                                "itinerante": {
                                    "type": "boolean"
                                },
                                "data_confirmada": {
                                    "type": "boolean"
                                },
                                "horarios": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "periodicidade": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "edicao_num": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                },
                                "edicao": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "destaque": {
                                    "type": "boolean"
                                },
                                "descricao": {
                                    "type": "string"
                                },
                                "descricao_longa": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "site": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "cidade": {
                                    "type": "object",
                                    "additionalProperties": false,
                                    "required": [
                                        "nome",
                                        "uf",
                                        "ibge"
                                    ],
                                    "properties": {
                                        "nome": {
                                            "type": "string"
                                        },
                                        "uf": {
                                            "type": "string",
                                            "minLength": 2,
                                            "maxLength": 2
                                        },
                                        "ibge": {
                                            "anyOf": [
                                                {
                                                    "type": "string",
                                                    "pattern": "^[0-9]{7}$",
                                                    "description": "Código do município no IBGE."
                                                },
                                                {
                                                    "type": "null"
                                                }
                                            ]
                                        }
                                    }
                                },
                                "local": {
                                    "anyOf": [
                                        {
                                            "type": "object",
                                            "additionalProperties": false,
                                            "required": [
                                                "id",
                                                "slug",
                                                "nome",
                                                "endereco",
                                                "lat",
                                                "lng",
                                                "cidade"
                                            ],
                                            "properties": {
                                                "id": {
                                                    "type": "string",
                                                    "description": "Id público lo- e hash. Não é reaproveitado."
                                                },
                                                "slug": {
                                                    "type": "string"
                                                },
                                                "nome": {
                                                    "type": "string"
                                                },
                                                "endereco": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "lat": {
                                                    "anyOf": [
                                                        {
                                                            "type": "number",
                                                            "minimum": -90,
                                                            "maximum": 90
                                                        },
                                                        {
                                                            "type": "null"
                                                        }
                                                    ]
                                                },
                                                "lng": {
                                                    "anyOf": [
                                                        {
                                                            "type": "number",
                                                            "minimum": -180,
                                                            "maximum": 180
                                                        },
                                                        {
                                                            "type": "null"
                                                        }
                                                    ]
                                                },
                                                "cidade": {
                                                    "type": "object",
                                                    "additionalProperties": false,
                                                    "required": [
                                                        "nome",
                                                        "uf",
                                                        "ibge"
                                                    ],
                                                    "properties": {
                                                        "nome": {
                                                            "type": "string"
                                                        },
                                                        "uf": {
                                                            "type": "string",
                                                            "minLength": 2,
                                                            "maxLength": 2
                                                        },
                                                        "ibge": {
                                                            "anyOf": [
                                                                {
                                                                    "type": "string",
                                                                    "pattern": "^[0-9]{7}$",
                                                                    "description": "Código do município no IBGE."
                                                                },
                                                                {
                                                                    "type": "null"
                                                                }
                                                            ]
                                                        }
                                                    }
                                                }
                                            }
                                        },
                                        {
                                            "type": "null"
                                        }
                                    ]
                                },
                                "setores": {
                                    "type": "array",
                                    "items": {
                                        "type": "object",
                                        "additionalProperties": false,
                                        "required": [
                                            "id",
                                            "slug",
                                            "nome"
                                        ],
                                        "properties": {
                                            "id": {
                                                "type": "integer",
                                                "minimum": 1
                                            },
                                            "slug": {
                                                "type": "string"
                                            },
                                            "nome": {
                                                "type": "string"
                                            }
                                        }
                                    }
                                },
                                "promotor": {
                                    "anyOf": [
                                        {
                                            "type": "object",
                                            "additionalProperties": false,
                                            "required": [
                                                "id",
                                                "slug",
                                                "nome",
                                                "verificado",
                                                "site"
                                            ],
                                            "properties": {
                                                "id": {
                                                    "type": "integer",
                                                    "minimum": 1
                                                },
                                                "slug": {
                                                    "type": "string"
                                                },
                                                "nome": {
                                                    "type": "string"
                                                },
                                                "verificado": {
                                                    "type": "boolean"
                                                },
                                                "site": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                }
                                            }
                                        },
                                        {
                                            "type": "null"
                                        }
                                    ]
                                },
                                "pessoa_promotora": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "description": "Nome de pessoa física que a fonte oficial publicou como promotora. Só sai na API e no MCP, para assinante ativo, com contatos_pessoais_publicados. Não entra em HTML, SEO, amostra grátis nem JSON-LD."
                                },
                                "organizador": {
                                    "anyOf": [
                                        {
                                            "type": "object",
                                            "additionalProperties": false,
                                            "required": [
                                                "id",
                                                "nome",
                                                "site"
                                            ],
                                            "properties": {
                                                "id": {
                                                    "type": "string",
                                                    "pattern": "^or-[a-f0-9]{16,64}$"
                                                },
                                                "nome": {
                                                    "type": "string"
                                                },
                                                "site": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                }
                                            }
                                        },
                                        {
                                            "type": "null"
                                        }
                                    ]
                                },
                                "nivel_verificacao": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "description": "Nível da checagem. calendario_governo é o calendário oficial do governo (secretarias de agricultura e outros órgãos). O valor antigo calendario_turismo é gravado e filtrado como calendario_governo."
                                },
                                "nivel_rotulo": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "description": "Rótulo em português. calendario_governo sai como Calendário oficial do governo."
                                },
                                "fonte_orgao": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "description": "Nome do órgão de governo, quando a checagem veio de um calendário oficial."
                                },
                                "contato": {
                                    "type": "object",
                                    "additionalProperties": false,
                                    "description": "Contato publicado, sempre com contato_tipo e fonte_url. pessoal_publicado só entra com a flag ligada, para assinante ativo, na API e no MCP. Pode faltar quando o teto diário estourou: a resposta traz aviso.",
                                    "properties": {
                                        "email": {
                                            "type": [
                                                "string",
                                                "null"
                                            ]
                                        },
                                        "telefone": {
                                            "type": [
                                                "string",
                                                "null"
                                            ]
                                        },
                                        "instagram": {
                                            "type": [
                                                "string",
                                                "null"
                                            ]
                                        },
                                        "link_expor": {
                                            "type": [
                                                "string",
                                                "null"
                                            ]
                                        },
                                        "contato_tipo": {
                                            "type": "string",
                                            "enum": [
                                                "comercial",
                                                "organizador",
                                                "corporativo",
                                                "pessoal_publicado"
                                            ]
                                        },
                                        "fonte_url": {
                                            "type": [
                                                "string",
                                                "null"
                                            ]
                                        }
                                    }
                                },
                                "contatos": {
                                    "type": "array",
                                    "description": "Contatos desta resposta. Cada item conta no teto diário. pessoal_publicado não sai em HTML, SEO nem na amostra grátis.",
                                    "items": {
                                        "type": "object",
                                        "additionalProperties": false,
                                        "properties": {
                                            "email": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ]
                                            },
                                            "telefone": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ]
                                            },
                                            "instagram": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ]
                                            },
                                            "link_expor": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ]
                                            },
                                            "contato_tipo": {
                                                "type": "string",
                                                "enum": [
                                                    "comercial",
                                                    "organizador",
                                                    "corporativo",
                                                    "pessoal_publicado"
                                                ]
                                            },
                                            "fonte_url": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ]
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            },
            "UmaFeira": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                    "contrato",
                    "feira"
                ],
                "properties": {
                    "contrato": {
                        "type": "string",
                        "const": "2.4.0"
                    },
                    "aviso": {
                        "type": "string"
                    },
                    "feira": {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                            "id",
                            "feira_id",
                            "slug",
                            "ano",
                            "nome",
                            "url",
                            "tipo",
                            "acesso",
                            "abrangencia",
                            "publico_faixa",
                            "faixa_publico",
                            "status",
                            "verificada",
                            "coletado_em",
                            "fonte",
                            "url_oficial",
                            "url_programacao",
                            "url_expositores",
                            "url_credenciamento",
                            "data_inicio",
                            "data_fim",
                            "atualizado_em",
                            "verificado_em",
                            "fonte_url",
                            "exemplo",
                            "online",
                            "itinerante",
                            "data_confirmada",
                            "horarios",
                            "periodicidade",
                            "edicao_num",
                            "edicao",
                            "destaque",
                            "descricao",
                            "descricao_longa",
                            "site",
                            "cidade",
                            "local",
                            "setores",
                            "promotor",
                            "organizador"
                        ],
                        "properties": {
                            "id": {
                                "type": "string",
                                "pattern": "^ed-[a-f0-9]{16,64}$",
                                "description": "Id público da edição (ed- e hash). Não é reaproveitado."
                            },
                            "feira_id": {
                                "type": "string",
                                "pattern": "^fe-[a-f0-9]{16,64}$",
                                "description": "Id público da feira, a marca que se repete a cada ano."
                            },
                            "status": {
                                "type": "string",
                                "enum": [
                                    "confirmada",
                                    "adiada",
                                    "cancelada",
                                    "realizada",
                                    "a_confirmar"
                                ]
                            },
                            "faixa_publico": {
                                "anyOf": [
                                    {
                                        "type": "string",
                                        "enum": [
                                            "ate_1000",
                                            "de_1000_a_5000",
                                            "de_5000_a_10000",
                                            "acima_de_10000"
                                        ]
                                    },
                                    {
                                        "type": "null"
                                    }
                                ]
                            },
                            "verificada": {
                                "type": "boolean"
                            },
                            "coletado_em": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            },
                            "fonte": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "description": "Nome público da origem. Código interno de pista não sai."
                            },
                            "url_oficial": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "url_programacao": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "url_expositores": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "url_credenciamento": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "slug": {
                                "type": "string"
                            },
                            "ano": {
                                "type": "integer"
                            },
                            "nome": {
                                "type": "string"
                            },
                            "url": {
                                "type": "string",
                                "format": "uri",
                                "description": "URL canônica da ficha no site."
                            },
                            "tipo": {
                                "anyOf": [
                                    {
                                        "type": "string",
                                        "enum": [
                                            "b2b",
                                            "b2c",
                                            "misto"
                                        ]
                                    },
                                    {
                                        "type": "null"
                                    }
                                ]
                            },
                            "acesso": {
                                "anyOf": [
                                    {
                                        "type": "string",
                                        "enum": [
                                            "aberto",
                                            "ingresso",
                                            "profissionais"
                                        ]
                                    },
                                    {
                                        "type": "null"
                                    }
                                ]
                            },
                            "abrangencia": {
                                "anyOf": [
                                    {
                                        "type": "string",
                                        "enum": [
                                            "municipal",
                                            "regional",
                                            "nacional",
                                            "internacional"
                                        ]
                                    },
                                    {
                                        "type": "null"
                                    }
                                ]
                            },
                            "publico_faixa": {
                                "anyOf": [
                                    {
                                        "type": "string",
                                        "enum": [
                                            "até 1.000",
                                            "de 1.000 a 5.000",
                                            "de 5.000 a 10.000",
                                            "acima de 10.000"
                                        ]
                                    },
                                    {
                                        "type": "null"
                                    }
                                ]
                            },
                            "data_inicio": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date"
                            },
                            "data_fim": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date"
                            },
                            "atualizado_em": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time",
                                "description": "Instante em America/Sao_Paulo, com offset."
                            },
                            "verificado_em": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date"
                            },
                            "fonte_url": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "description": "URL pública usada na checagem. Não é a origem interna da importação."
                            },
                            "exemplo": {
                                "type": "boolean",
                                "description": "Verdadeiro quando a feira é fictícia de demonstração."
                            },
                            "online": {
                                "type": "boolean"
                            },
                            "itinerante": {
                                "type": "boolean"
                            },
                            "data_confirmada": {
                                "type": "boolean"
                            },
                            "horarios": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "periodicidade": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "edicao_num": {
                                "type": [
                                    "integer",
                                    "null"
                                ]
                            },
                            "edicao": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "destaque": {
                                "type": "boolean"
                            },
                            "descricao": {
                                "type": "string"
                            },
                            "descricao_longa": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "site": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "cidade": {
                                "type": "object",
                                "additionalProperties": false,
                                "required": [
                                    "nome",
                                    "uf",
                                    "ibge"
                                ],
                                "properties": {
                                    "nome": {
                                        "type": "string"
                                    },
                                    "uf": {
                                        "type": "string",
                                        "minLength": 2,
                                        "maxLength": 2
                                    },
                                    "ibge": {
                                        "anyOf": [
                                            {
                                                "type": "string",
                                                "pattern": "^[0-9]{7}$",
                                                "description": "Código do município no IBGE."
                                            },
                                            {
                                                "type": "null"
                                            }
                                        ]
                                    }
                                }
                            },
                            "local": {
                                "anyOf": [
                                    {
                                        "type": "object",
                                        "additionalProperties": false,
                                        "required": [
                                            "id",
                                            "slug",
                                            "nome",
                                            "endereco",
                                            "lat",
                                            "lng",
                                            "cidade"
                                        ],
                                        "properties": {
                                            "id": {
                                                "type": "string",
                                                "description": "Id público lo- e hash. Não é reaproveitado."
                                            },
                                            "slug": {
                                                "type": "string"
                                            },
                                            "nome": {
                                                "type": "string"
                                            },
                                            "endereco": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ]
                                            },
                                            "lat": {
                                                "anyOf": [
                                                    {
                                                        "type": "number",
                                                        "minimum": -90,
                                                        "maximum": 90
                                                    },
                                                    {
                                                        "type": "null"
                                                    }
                                                ]
                                            },
                                            "lng": {
                                                "anyOf": [
                                                    {
                                                        "type": "number",
                                                        "minimum": -180,
                                                        "maximum": 180
                                                    },
                                                    {
                                                        "type": "null"
                                                    }
                                                ]
                                            },
                                            "cidade": {
                                                "type": "object",
                                                "additionalProperties": false,
                                                "required": [
                                                    "nome",
                                                    "uf",
                                                    "ibge"
                                                ],
                                                "properties": {
                                                    "nome": {
                                                        "type": "string"
                                                    },
                                                    "uf": {
                                                        "type": "string",
                                                        "minLength": 2,
                                                        "maxLength": 2
                                                    },
                                                    "ibge": {
                                                        "anyOf": [
                                                            {
                                                                "type": "string",
                                                                "pattern": "^[0-9]{7}$",
                                                                "description": "Código do município no IBGE."
                                                            },
                                                            {
                                                                "type": "null"
                                                            }
                                                        ]
                                                    }
                                                }
                                            }
                                        }
                                    },
                                    {
                                        "type": "null"
                                    }
                                ]
                            },
                            "setores": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "additionalProperties": false,
                                    "required": [
                                        "id",
                                        "slug",
                                        "nome"
                                    ],
                                    "properties": {
                                        "id": {
                                            "type": "integer",
                                            "minimum": 1
                                        },
                                        "slug": {
                                            "type": "string"
                                        },
                                        "nome": {
                                            "type": "string"
                                        }
                                    }
                                }
                            },
                            "promotor": {
                                "anyOf": [
                                    {
                                        "type": "object",
                                        "additionalProperties": false,
                                        "required": [
                                            "id",
                                            "slug",
                                            "nome",
                                            "verificado",
                                            "site"
                                        ],
                                        "properties": {
                                            "id": {
                                                "type": "integer",
                                                "minimum": 1
                                            },
                                            "slug": {
                                                "type": "string"
                                            },
                                            "nome": {
                                                "type": "string"
                                            },
                                            "verificado": {
                                                "type": "boolean"
                                            },
                                            "site": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ]
                                            }
                                        }
                                    },
                                    {
                                        "type": "null"
                                    }
                                ]
                            },
                            "pessoa_promotora": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "description": "Nome de pessoa física que a fonte oficial publicou como promotora. Só sai na API e no MCP, para assinante ativo, com contatos_pessoais_publicados. Não entra em HTML, SEO, amostra grátis nem JSON-LD."
                            },
                            "organizador": {
                                "anyOf": [
                                    {
                                        "type": "object",
                                        "additionalProperties": false,
                                        "required": [
                                            "id",
                                            "nome",
                                            "site"
                                        ],
                                        "properties": {
                                            "id": {
                                                "type": "string",
                                                "pattern": "^or-[a-f0-9]{16,64}$"
                                            },
                                            "nome": {
                                                "type": "string"
                                            },
                                            "site": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ]
                                            }
                                        }
                                    },
                                    {
                                        "type": "null"
                                    }
                                ]
                            },
                            "nivel_verificacao": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "description": "Nível da checagem. calendario_governo é o calendário oficial do governo (secretarias de agricultura e outros órgãos). O valor antigo calendario_turismo é gravado e filtrado como calendario_governo."
                            },
                            "nivel_rotulo": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "description": "Rótulo em português. calendario_governo sai como Calendário oficial do governo."
                            },
                            "fonte_orgao": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "description": "Nome do órgão de governo, quando a checagem veio de um calendário oficial."
                            },
                            "contato": {
                                "type": "object",
                                "additionalProperties": false,
                                "description": "Contato publicado, sempre com contato_tipo e fonte_url. pessoal_publicado só entra com a flag ligada, para assinante ativo, na API e no MCP. Pode faltar quando o teto diário estourou: a resposta traz aviso.",
                                "properties": {
                                    "email": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "telefone": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "instagram": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "link_expor": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "contato_tipo": {
                                        "type": "string",
                                        "enum": [
                                            "comercial",
                                            "organizador",
                                            "corporativo",
                                            "pessoal_publicado"
                                        ]
                                    },
                                    "fonte_url": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                }
                            },
                            "contatos": {
                                "type": "array",
                                "description": "Contatos desta resposta. Cada item conta no teto diário. pessoal_publicado não sai em HTML, SEO nem na amostra grátis.",
                                "items": {
                                    "type": "object",
                                    "additionalProperties": false,
                                    "properties": {
                                        "email": {
                                            "type": [
                                                "string",
                                                "null"
                                            ]
                                        },
                                        "telefone": {
                                            "type": [
                                                "string",
                                                "null"
                                            ]
                                        },
                                        "instagram": {
                                            "type": [
                                                "string",
                                                "null"
                                            ]
                                        },
                                        "link_expor": {
                                            "type": [
                                                "string",
                                                "null"
                                            ]
                                        },
                                        "contato_tipo": {
                                            "type": "string",
                                            "enum": [
                                                "comercial",
                                                "organizador",
                                                "corporativo",
                                                "pessoal_publicado"
                                            ]
                                        },
                                        "fonte_url": {
                                            "type": [
                                                "string",
                                                "null"
                                            ]
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            },
            "ListaSetores": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                    "contrato",
                    "total",
                    "setores"
                ],
                "properties": {
                    "contrato": {
                        "type": "string",
                        "const": "2.4.0"
                    },
                    "total": {
                        "type": "integer",
                        "minimum": 0
                    },
                    "setores": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "additionalProperties": false,
                            "required": [
                                "id",
                                "slug",
                                "nome",
                                "feiras_publicadas"
                            ],
                            "properties": {
                                "id": {
                                    "type": "integer",
                                    "minimum": 1
                                },
                                "slug": {
                                    "type": "string"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "feiras_publicadas": {
                                    "type": "integer",
                                    "minimum": 0
                                }
                            }
                        }
                    }
                }
            },
            "ListaLocais": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                    "contrato",
                    "total",
                    "limite",
                    "next_cursor",
                    "locais"
                ],
                "properties": {
                    "contrato": {
                        "type": "string",
                        "const": "2.4.0"
                    },
                    "total": {
                        "type": "integer",
                        "minimum": 0
                    },
                    "limite": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 100
                    },
                    "aviso": {
                        "type": "string",
                        "description": "Presente quando o teto diário de contatos cortou os campos de contato."
                    },
                    "next_cursor": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "locais": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "additionalProperties": false,
                            "required": [
                                "id",
                                "slug",
                                "nome",
                                "endereco",
                                "lat",
                                "lng",
                                "cidade",
                                "feiras_publicadas"
                            ],
                            "properties": {
                                "id": {
                                    "type": "string",
                                    "description": "Id público lo- e hash. Não é reaproveitado."
                                },
                                "slug": {
                                    "type": "string"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "endereco": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "lat": {
                                    "anyOf": [
                                        {
                                            "type": "number",
                                            "minimum": -90,
                                            "maximum": 90
                                        },
                                        {
                                            "type": "null"
                                        }
                                    ]
                                },
                                "lng": {
                                    "anyOf": [
                                        {
                                            "type": "number",
                                            "minimum": -180,
                                            "maximum": 180
                                        },
                                        {
                                            "type": "null"
                                        }
                                    ]
                                },
                                "cidade": {
                                    "type": "object",
                                    "additionalProperties": false,
                                    "required": [
                                        "nome",
                                        "uf",
                                        "ibge"
                                    ],
                                    "properties": {
                                        "nome": {
                                            "type": "string"
                                        },
                                        "uf": {
                                            "type": "string",
                                            "minLength": 2,
                                            "maxLength": 2
                                        },
                                        "ibge": {
                                            "anyOf": [
                                                {
                                                    "type": "string",
                                                    "pattern": "^[0-9]{7}$",
                                                    "description": "Código do município no IBGE."
                                                },
                                                {
                                                    "type": "null"
                                                }
                                            ]
                                        }
                                    }
                                },
                                "feiras_publicadas": {
                                    "type": "integer",
                                    "minimum": 0
                                }
                            }
                        }
                    }
                }
            },
            "UmLocal": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                    "contrato",
                    "local"
                ],
                "properties": {
                    "contrato": {
                        "type": "string",
                        "const": "2.4.0"
                    },
                    "local": {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                            "id",
                            "slug",
                            "nome",
                            "endereco",
                            "lat",
                            "lng",
                            "cidade",
                            "feiras_publicadas"
                        ],
                        "properties": {
                            "id": {
                                "type": "string",
                                "description": "Id público lo- e hash. Não é reaproveitado."
                            },
                            "slug": {
                                "type": "string"
                            },
                            "nome": {
                                "type": "string"
                            },
                            "endereco": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "lat": {
                                "anyOf": [
                                    {
                                        "type": "number",
                                        "minimum": -90,
                                        "maximum": 90
                                    },
                                    {
                                        "type": "null"
                                    }
                                ]
                            },
                            "lng": {
                                "anyOf": [
                                    {
                                        "type": "number",
                                        "minimum": -180,
                                        "maximum": 180
                                    },
                                    {
                                        "type": "null"
                                    }
                                ]
                            },
                            "cidade": {
                                "type": "object",
                                "additionalProperties": false,
                                "required": [
                                    "nome",
                                    "uf",
                                    "ibge"
                                ],
                                "properties": {
                                    "nome": {
                                        "type": "string"
                                    },
                                    "uf": {
                                        "type": "string",
                                        "minLength": 2,
                                        "maxLength": 2
                                    },
                                    "ibge": {
                                        "anyOf": [
                                            {
                                                "type": "string",
                                                "pattern": "^[0-9]{7}$",
                                                "description": "Código do município no IBGE."
                                            },
                                            {
                                                "type": "null"
                                            }
                                        ]
                                    }
                                }
                            },
                            "feiras_publicadas": {
                                "type": "integer",
                                "minimum": 0
                            }
                        }
                    }
                }
            },
            "ListaPalestrantes": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                    "contrato",
                    "total",
                    "limite",
                    "next_cursor",
                    "palestrantes"
                ],
                "properties": {
                    "contrato": {
                        "type": "string",
                        "const": "2.4.0"
                    },
                    "total": {
                        "type": "integer",
                        "minimum": 0
                    },
                    "limite": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 100
                    },
                    "aviso": {
                        "type": "string",
                        "description": "Presente quando o teto diário de contatos cortou os campos de contato."
                    },
                    "next_cursor": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "edicao_id": {
                        "type": "string"
                    },
                    "palestrantes": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "additionalProperties": false,
                            "required": [
                                "id",
                                "nome",
                                "cargo",
                                "empresa",
                                "mini_bio_publica",
                                "url_perfil_publico",
                                "fonte",
                                "fonte_url",
                                "coletado_em",
                                "verificado_em",
                                "verificada",
                                "participacoes"
                            ],
                            "properties": {
                                "id": {
                                    "type": "string"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "cargo": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "empresa": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "mini_bio_publica": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "url_perfil_publico": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "fonte": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "fonte_url": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "coletado_em": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "verificado_em": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "verificada": {
                                    "type": "boolean"
                                },
                                "participacoes": {
                                    "type": "array",
                                    "items": {
                                        "type": "object",
                                        "additionalProperties": true
                                    }
                                },
                                "contatos": {
                                    "type": "array",
                                    "description": "Contatos adicionais. Cada item traz contato_tipo e fonte_url. pessoal_publicado só entra para assinante ativo, com a bandeira ligada, na API e no MCP, e conta no teto diário. Não sai em HTML, SEO nem na amostra grátis.",
                                    "items": {
                                        "type": "object",
                                        "additionalProperties": false,
                                        "required": [
                                            "contato_tipo",
                                            "fonte_url"
                                        ],
                                        "properties": {
                                            "email": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ]
                                            },
                                            "telefone": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ]
                                            },
                                            "contato_tipo": {
                                                "type": "string",
                                                "enum": [
                                                    "comercial",
                                                    "organizador",
                                                    "corporativo",
                                                    "pessoal_publicado"
                                                ]
                                            },
                                            "fonte_url": {
                                                "type": "string"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            },
            "ListaProgramacao": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                    "contrato",
                    "total",
                    "limite",
                    "next_cursor",
                    "sessoes"
                ],
                "properties": {
                    "contrato": {
                        "type": "string",
                        "const": "2.4.0"
                    },
                    "total": {
                        "type": "integer",
                        "minimum": 0
                    },
                    "limite": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 100
                    },
                    "aviso": {
                        "type": "string",
                        "description": "Presente quando o teto diário de contatos cortou os campos de contato."
                    },
                    "next_cursor": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "edicao_id": {
                        "type": "string"
                    },
                    "sessoes": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "additionalProperties": false,
                            "required": [
                                "id",
                                "edicao_id",
                                "titulo",
                                "descricao",
                                "tipo",
                                "inicio",
                                "fim",
                                "sala",
                                "trilha",
                                "url",
                                "fonte",
                                "fonte_url",
                                "coletado_em",
                                "verificado_em",
                                "verificada"
                            ],
                            "properties": {
                                "id": {
                                    "type": "string"
                                },
                                "edicao_id": {
                                    "type": "string"
                                },
                                "titulo": {
                                    "type": "string"
                                },
                                "descricao": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "tipo": {
                                    "type": "string",
                                    "enum": [
                                        "palestra",
                                        "painel",
                                        "workshop",
                                        "keynote",
                                        "mesa_redonda"
                                    ]
                                },
                                "inicio": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "fim": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "sala": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "trilha": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "url": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "fonte": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "fonte_url": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "coletado_em": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "verificado_em": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "verificada": {
                                    "type": "boolean"
                                }
                            }
                        }
                    }
                }
            },
            "ListaExpositores": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                    "contrato",
                    "total",
                    "limite",
                    "next_cursor",
                    "expositores"
                ],
                "properties": {
                    "contrato": {
                        "type": "string",
                        "const": "2.4.0"
                    },
                    "total": {
                        "type": "integer",
                        "minimum": 0
                    },
                    "limite": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 100
                    },
                    "aviso": {
                        "type": "string",
                        "description": "Presente quando o teto diário de contatos cortou os campos de contato."
                    },
                    "next_cursor": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "edicao_id": {
                        "type": "string"
                    },
                    "expositores": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "additionalProperties": false,
                            "required": [
                                "id",
                                "participacao_id",
                                "edicao_id",
                                "nome",
                                "cnpj",
                                "site",
                                "cidade",
                                "uf",
                                "pais",
                                "papel",
                                "estande",
                                "categoria_patrocinio",
                                "fonte",
                                "fonte_url",
                                "verificada"
                            ],
                            "properties": {
                                "id": {
                                    "type": "string"
                                },
                                "participacao_id": {
                                    "type": "string"
                                },
                                "edicao_id": {
                                    "type": "string"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "cnpj": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "site": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "cidade": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "uf": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "pais": {
                                    "type": "string"
                                },
                                "papel": {
                                    "type": "string",
                                    "enum": [
                                        "palestrante",
                                        "moderador",
                                        "expositor",
                                        "patrocinador",
                                        "apoiador"
                                    ]
                                },
                                "estande": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "categoria_patrocinio": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "fonte": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "fonte_url": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "verificada": {
                                    "type": "boolean"
                                }
                            }
                        }
                    }
                }
            },
            "Taxonomia": {
                "type": "object",
                "required": [
                    "contrato",
                    "taxonomia"
                ],
                "properties": {
                    "contrato": {
                        "type": "string",
                        "const": "2.4.0"
                    },
                    "taxonomia": {
                        "type": "object"
                    }
                }
            },
            "Erro": {
                "type": "object",
                "required": [
                    "contrato",
                    "erro",
                    "mensagem"
                ],
                "properties": {
                    "contrato": {
                        "type": "string",
                        "const": "2.4.0"
                    },
                    "erro": {
                        "type": "string"
                    },
                    "mensagem": {
                        "type": "string"
                    }
                }
            }
        }
    }
}