{
  "openapi": "3.1.0",
  "info": {
    "title": "CRM Oficina Martech API",
    "version": "0.1.0-beta",
    "description": "API pública beta para integrações server-to-server do CRM Oficina Martech."
  },
  "servers": [
    {
      "url": "https://crm.oficinamartech.com/api"
    }
  ],
  "components": {
    "securitySchemes": {
      "ApiKeyBearer": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "crm_live"
      }
    }
  },
  "security": [
    {
      "ApiKeyBearer": []
    }
  ],
  "paths": {
    "/contacts/message-search": {
      "get": {
        "summary": "Buscar contatos por mensagens",
        "description": "Retorna contatos de uma organização que mencionaram uma palavra, frase ou lista de termos em mensagens.",
        "operationId": "searchContactsByMessageTerms",
        "parameters": [
          {
            "name": "organization_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Identificador da organização consultada. Continua obrigatório mesmo com API key."
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Palavra ou frase única para busca. Exemplo: produto exemplo."
          },
          {
            "name": "keywords",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Lista separada por vírgula, ponto e vírgula ou quebra de linha."
          },
          {
            "name": "keyword",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Parâmetro repetível para múltiplas frases."
          },
          {
            "name": "match",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Define se qualquer termo basta ou se todos devem aparecer. Padrão: any."
          },
          {
            "name": "direction",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Filtra mensagens recebidas, enviadas ou ambas. Padrão: inbound."
          },
          {
            "name": "channel",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Filtra conversas por canal."
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Início do período em ISO 8601."
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Fim do período em ISO 8601."
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Quantidade de contatos retornados por página. Máximo: 100. Padrão: 50."
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Deslocamento da página atual. Use junto com limit para paginação."
          },
          {
            "name": "messages_limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Amostras de mensagens por contato. Máximo: 20. Padrão: 3."
          }
        ],
        "responses": {
          "200": {
            "description": "Contatos encontrados e dados de paginação."
          },
          "400": {
            "description": "Parâmetros inválidos."
          },
          "401": {
            "description": "API key ausente, inválida, revogada ou expirada."
          },
          "403": {
            "description": "Escopo ausente ou acesso negado à organização."
          },
          "500": {
            "description": "Erro interno."
          }
        }
      }
    }
  }
}