diff --git a/Controllers/HomeController.cs b/Controllers/HomeController.cs index 5314e1d..fabfabb 100644 --- a/Controllers/HomeController.cs +++ b/Controllers/HomeController.cs @@ -297,6 +297,24 @@ namespace QRRapidoApp.Controllers } } + [Route("developers")] + [Route("es/developers")] + [Route("en/developers")] + public IActionResult Developers() + { + var userId = User?.FindFirst(ClaimTypes.NameIdentifier)?.Value; + + ViewBag.ShowAds = _adDisplayService.ShouldShowAds(userId).Result; + ViewBag.IsPremium = _adDisplayService.HasValidPremiumSubscription(userId ?? "").Result; + ViewBag.IsAuthenticated = User?.Identity?.IsAuthenticated ?? false; + ViewBag.UserName = User?.Identity?.Name ?? ""; + ViewBag.Title = "API para Desenvolvedores — QR Rapido"; + ViewBag.Description = "Gere QR codes na sua aplicação via API REST. Suporte a PNG, WebP e SVG. Planos a partir de R$0."; + _adDisplayService.SetViewBagAds(ViewBag); + + return View(); + } + // Health check endpoint [Route("health")] public IActionResult Health() @@ -335,6 +353,9 @@ namespace QRRapidoApp.Controllers // Core entry points AppendUrl("/", "daily", "1.0"); AppendUrl("/es", "daily", "0.9"); + AppendUrl("/developers", "monthly", "0.8"); + AppendUrl("/es/developers", "monthly", "0.7"); + AppendUrl("/en/developers", "monthly", "0.7"); // Tools (Landing Pages) var tools = new[] { "pix", "wifi", "vcard", "whatsapp", "email", "sms", "texto", "url" }; diff --git a/Resources/SharedResource.en.resx b/Resources/SharedResource.en.resx index 5b63abc..e332178 100644 --- a/Resources/SharedResource.en.resx +++ b/Resources/SharedResource.en.resx @@ -2326,4 +2326,19 @@ Subscribe to our monthly plan and manage exclusive QR Codes for each product in your catalog. + + For Developers + + + Integrate QR codes directly into your application via REST API. Supports PNG, WebP and SVG. + + + Free plan available + + + See API plans + + + API for Developers + \ No newline at end of file diff --git a/Resources/SharedResource.es-PY.resx b/Resources/SharedResource.es-PY.resx index 659eac7..2fbc829 100644 --- a/Resources/SharedResource.es-PY.resx +++ b/Resources/SharedResource.es-PY.resx @@ -2162,4 +2162,19 @@ Suscríbase a nuestro plan mensual y gestione códigos QR exclusivos para cada producto de su catálogo. + + Para Desarrolladores + + + Integrá QR codes directamente en tu aplicación vía API REST. Soporte para PNG, WebP y SVG. + + + Plan gratuito disponible + + + Ver planes de API + + + API para Desarrolladores + diff --git a/Resources/SharedResource.es.resx b/Resources/SharedResource.es.resx index cc35662..7792178 100644 --- a/Resources/SharedResource.es.resx +++ b/Resources/SharedResource.es.resx @@ -2104,4 +2104,19 @@ Suscríbase a nuestro plan mensual y gestione códigos QR exclusivos para cada producto de su catálogo. + + Para Desarrolladores + + + Integrá QR codes directamente en tu aplicación vía API REST. Soporte para PNG, WebP y SVG. + + + Plan gratuito disponible + + + Ver planes de API + + + API para Desarrolladores + diff --git a/Resources/SharedResource.pt-BR.resx b/Resources/SharedResource.pt-BR.resx index bff3519..1943617 100644 --- a/Resources/SharedResource.pt-BR.resx +++ b/Resources/SharedResource.pt-BR.resx @@ -2315,4 +2315,19 @@ Assine nosso plano mensal e gerencie QR Codes exclusivos para cada produto do seu catálogo. + + Para Desenvolvedores + + + Integre QR codes diretamente na sua aplicação via API REST. Suporte a PNG, WebP e SVG. + + + Plano grátis disponível + + + Ver planos de API + + + API para Desenvolvedores + diff --git a/Views/Home/Developers.cshtml b/Views/Home/Developers.cshtml new file mode 100644 index 0000000..15fe8e1 --- /dev/null +++ b/Views/Home/Developers.cshtml @@ -0,0 +1,429 @@ +@{ + var isEn = (Context.Request.Path.Value ?? "").StartsWith("/en"); + var isEs = (Context.Request.Path.Value ?? "").StartsWith("/es"); + string T(string pt, string es, string en) => isEn ? en : isEs ? es : pt; + + Layout = "~/Views/Shared/_Layout.cshtml"; + ViewData["Title"] = T( + "API para Desenvolvedores — QR Rapido", + "API para Desarrolladores — QR Rapido", + "Developer API — QR Rapido"); +} + + +
+
+
+ + API REST + +
+

