{
  "openapi": "3.1.0",
  "info": {
    "title": "CodeCrush — API pública para agentes",
    "version": "1.0.0",
    "description": "Contrato das operações anônimas de consulta e análise do CodeCrush. Não inclui contas, administração, pagamentos, webhooks, telemetria nem recursos protegidos por tokens opacos. Leia https://codecrush.com.br/ai-guide.md antes de usar.",
    "contact": {
      "name": "CodeCrush",
      "url": "https://codecrush.com.br/contato"
    },
    "license": {
      "name": "Termos de uso da API pública do CodeCrush",
      "url": "https://codecrush.com.br/ai-guide.md"
    }
  },
  "servers": [
    {
      "url": "https://codecrush.com.br",
      "description": "Produção"
    }
  ],
  "security": [],
  "tags": [
    {
      "name": "Dados",
      "description": "Consultas diretas e sem autenticação."
    },
    {
      "name": "Vagas",
      "description": "Vagas públicas de tecnologia no Brasil."
    },
    {
      "name": "SEO",
      "description": "Análise server-side de URLs HTTP(S) públicas."
    },
    {
      "name": "Ferramentas",
      "description": "Calculadoras, conversores, geradores e analisadores sem estado."
    }
  ],
  "paths": {
    "/api/cambio": {
      "get": {
        "tags": [
          "Dados"
        ],
        "operationId": "getUsdBrlRate",
        "summary": "Cotação comercial USD/BRL",
        "description": "Retorna a cotação de compra do dólar em reais. Em indisponibilidade da fonte, os três campos são null e o status continua 200.\n\nLimite: 30 requisições por minuto por IP.",
        "security": [],
        "x-rate-limit": "30 requisições por minuto por IP.",
        "responses": {
          "200": {
            "description": "Cotação atual ou campos nulos quando a fonte estiver indisponível.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExchangeRate"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        }
      }
    },
    "/api/meu-ip": {
      "get": {
        "tags": [
          "Dados"
        ],
        "operationId": "getCallerIp",
        "summary": "IP observado pelo CodeCrush",
        "description": "Ecoa o endereço IP visto pelo servidor e informa se ele pertence a uma faixa local/privada. A resposta nunca é armazenada.\n\nLimite: 30 requisições por minuto por IP.",
        "security": [],
        "x-rate-limit": "30 requisições por minuto por IP.",
        "responses": {
          "200": {
            "description": "Endereço observado pelo servidor.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CallerIp"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        }
      }
    },
    "/api/vagas": {
      "get": {
        "tags": [
          "Vagas"
        ],
        "operationId": "searchTechJobs",
        "summary": "Busca vagas de tecnologia no Brasil",
        "description": "Busca vagas públicas, com paginação e termo livre. Os resultados vêm da Adzuna e são normalizados pelo CodeCrush.\n\nLimite: 20 requisições por minuto e 300 por hora por IP.",
        "security": [],
        "x-rate-limit": "20 requisições por minuto e 300 por hora por IP.",
        "parameters": [
          {
            "name": "what",
            "in": "query",
            "description": "Termo de busca. Padrão: Frontend.",
            "schema": {
              "type": "string",
              "maxLength": 200,
              "default": "Frontend"
            }
          },
          {
            "name": "page",
            "in": "query",
            "description": "Página, começando em 1.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "results_per_page",
            "in": "query",
            "description": "Quantidade de resultados por página.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 11
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da busca.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSearch"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "502": {
            "description": "Falha na fonte de vagas.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSearch"
                }
              }
            }
          },
          "503": {
            "description": "Fonte de vagas não configurada.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSearch"
                }
              }
            }
          }
        }
      }
    },
    "/api/seo/fetch": {
      "post": {
        "tags": [
          "SEO"
        ],
        "operationId": "fetchPublicUrl",
        "summary": "Busca segura de uma URL pública",
        "description": "Busca uma URL HTTP(S) pública, seguindo até cinco redirecionamentos revalidados e limitando o corpo a 2 MB. Endereços locais, privados e metadados de nuvem são bloqueados.\n\nLimite: 10 requisições por minuto e 100 por hora por IP.",
        "security": [],
        "x-rate-limit": "10 requisições por minuto e 100 por hora por IP.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UrlInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resposta bruta limitada da URL pública.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeoFetch"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O alvo informado foi bloqueado pela política anti-SSRF.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "502": {
            "description": "A fonte externa não pôde ser consultada.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "504": {
            "description": "A fonte externa excedeu o tempo de resposta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/seo/meta": {
      "post": {
        "tags": [
          "SEO"
        ],
        "operationId": "analyzeMetaTags",
        "summary": "Analisa metadados SEO de uma URL pública",
        "description": "Extrai title, description, canonical, Open Graph, headings, links, imagens e problemas técnicos de uma página HTTP(S) pública.\n\nLimite: 10 requisições por minuto e 100 por hora por IP.",
        "security": [],
        "x-rate-limit": "10 requisições por minuto e 100 por hora por IP.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UrlInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Metadados e diagnóstico da página.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetaAnalysis"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O alvo informado foi bloqueado pela política anti-SSRF.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "502": {
            "description": "A fonte externa não pôde ser consultada.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "504": {
            "description": "A fonte externa excedeu o tempo de resposta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/seo/robots": {
      "post": {
        "tags": [
          "SEO"
        ],
        "operationId": "auditRobotsTxt",
        "summary": "Audita o robots.txt de um domínio",
        "description": "Lê, interpreta e diagnostica o robots.txt; opcionalmente testa uma URL contra user-agents informados pelo cliente.\n\nLimite: 10 requisições por minuto e 100 por hora por IP.",
        "security": [],
        "x-rate-limit": "10 requisições por minuto e 100 por hora por IP.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RobotsInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Conteúdo interpretado e diagnóstico do robots.txt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RobotsAudit"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O alvo informado foi bloqueado pela política anti-SSRF.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "502": {
            "description": "A fonte externa não pôde ser consultada.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "504": {
            "description": "A fonte externa excedeu o tempo de resposta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/seo/sitemap": {
      "post": {
        "tags": [
          "SEO"
        ],
        "operationId": "auditSitemap",
        "summary": "Valida um sitemap XML público",
        "description": "Valida formato, URLs, lastmod, limites e declaração no robots.txt. A resposta expõe no máximo 100 entradas de amostra.\n\nLimite: 10 requisições por minuto e 100 por hora por IP.",
        "security": [],
        "x-rate-limit": "10 requisições por minuto e 100 por hora por IP.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UrlInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Diagnóstico do sitemap, inclusive quando ele não existe.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SitemapAudit"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "O alvo informado foi bloqueado pela política anti-SSRF.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "502": {
            "description": "A fonte externa não pôde ser consultada.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "504": {
            "description": "A fonte externa excedeu o tempo de resposta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/contador-de-caracteres": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "countText",
        "summary": "Conta caracteres, palavras, frases e bytes",
        "description": "Conta caracteres, palavras, frases e bytes\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/contador-de-caracteres"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "texto": "Olá, mundo!"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/calculadora-de-porcentagem": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "calculatePercentage",
        "summary": "Resolve cálculos de porcentagem",
        "description": "Modos: percentualDe(percentual,total), qualPercentual(parte,total), variacao(de,para), aplicar(valor,percentual,aplicacao=aumento|desconto) e regraDeTres(a,b,c,tipo=direta|inversa).\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/calculadora-de-porcentagem"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "modo": "percentualDe",
                "percentual": 15,
                "total": 200
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/conversor-de-unidades": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "convertUnits",
        "summary": "Converte unidades de medida",
        "description": "Categorias: comprimento, massa, temperatura, area, volume, velocidade, tempo e dados. Informe valor, categoria, de e para usando os IDs do exemplo/resultado.\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/conversor-de-unidades"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "categoria": "comprimento",
                "valor": 1,
                "de": "km",
                "para": "m"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/calculadora-de-horas": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "calculateHours",
        "summary": "Soma durações e calcula horas extras",
        "description": "Informe duracoes como lista de textos (8:30, 8h30 ou 8,5). Opcionalmente envie horasExtras com salario, horasMes, qtd50 e qtd100.\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/calculadora-de-horas"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "duracoes": [
                  "8:30",
                  "7h45"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/calculadora-de-datas": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "calculateDates",
        "summary": "Calcula datas, idade, prazos e dias úteis",
        "description": "Ações: diferenca, somar-dias, somar-meses, dias-uteis, somar-dias-uteis, idade e feriados. Datas usam YYYY-MM-DD; feriados recebe ano.\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/calculadora-de-datas"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "acao": "diferenca",
                "inicio": "2026-01-01",
                "fim": "2026-09-08"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/calculadora-salario-liquido": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "calculateNetSalary",
        "summary": "Calcula salário líquido CLT 2026",
        "description": "Calcula salário líquido CLT 2026\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/calculadora-salario-liquido"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "salarioBruto": 7000,
                "dependentes": 0,
                "pensao": 0,
                "planoSaude": 0,
                "valeTransporte": false,
                "outrosDescontos": 0,
                "horasMes": 220
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/calculadora-ferias": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "calculateVacationPay",
        "summary": "Calcula férias CLT 2026",
        "description": "Calcula férias CLT 2026\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/calculadora-ferias"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "salarioBruto": 7000,
                "diasFerias": 30,
                "venderDez": false,
                "adiantar13": false,
                "dependentes": 0,
                "mediaAdicionais": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/calculadora-decimo-terceiro": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "calculateThirteenthSalary",
        "summary": "Calcula 13º salário 2026",
        "description": "Calcula 13º salário 2026\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/calculadora-decimo-terceiro"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "salarioBruto": 7000,
                "avos": 12,
                "dependentes": 0,
                "mediaAdicionais": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/calculadora-seguro-desemprego": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "calculateUnemploymentBenefit",
        "summary": "Calcula seguro-desemprego 2026",
        "description": "Calcula seguro-desemprego 2026\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/calculadora-seguro-desemprego"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "salarios": [
                  3000,
                  3100,
                  3200
                ],
                "solicitacao": "primeira",
                "mesesTrabalhados": 24
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/calculadora-rescisao": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "calculateTerminationPay",
        "summary": "Simula rescisão CLT 2026",
        "description": "Simula rescisão CLT 2026\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/calculadora-rescisao"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "salarioBruto": 7000,
                "dataAdmissao": "2023-01-10",
                "dataDesligamento": "2026-09-08",
                "tipo": "sem-justa-causa",
                "aviso": "indenizado",
                "feriasVencidasPeriodos": 0,
                "dependentes": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/gerador-de-cpf": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "generateOrValidateCpf",
        "summary": "Gera ou valida CPF para testes",
        "description": "Use acao=gerar com quantidade (até 1000) e formatado, ou acao=validar com documento.\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/gerador-de-cpf"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "acao": "gerar",
                "quantidade": 3,
                "formatado": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/gerador-de-cnpj": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "generateOrValidateCnpj",
        "summary": "Gera ou valida CNPJ para testes",
        "description": "Use acao=gerar com quantidade (até 1000) e formatado, ou acao=validar com documento.\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/gerador-de-cnpj"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "acao": "gerar",
                "quantidade": 3,
                "formatado": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/gerador-cpf-cnpj": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "generateTestDocuments",
        "summary": "Gera massa de CPF e CNPJ",
        "description": "Use acao=gerar para uma lista alternada de CPF/CNPJ (até 1000), ou acao=validar com documento para detectar e validar o tipo.\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/gerador-cpf-cnpj"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "acao": "gerar",
                "quantidade": 10,
                "formatado": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/gerador-de-senhas": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "generatePasswords",
        "summary": "Gera senhas ou frases-senha criptográficas",
        "description": "modo=senha aceita tamanho, quantidade, maiusculas, minusculas, numeros, simbolos e excluirAmbiguos. modo=frase aceita palavras, separador, capitalizar e incluirNumero.\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/gerador-de-senhas"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "modo": "senha",
                "tamanho": 20,
                "quantidade": 3,
                "maiusculas": true,
                "minusculas": true,
                "numeros": true,
                "simbolos": true,
                "excluirAmbiguos": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/sorteador-de-nomes": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "drawItems",
        "summary": "Faz sorteios reproduzíveis por semente",
        "description": "Modos: itens (itens ou lista), numeros (min/max) e grupos. quantidade controla itens/números ou número de grupos; semente torna o resultado reproduzível.\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/sorteador-de-nomes"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "modo": "itens",
                "itens": [
                  "Ana",
                  "Bia",
                  "Caio"
                ],
                "quantidade": 1,
                "semente": "DEMO-2026"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/gerador-link-whatsapp": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "createWhatsAppLink",
        "summary": "Gera link wa.me com mensagem",
        "description": "Gera link wa.me com mensagem\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/gerador-link-whatsapp"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "codigoPais": "55",
                "telefone": "11999999999",
                "mensagem": "Olá!"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/decodificador-jwt": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "decodeJwt",
        "summary": "Decodifica header e payload de JWT",
        "description": "Decodifica header e payload de JWT\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/decodificador-jwt"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "token": "eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJzdWIiOiIxMjMifQ."
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/formatador-json": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "transformJson",
        "summary": "Valida, formata, repara e converte JSON/YAML/CSV",
        "description": "Ações: formatar, minificar, validar, reparar, json-para-yaml, json-para-csv e yaml-para-json. indentacao pode ser 2, 4 ou tab.\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/formatador-json"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "acao": "formatar",
                "texto": "{\"nome\":\"Ana\"}",
                "indentacao": "2"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/analisador-de-curriculo": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "analyzeResume",
        "summary": "Compara currículo com uma vaga",
        "description": "Compara currículo com uma vaga\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/analisador-de-curriculo"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "vaga": "Buscamos pessoa com React e TypeScript.",
                "curriculo": "Desenvolvedora com React e TypeScript."
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/assinatura-de-email": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "generateEmailSignature",
        "summary": "Gera assinatura de e-mail em HTML",
        "description": "Gera assinatura de e-mail em HTML\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/assinatura-de-email"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "nome": "Ana Silva",
                "cargo": "Desenvolvedora",
                "empresa": "Acme",
                "email": "ana@example.com"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/calculadora-das-mei": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "calculateMeiDas",
        "summary": "Calcula o DAS mensal do MEI 2026",
        "description": "Calcula o DAS mensal do MEI 2026\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/calculadora-das-mei"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "atividade": "servicos",
                "caminhoneiro": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/limite-mei": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "calculateMeiLimit",
        "summary": "Calcula uso e projeção do limite MEI",
        "description": "Calcula uso e projeção do limite MEI\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/limite-mei"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "faturamento": 45000,
                "mesAtual": 8,
                "abriuEsteAno": false,
                "caminhoneiro": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/salarios-tech": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "queryTechSalaries",
        "summary": "Consulta faixas salariais de tecnologia",
        "description": "Filtra o dataset público por trecho de cargo e/ou senioridade (junior, pleno, senior, especialista ou geral). Campos vazios retornam todo o catálogo.\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/salarios-tech"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "cargo": "software",
                "senioridade": "senior"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/qual-ia-usar": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "recommendAiModel",
        "summary": "Consulta recomendações e catálogo de IAs",
        "description": "Informe tarefa (programar, escrever, estudar, resumir, planilhas, imagens, video ou automatizar). Sem tarefa, retorna o catálogo completo.\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/qual-ia-usar"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "tarefa": "programar"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/ferramentas/contador-de-tokens": {
      "post": {
        "tags": [
          "Ferramentas"
        ],
        "operationId": "estimateAiTokensAndCost",
        "summary": "Estima tokens e custo de modelos de IA",
        "description": "Estima tokens e custo de modelos de IA\n\nLimite: 60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "security": [],
        "x-rate-limit": "60 requisições por minuto e 500 por hora por IP (compartilhadas entre ferramentas).",
        "externalDocs": {
          "description": "Interface web e documentação editorial da ferramenta.",
          "url": "https://codecrush.com.br/ferramentas/contador-de-tokens"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ToolInput"
              },
              "example": {
                "texto": "Explique este código.",
                "requisicoesMes": 1000,
                "incluirTaxas": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ToolResult"
                }
              }
            }
          },
          "400": {
            "description": "Entrada inválida.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Limite de uso excedido. Respeite o cabeçalho Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Segundos mínimos antes de tentar novamente.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "500": {
            "description": "Falha inesperada ao executar a ferramenta.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "string"
          },
          "code": {
            "type": "string"
          }
        },
        "additionalProperties": true
      },
      "ToolInput": {
        "type": "object",
        "description": "Entrada específica da ferramenta. Consulte o exemplo da operação; propriedades desconhecidas são ignoradas.",
        "additionalProperties": true
      },
      "ToolResult": {
        "type": "object",
        "required": [
          "tool",
          "result"
        ],
        "properties": {
          "tool": {
            "type": "string",
            "description": "Slug canônico da ferramenta."
          },
          "result": {
            "description": "Resultado específico da ferramenta."
          }
        },
        "additionalProperties": false
      },
      "UrlInput": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "maxLength": 2048,
            "description": "URL http:// ou https:// publicamente acessível."
          }
        },
        "additionalProperties": false
      },
      "ExchangeRate": {
        "type": "object",
        "required": [
          "cotacao",
          "fonte",
          "atualizadoEm"
        ],
        "properties": {
          "cotacao": {
            "type": [
              "number",
              "null"
            ],
            "description": "Quantidade de BRL por USD."
          },
          "fonte": {
            "type": [
              "string",
              "null"
            ],
            "examples": [
              "AwesomeAPI"
            ]
          },
          "atualizadoEm": {
            "type": [
              "string",
              "null"
            ],
            "description": "Data/hora informada pela fonte."
          }
        },
        "additionalProperties": false
      },
      "CallerIp": {
        "type": "object",
        "required": [
          "ip",
          "local"
        ],
        "properties": {
          "ip": {
            "type": "string"
          },
          "local": {
            "type": "boolean",
            "description": "true para loopback, rede privada, link-local ou ULA."
          }
        },
        "additionalProperties": false
      },
      "Job": {
        "type": "object",
        "required": [
          "id",
          "slug",
          "title",
          "description",
          "location",
          "url_redirect",
          "data_created",
          "company",
          "contract_time",
          "category",
          "salary_min",
          "salary_max"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "location": {
            "type": "string"
          },
          "url_redirect": {
            "type": "string",
            "format": "uri"
          },
          "data_created": {
            "type": "string"
          },
          "company": {
            "type": "string"
          },
          "contract_time": {
            "type": [
              "string",
              "null"
            ]
          },
          "category": {
            "type": [
              "string",
              "null"
            ]
          },
          "salary_min": {
            "type": [
              "number",
              "null"
            ]
          },
          "salary_max": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "additionalProperties": false
      },
      "JobSearch": {
        "type": "object",
        "required": [
          "data",
          "quant"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Job"
            }
          },
          "quant": {
            "type": "integer",
            "minimum": 0
          }
        },
        "additionalProperties": false
      },
      "SeoFetch": {
        "type": "object",
        "required": [
          "finalUrl",
          "statusCode",
          "contentType",
          "xRobotsTag",
          "linkHeader",
          "body",
          "responseTimeMs",
          "redirectChain",
          "truncated",
          "etag",
          "lastModified"
        ],
        "properties": {
          "finalUrl": {
            "type": "string",
            "format": "uri"
          },
          "statusCode": {
            "type": "integer"
          },
          "contentType": {
            "type": [
              "string",
              "null"
            ]
          },
          "xRobotsTag": {
            "type": [
              "string",
              "null"
            ]
          },
          "linkHeader": {
            "type": [
              "string",
              "null"
            ]
          },
          "body": {
            "type": "string",
            "description": "Corpo limitado a 2 MB."
          },
          "responseTimeMs": {
            "type": "integer",
            "minimum": 0
          },
          "redirectChain": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uri"
            }
          },
          "truncated": {
            "type": "boolean"
          },
          "etag": {
            "type": [
              "string",
              "null"
            ]
          },
          "lastModified": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "additionalProperties": false
      },
      "Finding": {
        "type": "object",
        "required": [
          "severity",
          "title",
          "detail"
        ],
        "properties": {
          "severity": {
            "type": "string",
            "enum": [
              "critical",
              "warning",
              "info"
            ]
          },
          "title": {
            "type": "string"
          },
          "detail": {
            "type": "string"
          },
          "line": {
            "type": "integer",
            "minimum": 1
          },
          "samples": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": true
      },
      "MetaAnalysis": {
        "type": "object",
        "required": [
          "analysis",
          "issues",
          "isIndexable",
          "isHtml",
          "statusCode",
          "contentType",
          "responseTimeMs",
          "redirectChain",
          "truncated"
        ],
        "properties": {
          "analysis": {
            "type": "object",
            "additionalProperties": true
          },
          "issues": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Finding"
            }
          },
          "isIndexable": {
            "type": "boolean"
          },
          "isHtml": {
            "type": "boolean"
          },
          "statusCode": {
            "type": "integer"
          },
          "contentType": {
            "type": [
              "string",
              "null"
            ]
          },
          "responseTimeMs": {
            "type": "integer",
            "minimum": 0
          },
          "redirectChain": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uri"
            }
          },
          "truncated": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "RobotsInput": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "maxLength": 2048,
            "description": "URL http:// ou https:// publicamente acessível."
          },
          "testUrl": {
            "type": "string",
            "format": "uri",
            "description": "URL da mesma origem a testar."
          },
          "userAgents": {
            "type": "array",
            "maxItems": 40,
            "items": {
              "type": "string",
              "maxLength": 80
            }
          }
        },
        "additionalProperties": false
      },
      "RobotsAudit": {
        "type": "object",
        "required": [
          "robotsUrl",
          "found",
          "content",
          "groups",
          "sitemaps",
          "findings",
          "access",
          "testedUrl",
          "origin",
          "statusCode",
          "truncated"
        ],
        "properties": {
          "robotsUrl": {
            "type": "string",
            "format": "uri"
          },
          "found": {
            "type": "boolean"
          },
          "content": {
            "type": "string"
          },
          "groups": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "sitemaps": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "findings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Finding"
            }
          },
          "access": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "testedUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "origin": {
            "type": "string",
            "format": "uri"
          },
          "statusCode": {
            "type": "integer"
          },
          "truncated": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "SitemapAudit": {
        "type": "object",
        "required": [
          "sitemapUrl",
          "statusCode",
          "found",
          "kind",
          "entries",
          "nestedSitemaps",
          "totalUrls",
          "bytes",
          "declaredInRobots",
          "findings"
        ],
        "properties": {
          "sitemapUrl": {
            "type": "string",
            "format": "uri"
          },
          "statusCode": {
            "type": "integer"
          },
          "found": {
            "type": "boolean"
          },
          "kind": {
            "type": "string",
            "enum": [
              "urlset",
              "sitemapindex",
              "unknown"
            ]
          },
          "entries": {
            "type": "array",
            "maxItems": 100,
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "entriesTruncated": {
            "type": "boolean"
          },
          "nestedSitemaps": {
            "type": "array",
            "maxItems": 100,
            "items": {
              "type": "string"
            }
          },
          "totalUrls": {
            "type": "integer",
            "minimum": 0
          },
          "bytes": {
            "type": "integer",
            "minimum": 0
          },
          "declaredInRobots": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "findings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Finding"
            }
          },
          "truncated": {
            "type": "boolean"
          }
        },
        "additionalProperties": true
      }
    }
  }
}
