{"openapi":"3.1.0","info":{"title":"QR Studio API","version":"1.0.0","summary":"QR Codes estilizados, com logo e contraste conferido, por URL ou JSON.","description":"Gera o mesmo QR Code que a tela do QR Studio, com as mesmas opções (esquema único). Imagem em SVG (vetor) ou PNG. Sem chave: 60 pesos por minuto e 1200 por hora por IP, imagem de até 1024 px. Com chave (cabeçalho X-API-Key ou Authorization: Bearer): a cota da sua chave e até 2048 px. Para contato (vCard) e senha de Wi-Fi use o POST: dado pessoal na URL vai parar em logs de servidores e proxies. O conteúdo do QR nunca é guardado em banco nem em disco; só um contador anônimo por tipo (texto, contato, Wi-Fi) é somado.","license":{"name":"ISC","identifier":"ISC"}},"servers":[{"url":"https://rodrigoborges.dev"}],"security":[{},{"ApiKeyAuth":[]},{"BearerAuth":[]}],"paths":{"/qr":{"get":{"operationId":"qrGet","summary":"QR Code por URL","description":"Opções na query. O padrão é type=text com o conteúdo em data (até 1500 caracteres). Sem logo (use o POST).","parameters":[{"name":"type","in":"query","required":false,"description":"O que vai dentro do QR: texto ou link, cartão de contato (vCard 3.0) ou rede Wi-Fi.","schema":{"description":"O que vai dentro do QR: texto ou link, cartão de contato (vCard 3.0) ou rede Wi-Fi.","type":"string","enum":["text","vcard","wifi"],"default":"text"},"x-grupo":"Conteúdo"},{"name":"data","in":"query","required":false,"description":"O texto ou o link (obrigatório com type=text). Até 1500 caracteres pela URL e 4000 no corpo do POST; o limite real é a capacidade do QR.","schema":{"description":"O texto ou o link (obrigatório com type=text). Até 1500 caracteres pela URL e 4000 no corpo do POST; o limite real é a capacidade do QR.","type":"string","maxLength":4000},"x-grupo":"Conteúdo"},{"name":"vcard.firstName","in":"query","required":false,"description":"Nome do contato.","schema":{"description":"Nome do contato.","type":"string","maxLength":60},"x-grupo":"Conteúdo"},{"name":"vcard.lastName","in":"query","required":false,"description":"Sobrenome.","schema":{"description":"Sobrenome.","type":"string","maxLength":60},"x-grupo":"Conteúdo"},{"name":"vcard.org","in":"query","required":false,"description":"Empresa ou organização.","schema":{"description":"Empresa ou organização.","type":"string","maxLength":80},"x-grupo":"Conteúdo"},{"name":"vcard.title","in":"query","required":false,"description":"Cargo.","schema":{"description":"Cargo.","type":"string","maxLength":80},"x-grupo":"Conteúdo"},{"name":"vcard.phoneMobile","in":"query","required":false,"description":"Celular (só dígitos, +, parênteses, hífen e espaço).","schema":{"description":"Celular (só dígitos, +, parênteses, hífen e espaço).","type":"string","maxLength":30},"x-grupo":"Conteúdo"},{"name":"vcard.phoneWork","in":"query","required":false,"description":"Telefone do trabalho.","schema":{"description":"Telefone do trabalho.","type":"string","maxLength":30},"x-grupo":"Conteúdo"},{"name":"vcard.email","in":"query","required":false,"description":"E-mail (a API recusa um e-mail incompleto).","schema":{"description":"E-mail (a API recusa um e-mail incompleto).","type":"string","maxLength":100},"x-grupo":"Conteúdo"},{"name":"vcard.url","in":"query","required":false,"description":"Site (sem protocolo, a API acrescenta https://).","schema":{"description":"Site (sem protocolo, a API acrescenta https://).","type":"string","maxLength":150},"x-grupo":"Conteúdo"},{"name":"vcard.street","in":"query","required":false,"description":"Rua e número.","schema":{"description":"Rua e número.","type":"string","maxLength":100},"x-grupo":"Conteúdo"},{"name":"vcard.city","in":"query","required":false,"description":"Cidade.","schema":{"description":"Cidade.","type":"string","maxLength":60},"x-grupo":"Conteúdo"},{"name":"vcard.region","in":"query","required":false,"description":"Estado.","schema":{"description":"Estado.","type":"string","maxLength":40},"x-grupo":"Conteúdo"},{"name":"vcard.zip","in":"query","required":false,"description":"CEP.","schema":{"description":"CEP.","type":"string","maxLength":20},"x-grupo":"Conteúdo"},{"name":"vcard.country","in":"query","required":false,"description":"País.","schema":{"description":"País.","type":"string","maxLength":60},"x-grupo":"Conteúdo"},{"name":"vcard.note","in":"query","required":false,"description":"Observação (aceita quebras de linha).","schema":{"description":"Observação (aceita quebras de linha).","type":"string","maxLength":300},"x-grupo":"Conteúdo"},{"name":"wifi.ssid","in":"query","required":false,"description":"Nome da rede Wi-Fi (obrigatório com type=wifi).","schema":{"description":"Nome da rede Wi-Fi (obrigatório com type=wifi).","type":"string","maxLength":32},"x-grupo":"Conteúdo"},{"name":"wifi.security","in":"query","required":false,"description":"Tipo de segurança da rede.","schema":{"description":"Tipo de segurança da rede.","type":"string","enum":["WPA","WEP","nopass"],"default":"WPA"},"x-grupo":"Conteúdo"},{"name":"wifi.password","in":"query","required":false,"description":"Senha da rede (8 a 63 caracteres em WPA). Prefira o POST: senha na URL vai parar em logs.","schema":{"description":"Senha da rede (8 a 63 caracteres em WPA). Prefira o POST: senha na URL vai parar em logs.","type":"string","maxLength":63},"x-grupo":"Conteúdo"},{"name":"wifi.hidden","in":"query","required":false,"description":"A rede não divulga o nome.","schema":{"description":"A rede não divulga o nome.","type":"boolean","default":false},"x-grupo":"Conteúdo"},{"name":"shape","in":"query","required":false,"description":"Desenho de cada módulo (quadradinho) do código.","schema":{"description":"Desenho de cada módulo (quadradinho) do código.","type":"string","enum":["square","rounded","liquid","dots","diamond"],"default":"square"},"x-grupo":"Forma dos módulos"},{"name":"scale","in":"query","required":false,"description":"Tamanho do módulo em porcentagem da célula. Vale para rounded, dots e diamond.","schema":{"description":"Tamanho do módulo em porcentagem da célula. Vale para rounded, dots e diamond.","type":"integer","minimum":50,"maximum":100,"default":90},"x-grupo":"Forma dos módulos"},{"name":"eyeOuter","in":"query","required":false,"description":"Formato do anel dos três quadrados dos cantos.","schema":{"description":"Formato do anel dos três quadrados dos cantos.","type":"string","enum":["square","rounded","circle"],"default":"square"},"x-grupo":"Olhos"},{"name":"eyeInner","in":"query","required":false,"description":"Formato do miolo dos olhos.","schema":{"description":"Formato do miolo dos olhos.","type":"string","enum":["square","rounded","circle","diamond"],"default":"square"},"x-grupo":"Olhos"},{"name":"eyeColor","in":"query","required":false,"description":"Cor do anel dos olhos (hexadecimal) ou auto, a mesma dos módulos.","schema":{"description":"Cor do anel dos olhos (hexadecimal) ou auto, a mesma dos módulos.","type":"string","pattern":"^(auto|#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$","default":"auto","examples":["auto","6366f1"]},"x-grupo":"Olhos"},{"name":"eyeInnerColor","in":"query","required":false,"description":"Cor do miolo dos olhos (hexadecimal) ou auto (a do anel, ou a dos módulos).","schema":{"description":"Cor do miolo dos olhos (hexadecimal) ou auto (a do anel, ou a dos módulos).","type":"string","pattern":"^(auto|#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$","default":"auto","examples":["auto","6366f1"]},"x-grupo":"Olhos"},{"name":"fill","in":"query","required":false,"description":"Cor única, degradê linear ou radial entre color e color2.","schema":{"description":"Cor única, degradê linear ou radial entre color e color2.","type":"string","enum":["solid","linear","radial"],"default":"solid"},"x-grupo":"Cores"},{"name":"color","in":"query","required":false,"description":"Cor dos módulos (hexadecimal de 3 ou 6 dígitos, com ou sem #; na URL escreva %23 ou omita o #).","schema":{"description":"Cor dos módulos (hexadecimal de 3 ou 6 dígitos, com ou sem #; na URL escreva %23 ou omita o #).","type":"string","pattern":"^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","default":"111827","examples":["6366f1"]},"x-grupo":"Cores"},{"name":"color2","in":"query","required":false,"description":"Segunda cor do degradê (fill=linear ou radial).","schema":{"description":"Segunda cor do degradê (fill=linear ou radial).","type":"string","pattern":"^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","default":"6366f1","examples":["6366f1"]},"x-grupo":"Cores"},{"name":"bg","in":"query","required":false,"description":"Cor do fundo (hexadecimal) ou transparent.","schema":{"description":"Cor do fundo (hexadecimal) ou transparent.","type":"string","pattern":"^(transparent|#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$","default":"ffffff","examples":["transparent","6366f1"]},"x-grupo":"Cores"},{"name":"angle","in":"query","required":false,"description":"Ângulo do degradê linear em graus (0 = da esquerda para a direita, 90 = de cima para baixo).","schema":{"description":"Ângulo do degradê linear em graus (0 = da esquerda para a direita, 90 = de cima para baixo).","type":"integer","minimum":0,"maximum":360,"default":45},"x-grupo":"Cores"},{"name":"margin","in":"query","required":false,"description":"Margem vazia em volta, em módulos. Menos de 4 pode atrapalhar alguns leitores.","schema":{"description":"Margem vazia em volta, em módulos. Menos de 4 pode atrapalhar alguns leitores.","type":"integer","minimum":0,"maximum":10,"default":4},"x-grupo":"Margem e correção de erros"},{"name":"ecc","in":"query","required":false,"description":"Nível de correção de erros. Com logo, a correção sobe para H sozinha (o cabeçalho X-QR-Ecc informa).","schema":{"description":"Nível de correção de erros. Com logo, a correção sobe para H sozinha (o cabeçalho X-QR-Ecc informa).","type":"string","enum":["L","M","Q","H"],"default":"M"},"x-grupo":"Margem e correção de erros"},{"name":"logoShape","in":"query","required":false,"description":"Formato do logo e da placa atrás dele.","schema":{"description":"Formato do logo e da placa atrás dele.","type":"string","enum":["circle","rounded","square"],"default":"rounded"},"x-grupo":"Logo"},{"name":"logoSize","in":"query","required":false,"description":"Lado do logo em porcentagem do lado do QR. A resposta traz X-QR-Logo-Safe com o maior tamanho garantido.","schema":{"description":"Lado do logo em porcentagem do lado do QR. A resposta traz X-QR-Logo-Safe com o maior tamanho garantido.","type":"integer","minimum":8,"maximum":50,"default":20},"x-grupo":"Logo"},{"name":"logoPadding","in":"query","required":false,"description":"Folga entre o logo e os módulos, em módulos.","schema":{"description":"Folga entre o logo e os módulos, em módulos.","type":"number","minimum":0,"maximum":3,"multipleOf":0.5,"default":1},"x-grupo":"Logo"},{"name":"logoPlate","in":"query","required":false,"description":"Pinta uma placa com a cor do fundo atrás do logo.","schema":{"description":"Pinta uma placa com a cor do fundo atrás do logo.","type":"boolean","default":true},"x-grupo":"Logo"},{"name":"size","in":"query","required":false,"description":"Lado aproximado da imagem em pixels (o PNG usa um número inteiro de pixels por módulo, então o tamanho real fica perto deste). Até 1024 sem chave e 2048 com chave.","schema":{"description":"Lado aproximado da imagem em pixels (o PNG usa um número inteiro de pixels por módulo, então o tamanho real fica perto deste). Até 1024 sem chave e 2048 com chave.","type":"integer","minimum":64,"maximum":2048,"default":1024},"x-grupo":"Saída"},{"name":"format","in":"query","required":false,"description":"svg (vetor) ou png.","schema":{"description":"svg (vetor) ou png.","type":"string","enum":["svg","png"],"default":"svg"},"x-grupo":"Saída"}],"responses":{"200":{"description":"A imagem do QR Code.","headers":{"RateLimit-Limit":{"description":"Cota da janela mais apertada (por minuto ou por hora).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"O que ainda resta nessa janela, em pesos (SVG 1, PNG 6, logo +2, tamanho acima de 1024 px +3, conteúdo acima de 400 caracteres +1 e acima de 1200 +3).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Segundos até a janela renovar.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"As duas janelas, por exemplo `60;w=60, 1200;w=3600`.","schema":{"type":"string"}},"X-QR-Version":{"description":"Versão do QR (1 a 40).","schema":{"type":"integer"}},"X-QR-Modules":{"description":"Módulos por lado.","schema":{"type":"integer"}},"X-QR-Ecc":{"description":"Correção de erros usada (sobe para H com logo).","schema":{"type":"string"}},"X-QR-Logo-Safe":{"description":"Com logo: o maior tamanho do logo (porcentagem do lado) que ainda é garantido para este QR.","schema":{"type":"integer"}},"ETag":{"description":"Só no GET: o mesmo pedido gera sempre o mesmo ETag.","schema":{"type":"string"}}},"content":{"image/svg+xml":{"schema":{"type":"string"}},"image/png":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Opção inválida, desconhecida ou conteúdo ausente (`code`: `invalid_param`; a lista `errors` diz qual opção e por quê).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Chave de API inválida (`code`: `bad_key`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Conteúdo grande demais, ou que não cabe em um QR Code neste nível de correção (`code`: `too_large`, com o `limit` em bytes).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Logo que não é um PNG aceito (`code`: `unsupported_logo`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de pedidos (ou de tentativas de chave) atingido (`code`: `rate_limited`). Veja `Retry-After`.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Segundos até tentar de novo."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Muitos PNG sendo gerados agora (`code`: `busy`). Tente de novo depois de `Retry-After`.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Segundos até tentar de novo."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"qrPost","summary":"QR Code por JSON (dado longo, sensível ou com logo)","description":"Corpo JSON de até 256 KB. Aceita logo PNG (até 150 KB, 1024 px). Nunca é guardado em cache.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"type":{"description":"O que vai dentro do QR: texto ou link, cartão de contato (vCard 3.0) ou rede Wi-Fi.","type":"string","enum":["text","vcard","wifi"],"default":"text"},"data":{"description":"O texto ou o link (obrigatório com type=text). Até 1500 caracteres pela URL e 4000 no corpo do POST; o limite real é a capacidade do QR.","type":"string","maxLength":4000},"shape":{"description":"Desenho de cada módulo (quadradinho) do código.","type":"string","enum":["square","rounded","liquid","dots","diamond"],"default":"square"},"scale":{"description":"Tamanho do módulo em porcentagem da célula. Vale para rounded, dots e diamond.","type":"integer","minimum":50,"maximum":100,"default":90},"eyeOuter":{"description":"Formato do anel dos três quadrados dos cantos.","type":"string","enum":["square","rounded","circle"],"default":"square"},"eyeInner":{"description":"Formato do miolo dos olhos.","type":"string","enum":["square","rounded","circle","diamond"],"default":"square"},"eyeColor":{"description":"Cor do anel dos olhos (hexadecimal) ou auto, a mesma dos módulos.","type":"string","pattern":"^(auto|#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$","default":"auto","examples":["auto","6366f1"]},"eyeInnerColor":{"description":"Cor do miolo dos olhos (hexadecimal) ou auto (a do anel, ou a dos módulos).","type":"string","pattern":"^(auto|#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$","default":"auto","examples":["auto","6366f1"]},"fill":{"description":"Cor única, degradê linear ou radial entre color e color2.","type":"string","enum":["solid","linear","radial"],"default":"solid"},"color":{"description":"Cor dos módulos (hexadecimal de 3 ou 6 dígitos, com ou sem #; na URL escreva %23 ou omita o #).","type":"string","pattern":"^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","default":"111827","examples":["6366f1"]},"color2":{"description":"Segunda cor do degradê (fill=linear ou radial).","type":"string","pattern":"^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","default":"6366f1","examples":["6366f1"]},"bg":{"description":"Cor do fundo (hexadecimal) ou transparent.","type":"string","pattern":"^(transparent|#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$","default":"ffffff","examples":["transparent","6366f1"]},"angle":{"description":"Ângulo do degradê linear em graus (0 = da esquerda para a direita, 90 = de cima para baixo).","type":"integer","minimum":0,"maximum":360,"default":45},"margin":{"description":"Margem vazia em volta, em módulos. Menos de 4 pode atrapalhar alguns leitores.","type":"integer","minimum":0,"maximum":10,"default":4},"ecc":{"description":"Nível de correção de erros. Com logo, a correção sobe para H sozinha (o cabeçalho X-QR-Ecc informa).","type":"string","enum":["L","M","Q","H"],"default":"M"},"logo":{"description":"Logo PNG no centro, como data URI (data:image/png;base64,...), só pelo POST: até 150 KB e 1024 px de lado. Nada de logo por endereço (URL).","type":"string","pattern":"^data:image/png;base64,[A-Za-z0-9+/]+={0,2}$","maxLength":200040},"logoShape":{"description":"Formato do logo e da placa atrás dele.","type":"string","enum":["circle","rounded","square"],"default":"rounded"},"logoSize":{"description":"Lado do logo em porcentagem do lado do QR. A resposta traz X-QR-Logo-Safe com o maior tamanho garantido.","type":"integer","minimum":8,"maximum":50,"default":20},"logoPadding":{"description":"Folga entre o logo e os módulos, em módulos.","type":"number","minimum":0,"maximum":3,"multipleOf":0.5,"default":1},"logoPlate":{"description":"Pinta uma placa com a cor do fundo atrás do logo.","type":"boolean","default":true},"size":{"description":"Lado aproximado da imagem em pixels (o PNG usa um número inteiro de pixels por módulo, então o tamanho real fica perto deste). Até 1024 sem chave e 2048 com chave.","type":"integer","minimum":64,"maximum":2048,"default":1024},"format":{"description":"svg (vetor) ou png.","type":"string","enum":["svg","png"],"default":"svg"},"vcard":{"type":"object","description":"Campos de contato (vCard), sem o prefixo \"vcard.\". Só com type=vcard.","additionalProperties":false,"properties":{"firstName":{"description":"Nome do contato.","type":"string","maxLength":60},"lastName":{"description":"Sobrenome.","type":"string","maxLength":60},"org":{"description":"Empresa ou organização.","type":"string","maxLength":80},"title":{"description":"Cargo.","type":"string","maxLength":80},"phoneMobile":{"description":"Celular (só dígitos, +, parênteses, hífen e espaço).","type":"string","maxLength":30},"phoneWork":{"description":"Telefone do trabalho.","type":"string","maxLength":30},"email":{"description":"E-mail (a API recusa um e-mail incompleto).","type":"string","maxLength":100},"url":{"description":"Site (sem protocolo, a API acrescenta https://).","type":"string","maxLength":150},"street":{"description":"Rua e número.","type":"string","maxLength":100},"city":{"description":"Cidade.","type":"string","maxLength":60},"region":{"description":"Estado.","type":"string","maxLength":40},"zip":{"description":"CEP.","type":"string","maxLength":20},"country":{"description":"País.","type":"string","maxLength":60},"note":{"description":"Observação (aceita quebras de linha).","type":"string","maxLength":300}}},"wifi":{"type":"object","description":"Campos de rede Wi-Fi, sem o prefixo \"wifi.\". Só com type=wifi.","additionalProperties":false,"properties":{"ssid":{"description":"Nome da rede Wi-Fi (obrigatório com type=wifi).","type":"string","maxLength":32},"security":{"description":"Tipo de segurança da rede.","type":"string","enum":["WPA","WEP","nopass"],"default":"WPA"},"password":{"description":"Senha da rede (8 a 63 caracteres em WPA). Prefira o POST: senha na URL vai parar em logs.","type":"string","maxLength":63},"hidden":{"description":"A rede não divulga o nome.","type":"boolean","default":false}}},"style":{"type":"object","description":"Estilo (forma, cores, olhos, margem, correção), no lugar das opções soltas.","additionalProperties":false,"properties":{"shape":{"description":"Desenho de cada módulo (quadradinho) do código.","type":"string","enum":["square","rounded","liquid","dots","diamond"],"default":"square"},"scale":{"description":"Tamanho do módulo em porcentagem da célula. Vale para rounded, dots e diamond.","type":"integer","minimum":50,"maximum":100,"default":90},"eyeOuter":{"description":"Formato do anel dos três quadrados dos cantos.","type":"string","enum":["square","rounded","circle"],"default":"square"},"eyeInner":{"description":"Formato do miolo dos olhos.","type":"string","enum":["square","rounded","circle","diamond"],"default":"square"},"eyeColor":{"description":"Cor do anel dos olhos (hexadecimal) ou auto, a mesma dos módulos.","type":"string","pattern":"^(auto|#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$","default":"auto","examples":["auto","6366f1"]},"eyeInnerColor":{"description":"Cor do miolo dos olhos (hexadecimal) ou auto (a do anel, ou a dos módulos).","type":"string","pattern":"^(auto|#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$","default":"auto","examples":["auto","6366f1"]},"fill":{"description":"Cor única, degradê linear ou radial entre color e color2.","type":"string","enum":["solid","linear","radial"],"default":"solid"},"color":{"description":"Cor dos módulos (hexadecimal de 3 ou 6 dígitos, com ou sem #; na URL escreva %23 ou omita o #).","type":"string","pattern":"^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","default":"111827","examples":["6366f1"]},"color2":{"description":"Segunda cor do degradê (fill=linear ou radial).","type":"string","pattern":"^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","default":"6366f1","examples":["6366f1"]},"angle":{"description":"Ângulo do degradê linear em graus (0 = da esquerda para a direita, 90 = de cima para baixo).","type":"integer","minimum":0,"maximum":360,"default":45},"bg":{"description":"Cor do fundo (hexadecimal) ou transparent.","type":"string","pattern":"^(transparent|#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$","default":"ffffff","examples":["transparent","6366f1"]},"margin":{"description":"Margem vazia em volta, em módulos. Menos de 4 pode atrapalhar alguns leitores.","type":"integer","minimum":0,"maximum":10,"default":4},"ecc":{"description":"Nível de correção de erros. Com logo, a correção sobe para H sozinha (o cabeçalho X-QR-Ecc informa).","type":"string","enum":["L","M","Q","H"],"default":"M"}}}},"description":"As opções soltas aceitam também os mesmos nomes achatados da URL (por exemplo \"vcard.firstName\" e \"shape\"); informar a mesma opção duas vezes é erro."}}}},"responses":{"200":{"description":"A imagem do QR Code.","headers":{"RateLimit-Limit":{"description":"Cota da janela mais apertada (por minuto ou por hora).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"O que ainda resta nessa janela, em pesos (SVG 1, PNG 6, logo +2, tamanho acima de 1024 px +3, conteúdo acima de 400 caracteres +1 e acima de 1200 +3).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Segundos até a janela renovar.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"As duas janelas, por exemplo `60;w=60, 1200;w=3600`.","schema":{"type":"string"}},"X-QR-Version":{"description":"Versão do QR (1 a 40).","schema":{"type":"integer"}},"X-QR-Modules":{"description":"Módulos por lado.","schema":{"type":"integer"}},"X-QR-Ecc":{"description":"Correção de erros usada (sobe para H com logo).","schema":{"type":"string"}},"X-QR-Logo-Safe":{"description":"Com logo: o maior tamanho do logo (porcentagem do lado) que ainda é garantido para este QR.","schema":{"type":"integer"}},"ETag":{"description":"Só no GET: o mesmo pedido gera sempre o mesmo ETag.","schema":{"type":"string"}}},"content":{"image/svg+xml":{"schema":{"type":"string"}},"image/png":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Opção inválida, desconhecida ou conteúdo ausente (`code`: `invalid_param`; a lista `errors` diz qual opção e por quê).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Chave de API inválida (`code`: `bad_key`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Conteúdo grande demais, ou que não cabe em um QR Code neste nível de correção (`code`: `too_large`, com o `limit` em bytes).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Logo que não é um PNG aceito (`code`: `unsupported_logo`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de pedidos (ou de tentativas de chave) atingido (`code`: `rate_limited`). Veja `Retry-After`.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Segundos até tentar de novo."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Muitos PNG sendo gerados agora (`code`: `busy`). Tente de novo depois de `Retry-After`.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Segundos até tentar de novo."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/qr/{text}.svg":{"get":{"operationId":"qrPathSvg","summary":"Atalho: texto no caminho, SVG","description":"O texto vai codificado na URL (use %2F para barra). Só type=text; o estilo vai na query.","parameters":[{"name":"text","in":"path","required":true,"schema":{"type":"string","maxLength":1500}},{"name":"shape","in":"query","required":false,"description":"Desenho de cada módulo (quadradinho) do código.","schema":{"description":"Desenho de cada módulo (quadradinho) do código.","type":"string","enum":["square","rounded","liquid","dots","diamond"],"default":"square"},"x-grupo":"Forma dos módulos"},{"name":"scale","in":"query","required":false,"description":"Tamanho do módulo em porcentagem da célula. Vale para rounded, dots e diamond.","schema":{"description":"Tamanho do módulo em porcentagem da célula. Vale para rounded, dots e diamond.","type":"integer","minimum":50,"maximum":100,"default":90},"x-grupo":"Forma dos módulos"},{"name":"eyeOuter","in":"query","required":false,"description":"Formato do anel dos três quadrados dos cantos.","schema":{"description":"Formato do anel dos três quadrados dos cantos.","type":"string","enum":["square","rounded","circle"],"default":"square"},"x-grupo":"Olhos"},{"name":"eyeInner","in":"query","required":false,"description":"Formato do miolo dos olhos.","schema":{"description":"Formato do miolo dos olhos.","type":"string","enum":["square","rounded","circle","diamond"],"default":"square"},"x-grupo":"Olhos"},{"name":"eyeColor","in":"query","required":false,"description":"Cor do anel dos olhos (hexadecimal) ou auto, a mesma dos módulos.","schema":{"description":"Cor do anel dos olhos (hexadecimal) ou auto, a mesma dos módulos.","type":"string","pattern":"^(auto|#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$","default":"auto","examples":["auto","6366f1"]},"x-grupo":"Olhos"},{"name":"eyeInnerColor","in":"query","required":false,"description":"Cor do miolo dos olhos (hexadecimal) ou auto (a do anel, ou a dos módulos).","schema":{"description":"Cor do miolo dos olhos (hexadecimal) ou auto (a do anel, ou a dos módulos).","type":"string","pattern":"^(auto|#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$","default":"auto","examples":["auto","6366f1"]},"x-grupo":"Olhos"},{"name":"fill","in":"query","required":false,"description":"Cor única, degradê linear ou radial entre color e color2.","schema":{"description":"Cor única, degradê linear ou radial entre color e color2.","type":"string","enum":["solid","linear","radial"],"default":"solid"},"x-grupo":"Cores"},{"name":"color","in":"query","required":false,"description":"Cor dos módulos (hexadecimal de 3 ou 6 dígitos, com ou sem #; na URL escreva %23 ou omita o #).","schema":{"description":"Cor dos módulos (hexadecimal de 3 ou 6 dígitos, com ou sem #; na URL escreva %23 ou omita o #).","type":"string","pattern":"^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","default":"111827","examples":["6366f1"]},"x-grupo":"Cores"},{"name":"color2","in":"query","required":false,"description":"Segunda cor do degradê (fill=linear ou radial).","schema":{"description":"Segunda cor do degradê (fill=linear ou radial).","type":"string","pattern":"^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","default":"6366f1","examples":["6366f1"]},"x-grupo":"Cores"},{"name":"bg","in":"query","required":false,"description":"Cor do fundo (hexadecimal) ou transparent.","schema":{"description":"Cor do fundo (hexadecimal) ou transparent.","type":"string","pattern":"^(transparent|#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$","default":"ffffff","examples":["transparent","6366f1"]},"x-grupo":"Cores"},{"name":"angle","in":"query","required":false,"description":"Ângulo do degradê linear em graus (0 = da esquerda para a direita, 90 = de cima para baixo).","schema":{"description":"Ângulo do degradê linear em graus (0 = da esquerda para a direita, 90 = de cima para baixo).","type":"integer","minimum":0,"maximum":360,"default":45},"x-grupo":"Cores"},{"name":"margin","in":"query","required":false,"description":"Margem vazia em volta, em módulos. Menos de 4 pode atrapalhar alguns leitores.","schema":{"description":"Margem vazia em volta, em módulos. Menos de 4 pode atrapalhar alguns leitores.","type":"integer","minimum":0,"maximum":10,"default":4},"x-grupo":"Margem e correção de erros"},{"name":"ecc","in":"query","required":false,"description":"Nível de correção de erros. Com logo, a correção sobe para H sozinha (o cabeçalho X-QR-Ecc informa).","schema":{"description":"Nível de correção de erros. Com logo, a correção sobe para H sozinha (o cabeçalho X-QR-Ecc informa).","type":"string","enum":["L","M","Q","H"],"default":"M"},"x-grupo":"Margem e correção de erros"},{"name":"logoShape","in":"query","required":false,"description":"Formato do logo e da placa atrás dele.","schema":{"description":"Formato do logo e da placa atrás dele.","type":"string","enum":["circle","rounded","square"],"default":"rounded"},"x-grupo":"Logo"},{"name":"logoSize","in":"query","required":false,"description":"Lado do logo em porcentagem do lado do QR. A resposta traz X-QR-Logo-Safe com o maior tamanho garantido.","schema":{"description":"Lado do logo em porcentagem do lado do QR. A resposta traz X-QR-Logo-Safe com o maior tamanho garantido.","type":"integer","minimum":8,"maximum":50,"default":20},"x-grupo":"Logo"},{"name":"logoPadding","in":"query","required":false,"description":"Folga entre o logo e os módulos, em módulos.","schema":{"description":"Folga entre o logo e os módulos, em módulos.","type":"number","minimum":0,"maximum":3,"multipleOf":0.5,"default":1},"x-grupo":"Logo"},{"name":"logoPlate","in":"query","required":false,"description":"Pinta uma placa com a cor do fundo atrás do logo.","schema":{"description":"Pinta uma placa com a cor do fundo atrás do logo.","type":"boolean","default":true},"x-grupo":"Logo"},{"name":"size","in":"query","required":false,"description":"Lado aproximado da imagem em pixels (o PNG usa um número inteiro de pixels por módulo, então o tamanho real fica perto deste). Até 1024 sem chave e 2048 com chave.","schema":{"description":"Lado aproximado da imagem em pixels (o PNG usa um número inteiro de pixels por módulo, então o tamanho real fica perto deste). Até 1024 sem chave e 2048 com chave.","type":"integer","minimum":64,"maximum":2048,"default":1024},"x-grupo":"Saída"},{"name":"format","in":"query","required":false,"description":"svg (vetor) ou png.","schema":{"description":"svg (vetor) ou png.","type":"string","enum":["svg","png"],"default":"svg"},"x-grupo":"Saída"}],"responses":{"200":{"description":"A imagem do QR Code.","headers":{"RateLimit-Limit":{"description":"Cota da janela mais apertada (por minuto ou por hora).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"O que ainda resta nessa janela, em pesos (SVG 1, PNG 6, logo +2, tamanho acima de 1024 px +3, conteúdo acima de 400 caracteres +1 e acima de 1200 +3).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Segundos até a janela renovar.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"As duas janelas, por exemplo `60;w=60, 1200;w=3600`.","schema":{"type":"string"}},"X-QR-Version":{"description":"Versão do QR (1 a 40).","schema":{"type":"integer"}},"X-QR-Modules":{"description":"Módulos por lado.","schema":{"type":"integer"}},"X-QR-Ecc":{"description":"Correção de erros usada (sobe para H com logo).","schema":{"type":"string"}},"X-QR-Logo-Safe":{"description":"Com logo: o maior tamanho do logo (porcentagem do lado) que ainda é garantido para este QR.","schema":{"type":"integer"}},"ETag":{"description":"Só no GET: o mesmo pedido gera sempre o mesmo ETag.","schema":{"type":"string"}}},"content":{"image/svg+xml":{"schema":{"type":"string"}},"image/png":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Opção inválida, desconhecida ou conteúdo ausente (`code`: `invalid_param`; a lista `errors` diz qual opção e por quê).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Chave de API inválida (`code`: `bad_key`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Conteúdo grande demais, ou que não cabe em um QR Code neste nível de correção (`code`: `too_large`, com o `limit` em bytes).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Logo que não é um PNG aceito (`code`: `unsupported_logo`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de pedidos (ou de tentativas de chave) atingido (`code`: `rate_limited`). Veja `Retry-After`.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Segundos até tentar de novo."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Muitos PNG sendo gerados agora (`code`: `busy`). Tente de novo depois de `Retry-After`.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Segundos até tentar de novo."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/qr/{text}.png":{"get":{"operationId":"qrPathPng","summary":"Atalho: texto no caminho, PNG","description":"Igual ao atalho .svg, em PNG.","parameters":[{"name":"text","in":"path","required":true,"schema":{"type":"string","maxLength":1500}},{"name":"shape","in":"query","required":false,"description":"Desenho de cada módulo (quadradinho) do código.","schema":{"description":"Desenho de cada módulo (quadradinho) do código.","type":"string","enum":["square","rounded","liquid","dots","diamond"],"default":"square"},"x-grupo":"Forma dos módulos"},{"name":"scale","in":"query","required":false,"description":"Tamanho do módulo em porcentagem da célula. Vale para rounded, dots e diamond.","schema":{"description":"Tamanho do módulo em porcentagem da célula. Vale para rounded, dots e diamond.","type":"integer","minimum":50,"maximum":100,"default":90},"x-grupo":"Forma dos módulos"},{"name":"eyeOuter","in":"query","required":false,"description":"Formato do anel dos três quadrados dos cantos.","schema":{"description":"Formato do anel dos três quadrados dos cantos.","type":"string","enum":["square","rounded","circle"],"default":"square"},"x-grupo":"Olhos"},{"name":"eyeInner","in":"query","required":false,"description":"Formato do miolo dos olhos.","schema":{"description":"Formato do miolo dos olhos.","type":"string","enum":["square","rounded","circle","diamond"],"default":"square"},"x-grupo":"Olhos"},{"name":"eyeColor","in":"query","required":false,"description":"Cor do anel dos olhos (hexadecimal) ou auto, a mesma dos módulos.","schema":{"description":"Cor do anel dos olhos (hexadecimal) ou auto, a mesma dos módulos.","type":"string","pattern":"^(auto|#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$","default":"auto","examples":["auto","6366f1"]},"x-grupo":"Olhos"},{"name":"eyeInnerColor","in":"query","required":false,"description":"Cor do miolo dos olhos (hexadecimal) ou auto (a do anel, ou a dos módulos).","schema":{"description":"Cor do miolo dos olhos (hexadecimal) ou auto (a do anel, ou a dos módulos).","type":"string","pattern":"^(auto|#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$","default":"auto","examples":["auto","6366f1"]},"x-grupo":"Olhos"},{"name":"fill","in":"query","required":false,"description":"Cor única, degradê linear ou radial entre color e color2.","schema":{"description":"Cor única, degradê linear ou radial entre color e color2.","type":"string","enum":["solid","linear","radial"],"default":"solid"},"x-grupo":"Cores"},{"name":"color","in":"query","required":false,"description":"Cor dos módulos (hexadecimal de 3 ou 6 dígitos, com ou sem #; na URL escreva %23 ou omita o #).","schema":{"description":"Cor dos módulos (hexadecimal de 3 ou 6 dígitos, com ou sem #; na URL escreva %23 ou omita o #).","type":"string","pattern":"^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","default":"111827","examples":["6366f1"]},"x-grupo":"Cores"},{"name":"color2","in":"query","required":false,"description":"Segunda cor do degradê (fill=linear ou radial).","schema":{"description":"Segunda cor do degradê (fill=linear ou radial).","type":"string","pattern":"^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","default":"6366f1","examples":["6366f1"]},"x-grupo":"Cores"},{"name":"bg","in":"query","required":false,"description":"Cor do fundo (hexadecimal) ou transparent.","schema":{"description":"Cor do fundo (hexadecimal) ou transparent.","type":"string","pattern":"^(transparent|#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))$","default":"ffffff","examples":["transparent","6366f1"]},"x-grupo":"Cores"},{"name":"angle","in":"query","required":false,"description":"Ângulo do degradê linear em graus (0 = da esquerda para a direita, 90 = de cima para baixo).","schema":{"description":"Ângulo do degradê linear em graus (0 = da esquerda para a direita, 90 = de cima para baixo).","type":"integer","minimum":0,"maximum":360,"default":45},"x-grupo":"Cores"},{"name":"margin","in":"query","required":false,"description":"Margem vazia em volta, em módulos. Menos de 4 pode atrapalhar alguns leitores.","schema":{"description":"Margem vazia em volta, em módulos. Menos de 4 pode atrapalhar alguns leitores.","type":"integer","minimum":0,"maximum":10,"default":4},"x-grupo":"Margem e correção de erros"},{"name":"ecc","in":"query","required":false,"description":"Nível de correção de erros. Com logo, a correção sobe para H sozinha (o cabeçalho X-QR-Ecc informa).","schema":{"description":"Nível de correção de erros. Com logo, a correção sobe para H sozinha (o cabeçalho X-QR-Ecc informa).","type":"string","enum":["L","M","Q","H"],"default":"M"},"x-grupo":"Margem e correção de erros"},{"name":"logoShape","in":"query","required":false,"description":"Formato do logo e da placa atrás dele.","schema":{"description":"Formato do logo e da placa atrás dele.","type":"string","enum":["circle","rounded","square"],"default":"rounded"},"x-grupo":"Logo"},{"name":"logoSize","in":"query","required":false,"description":"Lado do logo em porcentagem do lado do QR. A resposta traz X-QR-Logo-Safe com o maior tamanho garantido.","schema":{"description":"Lado do logo em porcentagem do lado do QR. A resposta traz X-QR-Logo-Safe com o maior tamanho garantido.","type":"integer","minimum":8,"maximum":50,"default":20},"x-grupo":"Logo"},{"name":"logoPadding","in":"query","required":false,"description":"Folga entre o logo e os módulos, em módulos.","schema":{"description":"Folga entre o logo e os módulos, em módulos.","type":"number","minimum":0,"maximum":3,"multipleOf":0.5,"default":1},"x-grupo":"Logo"},{"name":"logoPlate","in":"query","required":false,"description":"Pinta uma placa com a cor do fundo atrás do logo.","schema":{"description":"Pinta uma placa com a cor do fundo atrás do logo.","type":"boolean","default":true},"x-grupo":"Logo"},{"name":"size","in":"query","required":false,"description":"Lado aproximado da imagem em pixels (o PNG usa um número inteiro de pixels por módulo, então o tamanho real fica perto deste). Até 1024 sem chave e 2048 com chave.","schema":{"description":"Lado aproximado da imagem em pixels (o PNG usa um número inteiro de pixels por módulo, então o tamanho real fica perto deste). Até 1024 sem chave e 2048 com chave.","type":"integer","minimum":64,"maximum":2048,"default":1024},"x-grupo":"Saída"},{"name":"format","in":"query","required":false,"description":"svg (vetor) ou png.","schema":{"description":"svg (vetor) ou png.","type":"string","enum":["svg","png"],"default":"svg"},"x-grupo":"Saída"}],"responses":{"200":{"description":"A imagem do QR Code.","headers":{"RateLimit-Limit":{"description":"Cota da janela mais apertada (por minuto ou por hora).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"O que ainda resta nessa janela, em pesos (SVG 1, PNG 6, logo +2, tamanho acima de 1024 px +3, conteúdo acima de 400 caracteres +1 e acima de 1200 +3).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Segundos até a janela renovar.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"As duas janelas, por exemplo `60;w=60, 1200;w=3600`.","schema":{"type":"string"}},"X-QR-Version":{"description":"Versão do QR (1 a 40).","schema":{"type":"integer"}},"X-QR-Modules":{"description":"Módulos por lado.","schema":{"type":"integer"}},"X-QR-Ecc":{"description":"Correção de erros usada (sobe para H com logo).","schema":{"type":"string"}},"X-QR-Logo-Safe":{"description":"Com logo: o maior tamanho do logo (porcentagem do lado) que ainda é garantido para este QR.","schema":{"type":"integer"}},"ETag":{"description":"Só no GET: o mesmo pedido gera sempre o mesmo ETag.","schema":{"type":"string"}}},"content":{"image/svg+xml":{"schema":{"type":"string"}},"image/png":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Opção inválida, desconhecida ou conteúdo ausente (`code`: `invalid_param`; a lista `errors` diz qual opção e por quê).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Chave de API inválida (`code`: `bad_key`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Conteúdo grande demais, ou que não cabe em um QR Code neste nível de correção (`code`: `too_large`, com o `limit` em bytes).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Logo que não é um PNG aceito (`code`: `unsupported_logo`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de pedidos (ou de tentativas de chave) atingido (`code`: `rate_limited`). Veja `Retry-After`.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Segundos até tentar de novo."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Muitos PNG sendo gerados agora (`code`: `busy`). Tente de novo depois de `Retry-After`.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Segundos até tentar de novo."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Chave de quem gera QR Codes em volume. Nunca na URL."},"BearerAuth":{"type":"http","scheme":"bearer","description":"A mesma chave, no formato Authorization: Bearer <chave>."}},"schemas":{"Error":{"type":"object","required":["error","code"],"properties":{"error":{"type":"string","description":"Mensagem em português."},"code":{"type":"string","enum":["invalid_param","too_large","unsupported_logo","bad_key","rate_limited","busy"]},"errors":{"type":"array","description":"Uma entrada por opção com problema.","items":{"type":"object","properties":{"param":{"type":"string"},"code":{"type":"string"},"reason":{"type":"string"}}}},"limit":{"type":"integer","description":"Em too_large: o máximo de bytes que cabe neste nível de correção."},"retryAfter":{"type":"integer","description":"Segundos até tentar de novo (429 e 503)."}}}}}}