+ @T("Gere QR codes diretamente na sua aplicação", + "Generá QR codes directamente en tu aplicación", + "Generate QR codes directly in your application") +

+

+ @T("Integração simples, resposta rápida, múltiplos formatos de imagem.", + "Integración simple, respuesta rápida, múltiples formatos de imagen.", + "Simple integration, fast response, multiple image formats.") +

+ +

+ + @T("Plano Free inclui 5 QRs grátis e 500 requisições/mês", + "Plan Free incluye 5 QRs gratis y 500 solicitudes/mes", + "Free plan includes 5 QRs and 500 requests/month") +

+
+
+ + +
+
+
+

@T("Como funciona", "Cómo funciona", "How it works")

+

@T("Três passos para integrar QR codes na sua stack", "Tres pasos para integrar QR codes en tu stack", "Three steps to integrate QR codes into your stack")

+
+
+
+
+
+
1
+
@T("Crie sua conta", "Creá tu cuenta", "Create your account")
+

@T("Cadastro gratuito com Google ou Microsoft. Nenhum cartão necessário para começar.", "Registro gratuito con Google o Microsoft. No se necesita tarjeta para empezar.", "Free sign-up with Google or Microsoft. No card needed to start.")

+
+
+
+
+
+
+
2
+
@T("Gere sua API key", "Generá tu API key", "Generate your API key")
+

@T("No portal do desenvolvedor, crie uma chave em segundos. Até 5 chaves ativas por conta.", "En el portal del desarrollador, creá una clave en segundos. Hasta 5 claves activas por cuenta.", "In the developer portal, create a key in seconds. Up to 5 active keys per account.")

+
+
+
+
+
+
+
3
+
@T("Faça sua primeira chamada", "Hacé tu primera llamada", "Make your first call")
+

@T("Envie um POST com o conteúdo e receba o QR como PNG, WebP ou SVG.", "Enviá un POST con el contenido y recibí el QR como PNG, WebP o SVG.", "Send a POST with the content and receive the QR as PNG, WebP or SVG.")

+
+
+
+
+
+
+ + +
+
+
+

@T("Formatos de imagem suportados", "Formatos de imagen soportados", "Supported image formats")

+

@T("Escolha o formato ideal para cada caso de uso", "Elegí el formato ideal para cada caso de uso", "Choose the ideal format for each use case")

+
+
+
+
+
+
+ PNG +
+
@T("Compatibilidade universal", "Compatibilidad universal", "Universal compatibility")
+

@T("Funciona em qualquer plataforma, navegador e sistema operacional. Ideal para e-mail, impressão e exibição em telas.", "Funciona en cualquier plataforma, navegador y sistema operativo. Ideal para e-mail, impresión y visualización en pantallas.", "Works on any platform, browser and OS. Ideal for email, printing and screen display.")

+ @T("Todos os planos", "Todos los planes", "All plans") +
+
+
+
+
+
+
+ WebP +
+
@T("Menor tamanho, alta qualidade", "Menor tamaño, alta calidad", "Smaller size, high quality")
+

