> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dados.rio/llms.txt
> Use this file to discover all available pages before exploring further.

# Busca unificada de serviços públicos

> Executa busca com 4 estratégias: keyword (textual), semantic (vetorial), hybrid (combinada) ou ai (agente inteligente). Resposta inclui total_count (total do Typesense) e filtered_count (após aplicar thresholds).



## OpenAPI

````yaml https://raw.githubusercontent.com/prefeitura-rio/app-busca-search/refs/heads/main/docs/openapi-v3.json get /api/v1/search
openapi: 3.0.0
info:
  description: >-
    API para busca textual e vetorial usando Typesense e embeddings gerados via
    Google Gemini
  title: Mecanismo de Busca API
  termsOfService: http://swagger.io/terms/
  contact:
    name: Prefeitura do Rio de Janeiro
    url: https://prefeitura.rio
    email: contato@prefeitura.rio
  license:
    name: Apache 2.0
    url: http://www.apache.org/licenses/LICENSE-2.0.html
  version: '1.0'
servers:
  - url: https://services.pref.rio/app-busca-search
    description: Production server
  - url: https://services.staging.app.dados.rio/app-busca-search
    description: Staging server
security: []
paths:
  /api/v1/search:
    get:
      tags:
        - search
      summary: Busca unificada de serviços públicos
      description: >-
        Executa busca com 4 estratégias: keyword (textual), semantic (vetorial),
        hybrid (combinada) ou ai (agente inteligente). Resposta inclui
        total_count (total do Typesense) e filtered_count (após aplicar
        thresholds).
      parameters:
        - description: Texto da busca
          name: q
          in: query
          required: true
          schema:
            type: string
        - description: 'Tipo de busca: keyword, semantic, hybrid ou ai'
          name: type
          in: query
          required: true
          schema:
            type: string
        - description: 'Número da página (mínimo: 1)'
          name: page
          in: query
          schema:
            type: integer
            default: 1
        - description: 'Resultados por página (máximo: 100)'
          name: per_page
          in: query
          schema:
            type: integer
            default: 10
        - description: Incluir serviços inativos (status != 1)
          name: include_inactive
          in: query
          schema:
            type: boolean
            default: false
        - description: >-
            Alpha para busca hybrid (0-1). Alpha=0.3 significa 30% texto + 70%
            vetor.
          name: alpha
          in: query
          schema:
            type: number
            default: 0.3
        - description: >-
            Score mínimo para busca keyword (0-1, filtra text_match normalizado
            via log normalization)
          name: threshold_keyword
          in: query
          schema:
            type: number
        - description: >-
            Score mínimo para busca semantic (0-1, filtra por similaridade
            vetorial)
          name: threshold_semantic
          in: query
          schema:
            type: number
        - description: Score mínimo para busca hybrid (0-1, filtra score híbrido combinado)
          name: threshold_hybrid
          in: query
          schema:
            type: number
        - description: >-
            Score mínimo para busca AI com generate_scores=true (0-1, filtra por
            ai_score.final_score)
          name: threshold_ai
          in: query
          schema:
            type: number
        - description: >-
            Se true, exclui serviços exclusivos para agentes IA (mostra apenas
            serviços para humanos)
          name: exclude_agent_exclusive
          in: query
          schema:
            type: boolean
            default: false
        - description: Gera scores detalhados via LLM para os resultados (apenas type=ai).
          name: generate_scores
          in: query
          schema:
            type: boolean
            default: false
        - description: >-
            Aplica boost por recência: docs atualizados nos últimos 30 dias
            mantêm score, docs mais antigos sofrem decay gradual
          name: recency_boost
          in: query
          schema:
            type: boolean
            default: false
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.SearchResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                additionalProperties:
                  type: string
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                additionalProperties:
                  type: string
      security:
        - bearerAuth: []
components:
  schemas:
    models.SearchResponse:
      type: object
      properties:
        filtered_count:
          description: Após aplicar thresholds
          type: integer
        metadata:
          description: Para AI search
          type: object
          additionalProperties: true
        page:
          type: integer
        per_page:
          type: integer
        results:
          type: array
          items:
            $ref: '#/components/schemas/models.ServiceDocument'
        search_type:
          $ref: '#/components/schemas/models.SearchType'
        total_count:
          description: Total original do Typesense
          type: integer
    models.ServiceDocument:
      type: object
      properties:
        category:
          type: string
        created_at:
          type: integer
        description:
          type: string
        id:
          type: string
        metadata:
          type: object
          additionalProperties: true
        slug:
          type: string
        status:
          type: integer
        subcategory:
          type: string
        title:
          type: string
        updated_at:
          type: integer
    models.SearchType:
      type: string
      enum:
        - keyword
        - semantic
        - hybrid
        - ai
      x-enum-varnames:
        - SearchTypeKeyword
        - SearchTypeSemantic
        - SearchTypeHybrid
        - SearchTypeAI
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

````