@T("Até 30% menor que PNG. Perfeito para aplicações web e mobile onde performance importa.", "Hasta 30% más pequeño que PNG. Perfecto para aplicaciones web y mobile donde el rendimiento importa.", "Up to 30% smaller than PNG. Perfect for web and mobile apps where performance matters.")

+ @T("Todos os planos", "Todos los planes", "All plans") +
+
+
+
+
+
+
+ SVG +
+
@T("Vetorial, escala infinita", "Vectorial, escala infinita", "Vector, infinite scale")
+

@T("Qualidade perfeita em qualquer tamanho, de um crachá a um outdoor. Arquivo menor e personalizável via CSS.", "Calidad perfecta en cualquier tamaño, desde una credencial hasta una cartelera. Archivo más pequeño y personalizable vía CSS.", "Perfect quality at any size, from a badge to a billboard. Smaller file and customizable via CSS.")

+ @T("Planos pagos", "Planes pagos", "Paid plans") +
+
+
+
+
+
+ + +
+
+
+

@T("Fácil de integrar", "Fácil de integrar", "Easy to integrate")

+

@T("Uma chamada. Um QR code. Em qualquer linguagem.", "Una llamada. Un QR code. En cualquier lenguaje.", "One call. One QR code. In any language.")

+
+ + + + +
+ + +
+
+
curl -X POST https://qrrapido.site/api/v1/QRManager/generate \
+  -H "X-API-Key: qr_SuaChaveAqui" \
+  -H "Content-Type: application/json" \
+  -d '{
+    "content": "https://seusite.com.br",
+    "type": "url",
+    "outputFormat": "png"
+  }' \
+  --output qrcode.png
+ +
+
+ + +
+
+
const response = await fetch(
+  'https://qrrapido.site/api/v1/QRManager/generate',
+  {
+    method: 'POST',
+    headers: {
+      'X-API-Key': 'qr_SuaChaveAqui',
+      'Content-Type': 'application/json'
+    },
+    body: JSON.stringify({
+      content: 'https://seusite.com.br',
+      type: 'url',
+      outputFormat: 'webp'   // 'png' | 'webp' | 'svg'
+    })
+  }
+);
+
+const blob = await response.blob();
+const url  = URL.createObjectURL(blob);
+document.querySelector('#qr-img').src = url;
+ +
+
+ + +
+
+
import requests
+
+response = requests.post(
+    'https://qrrapido.site/api/v1/QRManager/generate',
+    headers={
+        'X-API-Key': 'qr_SuaChaveAqui',
+        'Content-Type': 'application/json'
+    },
+    json={
+        'content': 'https://seusite.com.br',
+        'type': 'url',
+        'outputFormat': 'svg'   # 'png' | 'webp' | 'svg'
+    }
+)
+
+with open('qrcode.svg', 'wb') as f:
+    f.write(response.content)
+ +
+
+ +
+ + +
+ + @T("A API retorna a imagem diretamente no corpo da resposta (binário). Header ", "La API devuelve la imagen directamente en el cuerpo de la respuesta (binario). Header ", "The API returns the image directly in the response body (binary). Header ") + Content-Type: image/png@T(" | ", " | ", " | ")image/webp@T(" | ", " | ", " | ")image/svg+xml +
+
+
+ + +
+
+
+

@T("Tipos de QR suportados", "Tipos de QR soportados", "Supported QR types")

+

@T("Passe o campo", "Pasá el campo", "Pass the field") type @T("na requisição", "en la solicitud", "in the request")

+
+
+ @foreach (var item in new[] { + ("url", "fa-link", "URL"), + ("text", "fa-font", "Texto"), + ("wifi", "fa-wifi", "WiFi"), + ("vcard", "fa-address-card","vCard"), + ("pix", "fa-dollar-sign", "PIX"), + ("whatsapp", "fa-whatsapp", "WhatsApp"), + ("email", "fa-envelope", "E-mail"), + ("sms", "fa-sms", "SMS"), + }) + { +
+
+ + @item.Item3 +
@item.Item1 +
+
+ } +
+
+
+ + +
+
+
+

@T("Planos para cada escala", "Planes para cada escala", "Plans for every scale")

+

@T("De projetos pessoais a sistemas de alto volume.", "De proyectos personales a sistemas de alto volumen.", "From personal projects to high-volume systems.")

+
+ +
+ +
+
+
+
Free
+
+
+
R$0
+
    +
  • 10 req/min
  • +
  • 500 req/@T("mês","mes","month")
  • +
  • PNG + WebP
  • +
  • SVG
  • +
+
+
+
+ + +
+
+
+
Starter
+
+
+
+ + @T("Faça login para ver o preço", "Iniciá sesión para ver el precio", "Log in to see pricing") +
+
    +
  • 50 req/min
  • +
  • 10.000 req/@T("mês","mes","month")
  • +
  • PNG + WebP + SVG
  • +
  • @T("Suporte e-mail","Soporte e-mail","Email support")
  • +
+
+
+
+ + +
+
+
+
Pro
+ @T("Popular","Popular","Popular") +
+
+
+ + @T("Faça login para ver o preço", "Iniciá sesión para ver el precio", "Log in to see pricing") +
+
    +
  • 200 req/min
  • +
  • 100.000 req/@T("mês","mes","month")
  • +
  • PNG + WebP + SVG
  • +
  • @T("Suporte prioritário","Soporte prioritario","Priority support")
  • +
+
+
+
+ + +
+
+
+
Business
+
+
+
+ + @T("Faça login para ver o preço", "Iniciá sesión para ver el precio", "Log in to see pricing") +
+
    +
  • 500 req/min
  • +
  • 500.000 req/@T("mês","mes","month")
  • +
  • PNG + WebP + SVG
  • +
  • @T("Suporte dedicado + SLA","Soporte dedicado + SLA","Dedicated support + SLA")
  • +
+
+
+
+
+ + +
+ + @T( + "Os preços dos planos pagos estão disponíveis após o login. O cadastro é gratuito e leva menos de 30 segundos.", + "Los precios de los planes pagos están disponibles después del inicio de sesión. El registro es gratuito y lleva menos de 30 segundos.", + "Paid plan pricing is available after logging in. Sign-up is free and takes under 30 seconds." + ) + +
+
+
+ + +
+
+

@T("Pronto para integrar?", "¿Listo para integrar?", "Ready to integrate?")

+

@T("Crie sua conta, gere sua chave e faça o primeiro QR em menos de 2 minutos.", "Creá tu cuenta, generá tu clave y hacé el primer QR en menos de 2 minutos.", "Create your account, generate your key and make the first QR in under 2 minutes.")

+ @if (ViewBag.IsAuthenticated == true) + { + + @T("Ir ao Portal do Desenvolvedor", "Ir al Portal del Desarrollador", "Go to Developer Portal") + + } + else + { + + @T("Começar grátis agora", "Empezar gratis ahora", "Start for free now") + + } +
+
+ +@section Scripts { + +} diff --git a/Views/Home/Index.cshtml b/Views/Home/Index.cshtml index c3c77a5..f8315e9 100644 --- a/Views/Home/Index.cshtml +++ b/Views/Home/Index.cshtml @@ -1412,6 +1412,41 @@ + +
+
+
+
+
+
+ +
+
+
+ @Localizer["ForDevelopers"] +
+

+ @Localizer["ForDevelopersDesc"] +

+
+ REST API + PNG + WebP + SVG + @Localizer["FreePlanAvailable"] +
+
+ +
+
+
+
+
+ @await Html.PartialAsync("_AdSpace", new { position = "footer" }) diff --git a/Views/Shared/_Layout.cshtml b/Views/Shared/_Layout.cshtml index f207e68..6e1bc2a 100644 --- a/Views/Shared/_Layout.cshtml +++ b/Views/Shared/_Layout.cshtml @@ -308,6 +308,10 @@ FAQ
  • +
  • + @Localizer["ApiForDevelopers"] +
  • +
  • @Localizer["About"]