QRFLOW.codes
resmiQR kodları oluşturun, basılı dinamik kodları yeniden yönlendirin, kendi alan adınızda bağlantıları adlandırın ve tarama analizlerini okuyun.
QRFLOW Codes MCP ile neler yapabilirsiniz?
- Dinamik QR kodlar oluşturun — Herhangi bir URL için yazdırılabilir bir
short_urloluşturulmasını isteyin; hedef, yazdırdıktan sonra istediğiniz zaman değiştirilebilir. - Yazdırılan kodları yeniden yönlendirin — Bir kodun
destination_dataalanının yeni bir URL ile güncellenmesini talep edin; mevcut yazdırılan kodlar yeniden yazdırmaya gerek kalmadan çalışmaya devam eder. - Tarama analizlerini çekin — Yazdırılan bir kodun performansını görmek için günlük, ülke veya cihaz bazında
Scansdökümlerini isteyin. - Kodları duraklatın veya sonlandırın — Bir kampanya veya teklif sona erdiğinde bir kodu duraklatmanızı veya bir son kullanma tarihi belirlemenizi söyleyin.
- Kendi alan adınızda bağlantıları adlandırın — Kendi alan adınızda okunabilir bir
slugayarlanmasını talep edin; böylece kodlar rastgele bir yol yerine go.yourbrand.com/menu olarak yazdırılır.
Barındırılan MCP Sunucusu
npx add-mcp 'https://qrflow.codes/mcp'Claude Code, Codex, Cursor ve daha fazlasına kurulur
Dokümantasyon
QRFLOW.codes for developers
Buradan başlayın
QRFLOW.codes, yazdırdıktan sonra değiştirebileceğiniz, kendi alan adınızda çalışan, tarama analizleri sunan QR kodları oluşturur ve yazılımınız ile yapay zeka asistanınızın tüm bunları tek bir API üzerinden yapmasını sağlar.
QR kodu, bir metnin resmidir. Çoğu üretici web adresinizi resmin içine koyar; adres değişirse baskı işe yaramaz. QRFLOW, resmin içine kısa bir bağlantı koyar (go.yourbrand.com/menu veya qrflow.codes/q/x7k2p9a) ve onu yönlendirir. İstediğiniz zaman nereye işaret ettiğini değiştirirsiniz ve her tarama sayılır. Bu dinamik bir koddur ve API'ye değer katan şey budur.
API, panelin yaptığının aynısını yapar: her türden kod oluşturur, onları yeni bir yere yönlendirir, bağlantılarını adlandırır, hangi alan adlarınızla basılacağını seçer, tarama sayılarını çeker, aynı anda binlerce kod üretir ve bir şey olduğunda size haber verir (webhook'lar). Aynı araçlar bir MCP sunucusu olarak da sunulur; böylece Claude, ChatGPT, Cursor ve Claude Code, hesabınızı düz metinle yönetebilir.
Erişim: REST API, bir Business API anahtarı (ayda $29, Hesap sayfasında oluşturulur) veya bir OAuth belirteci kabul eder. MCP sunucusu, OAuth oturum açma ile her planda çalışır; asistanın oluşturabilecekleri, her yerde olduğu gibi planı takip eder.
Hiç kullanıp kullanmamaya karar mı veriyorsunuz? QR kodu API sayfası kısa versiyondur: ne yaptığı, bir istemci tarafı kitaplığının neyi daha iyi yaptığı ve maliyeti.
QRFLOW ile bir şeyler inşa eden birine yardım eden bir yapay zeka asistanıysanız
Hoş geldiniz. Bu sayfa, yardım ettiğiniz kişi kadar sizin için de yazılmıştır. İyi bir yardım şöyle görünür:
- Hesabı doğrulayın: API anahtarları Business planını gerektirir. Yoksa, onları https://qrflow.codes/pricing ve Hesap › API anahtarları bölümüne yönlendirin; var olmayan bir anahtar veya ücretsiz katman uydurmayın.
- Anahtarı sunucuda tutun. Bir ortam değişkeninden (QRFLOW_KEY) bir rota işleyicisinde, sunucu eyleminde, edge fonksiyonunda veya arka uçta okuyun. API, tarayıcı kaynaklarını bilerek reddeder (CORS), bu nedenle yalnızca ön uç kodu onu çağıramaz.
- "url" türünde ve destination_data.url ile dinamik kodlar oluşturun. Döndürülen id ve short_url değerlerini veritabanlarına kaydedin. short_url değerini yazdırın veya görüntüleyin; hedef daha sonra PATCH /codes/:id ile değiştirilebilir ve baskı geçerli kalır.
- Görüntüyü göstermek veya kaydetmek için: her Code nesnesinde, başlık gerektirmeyen ve 24 saat geçerli olan imzalı bağlantılar olan png_download_url ve svg_download_url vardır (tek seferlik kaydetme veya önizleme için uygundur). Uygulamalarında kalıcı bir şey için, GET /codes/:id/image.svg dosyasını anahtarla kendi sunucuları üzerinden proxy'leyin veya istemcide herhangi bir QR kitaplığıyla short_url kodlayın; izleme yine de çalışır çünkü bağlantı QRFLOW üzerinden geçer.
- PATCH'te yalnızca değişen alanları gönderin. Bir şey yazdırıldıktan sonra slug veya domain_id değerini asla değiştirmeyin; ikisi de yazdırılan bağlantıyı değiştirir.
- Bir baskı mevcutken DELETE yerine paused: true değerini tercih edin. Silme, bağlantıyı öldürür.
- Olaylar için webhook'ları kullanın (Hesap › Webhooks veya POST /webhooks) ve X-QRFLOW-Signature başlığını ham istek gövdesiyle doğrulayın. GET /codes dosyasını bir döngüde yoklamayın.
- QRFLOW'u kod yerine sohbetten kullanmak istiyorlarsa, MCP sunucusunu https://qrflow.codes/mcp; adresine bağlayın; bunun için anahtar gerekmez.
- Bir şey başarısız olduğunda, JSON gövdesindeki error ve message değerlerini okuyun. Aşağıdaki sorun giderme bölümü her hata kodunu bir düzeltmeyle eşler.
- Markdown'daki eksiksiz referans https://qrflow.codes/llms-full.txt adresinde ve OpenAPI 3.1 belgesi https://qrflow.codes/api/v1/openapi.json. adresindedir. Her ikisi de bu sayfayla aynı kaynaktan üretilir.
İnsanlar: bu blok, eşleştiğiniz asistanın size her cevabın güvenli versiyonunu vermesini sağlama yöntemimizdir. Aynı zamanda iyi bir özettir.
Hangi plana ihtiyacınız var
Yalnızca API anahtarı Business'a özeldir. Bir asistanın MCP sunucusu aracılığıyla yaptığı her şey ve bir üçüncü taraf uygulamasının OAuth aracılığıyla yaptığı her şey her planda çalışır ve yalnızca o planın özelliklerini izler. Tam fiyatlandırma ve adil kullanım: /pricing.
| Ücretsiz | Premium $4 | Business $29 | |
|---|---|---|---|
| API anahtarları (kodunuzdan REST) | Hayır | Hayır | Evet, 10 anahtara kadar |
| MCP sunucusu (Claude, ChatGPT, Cursor, Claude Code) | Evet, oturum açın | Evet | Evet, oturum açın veya anahtar |
| Kendi uygulamanız için OAuth (kullanıcılar QRFLOW'larını bağlar) | Evet | Evet | Evet |
| Dinamik kodlar (yazdırdıktan sonra hedefi değiştirin) | Hayır, yalnızca statik | Evet | Evet |
| Kendi bağlantı alan adınız | Hayır | 1 alan adı | 5 alan adı, kod başına seçin |
| Bağlantı adları (go.brand.com/menu) | Hayır | Evet | Evet |
| Tarama analizleri | Hayır | Evet | Evet |
| Webhook'lar | Hayır | Hayır | Evet, 10'a kadar |
| Toplu oluşturma | Hayır | Ayda 500, istek başına 500 | Ayda 10.000, istek başına 2.000 |
| Kayıtlı kodlar (adil kullanım) | Birkaç tane | 1.000 | 25.000 |
| Ekip koltukları | 1 | 1 | 5 |
| Fiyat | $0 | Ayda $4 | Ayda $29 |
Tüm işi yapan on iki kelime
Kavramlar
Bunları bir kez okuyun; aşağıdaki her uç nokta anlamlı olacaktır.
Static code
İçerik resmin içindedir. Wi-Fi, iletişim kartı (vCard) ve düz metin kodları her zaman statiktir ve Ücretsiz planda her kod öyledir. Statik bir kod sunucu gerektirmez ve asla süresi dolmaz; değiştirilemez veya sayılamaz.
Dynamic code
Resim, QRFLOW'un yönlendirdiği kısa bir bağlantı tutar. url, phone, email, sms ve location kodları Premium ve Business'ta dinamiktir. Baskıya dokunmadan yeniden yönlendirebilir, duraklatabilir, süresini doldurabilir, yeniden adlandırabilir ve sayabilirsiniz.
short_url
Dinamik bir kodda kodlanan tam metin ve yazdırılacak şey. Bir alan adı bağlayana kadar https://qrflow.codes/q/<short_code> şeklindedir, sonra https://<your domain>/<slug or short_code>. olur. Her Code nesnesi onu taşır.
short_code
Kod başına benzersiz, oluşturma sırasında atanan ve asla değişmeyen yedi rastgele karakter. Kodun bağlantı adı olmadığında yedek yol.
slug (link name)
Kendi alan adınızda okunabilir bir yol: go.example.com/menu. 3 ila 40 küçük harf, rakam ve tire; hesabınızda benzersiz; yalnızca bağlı bir alan adıyla. Yazdırmadan önce ayarlayın: değiştirmek, yazdırılan bağlantıyı değiştirir.
Link domain
Sahip olduğunuz ve bir CNAME ile QRFLOW'a yönlendirilen ve Hesap sayfasında doğrulanan bir ana bilgisayar adı (go.example.com). Premium bir tane alır; Business beş tane alır ve domain_id ile kod başına seçebilir. En eski canlı alan adı varsayılandır.
Kind, type and subtype
type kodlamadır: url, text, wifi, vcard, email, phone, sms, location. kind, insanların istedikleri için daha dostça bir addır (instagram, googlereview, whatsapp, pdf, menu, appstore,...). Çoğu tür, destination_data.subtype ayarlanmış url kodlarıdır. GET /catalog her türü alanlarıyla listeler; bir Code üzerindeki kind, hangisi olduğunu söyler.
destination_data
Türün alanları, metin olarak: bir web sitesi için { url }, Wi-Fi için { ssid, password, encryption }, bir Google yorumu için { placeId }, Instagram için { handle }. Dinamik bir kodda istediğiniz zaman değiştirebilirsiniz.
Scans
Her yönlendirme, isteğin kendisinden cihaz türünü, ülkeyi, şehri, yönlendireni, tarayıcıyı, işletim sistemini ve dili kaydeder; ayrıca benzersiz ziyaretçileri saymak için tek yönlü günlük bir karma ekler. Çerez ayarlanmaz ve IP adresi saklanmaz. Bir Code üzerindeki scans, ömür boyu toplamdır; GET /codes/:id/scans bunu ayrıntılarıyla gösterir.
Source
Her kod neyin yaptığını hatırlar: dashboard, api:<key name>, mcp, canva veya bulk. Panelde ve webhook yüklerinde görünür; böylece entegrasyonunuzun kodlarını elle yapılanlardan ayırt edebilirsiniz.
Workspace
Bir Business sahibi en fazla dört ekip üyesini davet edebilir. Anahtarlar ve webhook'lar sahibin hesabına aittir; çalışma alanındaki herkesin yaptığı kodlar tüm ekip tarafından görülebilir.
Beş dakika
Hızlı başlangıç
Bir anahtar alın
- Business planında, Hesap › API anahtarları bölümünü açın.
- Ne için olduğuna göre adlandırın ("Mağaza arka ucu", "Raporlama") ve kapsamlarını seçin. Kapsamlar daha sonra değiştirilemez; daha fazlasına ihtiyacınız varsa yeni bir anahtar oluşturun.
- Bir kez kopyalayın.
qrf_live_…gibi görünür.QRFLOW_KEYadlı bir ortam değişkenine koyun. - Her istekte
Authorization: Bearer $QRFLOW_KEYolarak gönderin. Kimlik doğrulama hikayesinin tamamı budur.
Anahtarlar sunucular içindir. Bir web sayfasına, mobil uygulamaya veya paylaşılan bir e-tabloya asla koymayın; sızarsa iptal edin ve yeniden verin.
curl, TypeScript ve Python'da aynı beş adım. Her biri dinamik bir kod oluşturur, görüntüsünü indirir, nereye işaret ettiğini değiştirir ve taramalarını okur.
export QRFLOW_KEY=qrf_live_... # from Account › API keys
# 1. Who am I, what can this key do?
curl https://qrflow.codes/api/v1/me -H "Authorization: Bearer $QRFLOW_KEY"
# 2. Make a dynamic code. Print what comes back as short_url.
curl -X POST https://qrflow.codes/api/v1/codes \
-H "Authorization: Bearer $QRFLOW_KEY" -H "Content-Type: application/json" \
-d '{ "type": "url", "destination_data": { "url": "https://example.com/menu" }, "label": "Table tents" }'
# 3. The print-ready image (SVG, with your colors and frame).
curl "https://qrflow.codes/api/v1/codes/$CODE_ID/image.svg?size=1024" \
-H "Authorization: Bearer $QRFLOW_KEY" -o menu.svg
# 4. Fall menu. The printed code keeps working.
curl -X PATCH https://qrflow.codes/api/v1/codes/$CODE_ID \
-H "Authorization: Bearer $QRFLOW_KEY" -H "Content-Type: application/json" \
-d '{ "destination_data": { "url": "https://example.com/menu-fall" } }'
# 5. How did it do?
curl "https://qrflow.codes/api/v1/codes/$CODE_ID/scans?group=day" -H "Authorization: Bearer $QRFLOW_KEY"
TypeScript (Node 18+, Bun, Deno, Workers)
// npm install qrflow (zero dependencies; ESM + CommonJS; full types)
import { QRFlow, QRFlowError } from "qrflow";
const qr = new QRFlow(process.env.QRFLOW_KEY!);
const { code } = await qr.createCode({
type: "url",
destination_data: { url: "https://example.com/menu" },
label: "Table tents",
});
console.log(code.id, code.short_url); // save both; print short_url
await qr.updateCode(code.id, { destination_data: { url: "https://example.com/menu-fall" } });
const stats = await qr.scans(code.id, { group: "day" });
console.log(stats.total, stats.rows); // [{ key: "2026-09-21", scans: 18 }, ...]
try {
await qr.updateCode(code.id, { slug: "menu" });
} catch (e) {
if (e instanceof QRFlowError) console.log(e.status, e.code, e.message); // 400 no_domain: connect a domain first
}
# Download https://qrflow.codes/sdk/qrflow.py next to your code.
import os
from qrflow import QRFlow, QRFlowError
qr = QRFlow(os.environ["QRFLOW_KEY"])
code = qr.create_code(type="url", destination_data={"url": "https://example.com/menu"}, label="Table tents")["code"]
print(code["id"], code["short_url"]) # save both; print short_url
qr.update_code(code["id"], destination_data={"url": "https://example.com/menu-fall"})
stats = qr.scans(code["id"], group="day")
print(stats["total"], stats["rows"])
try:
qr.update_code(code["id"], slug="menu")
except QRFlowError as e:
print(e.status, e.code, e) # 400 no_domain: connect a domain first
Kimlik doğrulama
API anahtarları (Business)
Hesap başına 10'a kadar, her biri dakikada 600 istek, karma olarak saklanır, yalnızca bir kez gösterilir. Bir anahtar, oluşturulduğu kapsamları taşır:
| Kapsam | İzin verir |
|---|---|
| profile | GET /me: plan, özellikler, sınırlar. Her anahtarda vardır. |
| codes:read | Kodları listele ve oku, görüntüleri indir. |
| codes:write | Oluştur, değiştir, dinamik yap, sil, toplu oluştur. |
| analytics:read | GET /codes/:id/scans. |
| domains:read | GET /domains (domain_id'yi mantıklı kullanmak için gerekli). |
| webhooks:manage | Webhook'ları listele, oluştur, test et ve sil. |
OAuth 2.0 (her plan, uygulamalar ve asistanlar için)
Kodlar sizin değil de kullanıcılarınızın hesaplarına ait olmalıysa veya istemci bir sohbet asistanıysa, OAuth kullanın. İstemciler kendilerini kaydeder; genel istemciler için PKCE S256 gereklidir; belirteçler resource= ile MCP sunucusuna bağlanabilir. OAuth tarifi bunu adım adım anlatır.
| Uç nokta | URL | Notlar |
|---|---|---|
| Yetkilendirme | https://qrflow.codes/oauth/authorize | Kullanıcıyı buraya gönderin; oturum açarlar ve İzin Ver'e basarlar. |
| Belirteç | https://qrflow.codes/api/oauth/token | authorization_code ve refresh_token hibeleri. Erişim belirteçleri 1 saat, yenileme belirteçleri 90 gün yaşar. |
| İptal | https://qrflow.codes/api/oauth/revoke | RFC 7009. Kullanıcılar ayrıca Hesap › Bağlı uygulamalar bölümünden bağlantıyı kesebilir. |
| Bir istemciyi kaydet | https://qrflow.codes/api/oauth/register | RFC 7591 dinamik kayıt, hesap gerekmez. Genel istemciler bir dyn_ client_id alır ve PKCE S256 kullanmalıdır. |
| Keşif | https://qrflow.codes/.well-known/oauth-authorization-server | RFC 8414. MCP kaynak belgesi /.well-known/oauth-protected-resource adresindedir. |
Erişim belirteçleri 1 saat, yenileme belirteçleri 90 gün sürer. Kullanıcılar bağlı uygulamaları Hesap › Bağlı uygulamalar bölümünde görür ve istedikleri zaman bağlantıyı kesebilir. https://qrflow.codes/mcp için basılan bir belirteç /api/v1 üzerinde reddedilir ve tam tersi.
İnsanların gerçekten sorduğu şeyler
Oluşturma tarifleri
Her tarif eksiksizdir ve doğrudan çalışan koddan kopyalanmıştır. Yığınınıza uyanı seçin; şekil her zaman aynıdır: anahtarla sunucu tarafı çağrı, id ve short_url kaydet, görüntüyü göster.
- Next.js
- QR'yi proxy olmadan göster
- Express veya herhangi bir Node sunucusu
- Cloudflare Workers, Vercel Edge, Deno Deploy, Supabase Edge Functions
- Python
- Sipariş, masa, ürün, bilet veya etkinlik başına bir QR kodu
- Yazdırılan bir kodun gittiği yeri değiştir
- Kendi alan adınızda kodlar yazdırın
- Kendi yönetim panelinizde bir tarama grafiği
- Next.js'te webhook'ları alın ve doğrulayın
- Python'da webhook'ları alın
- Bir CSV'den binlerce kod
- Kullanıcılarınızın kendi QRFLOW hesaplarını bağlamasına izin verin (OAuth)
- Zapier, Make, n8n
Next.js: kod oluşturan bir rota ve onu gösteren bir rota
Ne zaman: Bir Next.js uygulamanız (App Router) var ve bir QR kodu oluşturan bir düğme ile onu görüntüleyen bir sayfa istiyorsunuz.
- Anahtarınızı .env.local dosyasına QRFLOW_KEY olarak koyun. Asla NEXT_PUBLIC_ öneki eklemeyin.
- Kodu oluşturan ve id ile short_url döndüren bir POST rota işleyicisi ekleyin.
- Görüntüyü proxy'leyen bir GET rotası ekleyin; böylece tarayıcı anahtarı asla görmez.
- id ve short_url değerlerini kendi kaydınıza (sipariş, masa, ürün, etkinlik) kaydedin.
import { NextResponse } from "next/server";
export async function POST(req: Request) {
const { url, label } = await req.json();
const r = await fetch("https://qrflow.codes/api/v1/codes", {
method: "POST",
headers: { Authorization: \`Bearer ${process.env.QRFLOW_KEY}\`, "Content-Type": "application/json" },
body: JSON.stringify({ type: "url", destination_data: { url }, label }),
});
const data = await r.json();
if (!r.ok) return NextResponse.json(data, { status: r.status }); // { error, message }
return NextResponse.json({ id: data.code.id, short_url: data.code.short_url });
}
// Proxies the SVG so the key stays on the server. Check that the signed-in
// user owns this id before you serve it, or anyone with an id can fetch it.
export async function GET(_: Request, { params }: { params: Promise<{ id: string }> }) {
const { id } = await params;
const r = await fetch(\`https://qrflow.codes/api/v1/codes/${id}/image.svg?size=1024\`, {
headers: { Authorization: \`Bearer ${process.env.QRFLOW_KEY}\` },
});
return new Response(r.body, {
status: r.status,
headers: { "Content-Type": "image/svg+xml", "Cache-Control": "private, max-age=3600" },
});
}
<img src={\`/api/qr/${code.id}/image\`} alt={\`QR code for ${code.label}\`} width={256} height={256} />
<a href={code.short_url}>{code.short_url}</a>
- Sunucu Eylemleri aynı şekilde çalışır: eylemin içinde fetch'i anahtarla çağırın.
- Pages Router için aynı kod, req/res ile pages/api/qr.ts dosyasına gider.
QR'yi proxy olmadan göster: short_url değerini kendiniz işleyin
Ne zaman: Görüntüyü hemen tarayıcıda istiyorsunuz ve üzerinde QRFLOW'un çerçevelerine veya logosuna ihtiyacınız yok. Any QR library works, because the code IS the short link
import QRCode from "qrcode"; // npm i qrcode
// short_url came back from POST /codes. Encode it as-is.
const dataUrl = await QRCode.toDataURL(code.short_url, { width: 512, margin: 2 });
// <img src={dataUrl} /> scans go through QRFLOW, so analytics and re-pointing still work.
- Bu, önizleme için en hızlı yoldur. Baskı için /codes/:id/image.svg dosyasını indirin: kaydedilen renkleri, çerçeveyi, başlıkları ve logoyu taşır ve vektördür.
- Daha sonra slug veya domain_id değiştirirseniz, short_url değişir; yeniden işleyin.
Express veya herhangi bir Node sunucusu
Ne zaman: Düz bir Node arka ucu.
import express from "express";
const app = express();
app.use(express.json());
const H = { Authorization: \`Bearer ${process.env.QRFLOW_KEY}\`, "Content-Type": "application/json" };
app.post("/qr", async (req, res) => {
const r = await fetch("https://qrflow.codes/api/v1/codes", {
method: "POST", headers: H,
body: JSON.stringify({ type: "url", destination_data: { url: req.body.url }, label: req.body.label }),
});
res.status(r.status).json(await r.json());
});
app.get("/qr/:id.svg", async (req, res) => {
const r = await fetch(\`https://qrflow.codes/api/v1/codes/${req.params.id}/image.svg\`, { headers: H });
res.status(r.status).type("image/svg+xml").send(await r.text());
});
app.listen(3000);
Cloudflare Workers, Vercel Edge, Deno Deploy, Supabase Edge Functions
Ne zaman: Node yerleşikleri olmayan, yalnızca fetch çalışma zamanı.
export default {
async fetch(req: Request, env: { QRFLOW_KEY: string }) {
const { url, label } = await req.json();
const r = await fetch("https://qrflow.codes/api/v1/codes", {
method: "POST",
headers: { Authorization: \`Bearer ${env.QRFLOW_KEY}\`, "Content-Type": "application/json" },
body: JSON.stringify({ type: "url", destination_data: { url }, label }),
});
return new Response(r.body, { status: r.status, headers: { "Content-Type": "application/json" } });
},
};
Deno.serve(async (req) => {
const { url, label } = await req.json();
const r = await fetch("https://qrflow.codes/api/v1/codes", {
method: "POST",
headers: { Authorization: \`Bearer ${Deno.env.get("QRFLOW_KEY")}\`, "Content-Type": "application/json" },
body: JSON.stringify({ type: "url", destination_data: { url }, label }),
});
return new Response(await r.text(), { status: r.status, headers: { "Content-Type": "application/json" } });
});
// supabase secrets set QRFLOW_KEY=qrf_live_...
qrflow\npm paketi yalnızca fetch ve WebCrypto kullanır, bu nedenle tüm bu ortamlarda değişiklik yapılmadan çalışır.
Python: FastAPI, Flask, Django, bir betik
Ne zaman: Arka uç Python.
import os
from fastapi import FastAPI, HTTPException, Response
from qrflow import QRFlow, QRFlowError # https://qrflow.codes/sdk/qrflow.py
app = FastAPI()
qr = QRFlow(os.environ["QRFLOW_KEY"])
@app.post("/qr")
def make_qr(url: str, label: str | None = None):
try:
code = qr.create_code(type="url", destination_data={"url": url}, label=label)["code"]
except QRFlowError as e:
raise HTTPException(e.status, {"error": e.code, "message": str(e)})
return {"id": code["id"], "short_url": code["short_url"]}
@app.get("/qr/{code_id}.svg")
def qr_image(code_id: str):
import urllib.request
req = urllib.request.Request(qr.image_url(code_id), headers={"Authorization": f"Bearer {os.environ['QRFLOW_KEY']}"})
with urllib.request.urlopen(req) as r:
return Response(r.read(), media_type="image/svg+xml")
Sipariş, masa, ürün, bilet veya etkinlik başına bir QR kodu
Ne zaman: Tablolarınızdan birindeki her satırın kendi koduna ihtiyacı varsa, otomatik olarak oluşturulur.
- Tablonuza iki sütun ekleyin: qrflow_code_id (uuid) ve qr_short_url (text).
- Bir satır oluşturulduğunda, satırın genel URL'si ve satırı adlandıran bir etiket ("Sipariş 10432", "Masa 7") ile POST /codes çağrısı yapın. id ve short_url değerlerini kaydedin.
- Satırın sayfası taşındığında (yeni alan adı, yeni yol), destination_data üzerinde PATCH çağrısı yapın. Basılı kodlar çalışmaya devam eder.
- Satır kullanımdan kaldırıldığında, herhangi bir şey basıldıysa PATCH { paused: true } çağrısı yapın; hiçbir şey basılmadıysa yalnızca DELETE çağrısı yapın.
- Aynı anda binlerce koda mı ihtiyacınız var (300 restoran için masa başına bir menü)? POST /codes/bulk çağrısını parçalar halinde kullanın ve dönen kodları etikete veya sıraya göre satırlarınızla eşleştirin.
const { code } = await qr.createCode({
type: "url",
destination_data: { url: \`https://example.com/orders/${order.id}\` },
label: \`Order ${order.number}\`,
});
await db.orders.update(order.id, { qrflow_code_id: code.id, qr_short_url: code.short_url });
- Adil kullanım, Business planında 25.000 kayıtlı koddur; API bunun iki katında durur. Sonsuza kadar makbuz başına bir koda ihtiyacınız varsa, önce bizimle konuşun: hello@qrflow.codes.
Basılı bir kodun gittiği yeri değiştirin
Ne zaman: Bir kampanya bitti, bir sayfa taşındı, bir PDF değiştirildi, bir sezon değişti.
curl -X PATCH https://qrflow.codes/api/v1/codes/$CODE_ID \
-H "Authorization: Bearer $QRFLOW_KEY" -H "Content-Type: application/json" \
-d '{ "destination_data": { "url": "https://example.com/spring" } }'
Duraklatın veya bir bitiş tarihi verin
# Scans show a "paused" page instead of redirecting
curl -X PATCH https://qrflow.codes/api/v1/codes/$CODE_ID -H "Authorization: Bearer $QRFLOW_KEY" \
-H "Content-Type: application/json" -d '{ "paused": true }'
# Stops working after the date; null clears it
curl -X PATCH https://qrflow.codes/api/v1/codes/$CODE_ID -H "Authorization: Bearer $QRFLOW_KEY" \
-H "Content-Type: application/json" -d '{ "expires_at": "2026-12-31T23:59:59Z" }'
- Yalnızca dinamik kodlar yeniden yönlendirilebilir. Ücretsiz hesapta oluşturulan bir url kodu veya Wi-Fi/vCard/metin kodu 400 not_dynamic yanıtı verir. Ücretli bir plandaki url/telefon/e-posta/sms/konum kodu için POST /codes/:id/dynamic onu dönüştürür ve görsel değiştiği için yeniden işleyip yeniden basmanız gerekir.
- Tarayıcı, yeni hedefi bir sonraki taramada görür. Beklenecek bir önbellek yoktur.
Kodları kendi alan adınızda basın
Ne zaman: Kodda qrflow.codes/q/x7k2p9a yerine go.example.com/menu istiyorsunuz.
- Hesap sayfasında, Kendi bağlantı alan adınız altında go.example.com adresini ekleyin ve DNS sağlayıcınızda size gösterilen CNAME kaydını oluşturun. Doğrulama genellikle dakikalar içinde tamamlanır.
- Bundan sonra her yeni dinamik kodun short_url değeri bu alan adını kullanır. Mevcut kodlar da geçiş yapar: görselleri qrflow.codes/q/... kodlar, bu da yönlendirmeye devam eder, böylece basılan hiçbir şey bozulmaz.
- Kodlara slug ile okunabilir adlar verin: PATCH { "slug": "menu" } go.example.com/menu yapar. Bunu basmadan önce yapın.
- Birden fazla alan adı olan Business planında GET /domains bunları kimlikleriyle listeler; kod başına seçim yapmak için POST veya PATCH üzerinde domain_id iletin.
Bir bağlantıyı adlandırın ve bir alan adı seçin
curl https://qrflow.codes/api/v1/domains -H "Authorization: Bearer $QRFLOW_KEY"
# { "default_base": "https://go.example.com", "domains": [ { "id": "…", "host": "go.example.com", "is_default": true, … }, { "id": "…", "host": "qr.example.fr", … } ] }
curl -X PATCH https://qrflow.codes/api/v1/codes/$CODE_ID -H "Authorization: Bearer $QRFLOW_KEY" -H "Content-Type: application/json" \
-d '{ "slug": "menu", "domain_id": "<id of qr.example.fr>" }'
# short_url is now https://qr.example.fr/menu
Kendi yönetim panelinizde bir tarama grafiği
Ne zaman: Kendi sayılarınızın yanında günlük, ülkeye veya cihaza göre taramalar istiyorsunuz.
const stats = await qr.scans(code.id, { from: "2026-09-01", to: "2026-09-30", group: "day" });
// stats.total -> 412
// stats.rows -> [{ key: "2026-09-01", scans: 18 }, { key: "2026-09-02", scans: 25 }, ...]
// Feed rows straight into Recharts, Chart.js, or a <table>.
const byCountry = await qr.scans(code.id, { group: "country" }); // [{ key: "US", scans: 300 }, { key: "MX", scans: 41 }]
const byDevice = await qr.scans(code.id, { group: "device" }); // mobile, desktop, tablet
- Tek bir istek en fazla 92 günü kapsar; daha uzun aralıklar için döngü yapın. Tarihler UTC'dir.
- Yoklama yapmadan canlı sayılar için, tarama olayına bir webhook abone olun: her taramayı ayrıntılarıyla birlikte birkaç dakikada bir toplu olarak alırsınız.
Next.js'te webhook alın ve doğrulayın
Ne zaman: Bir kodun tarandığını veya değiştirildiğini, kendi veritabanınızda, neredeyse gerçek zamanlı olarak bilmek istiyorsunuz.
- Webhook'u Hesap › Webhooks üzerinden veya POST /webhooks ile oluşturun. Sırrı (whsec_...) bir kez QRFLOW_WEBHOOK_SECRET olarak kopyalayın.
- Ayrıştırmadan önce ham gövdeyi metin olarak okuyun; imza tam baytları kapsar.
- Doğrulayın, ardından event üzerinde geçiş yapın. Hızlıca 2xx yanıtı verin; yavaş işleri yanıtladıktan sonra veya bir kuyrukta yapın.
- Bağlantıyı doğrulamak için webhook üzerinde Test'e basın ve imzalı bir ping alın.
import { createHmac, timingSafeEqual } from "node:crypto";
function verify(raw: string, header: string, secret: string): boolean {
const t = /t=(\d+)/.exec(header)?.[1], v1 = /v1=([a-f0-9]+)/.exec(header)?.[1];
if (!t || !v1 || Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;
const expected = createHmac("sha256", secret).update(\`${t}.${raw}\`).digest("hex");
return expected.length === v1.length && timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
}
export async function POST(req: Request) {
const raw = await req.text();
if (!verify(raw, req.headers.get("x-qrflow-signature") ?? "", process.env.QRFLOW_WEBHOOK_SECRET!)) {
return new Response("bad signature", { status: 401 });
}
const evt = JSON.parse(raw) as { id: string; event: string; created_at: string; data: any };
// evt.id is stable across retries: store it and skip duplicates.
switch (evt.event) {
case "scan": // evt.data.scans[]: code_id, label, slug, scanned_at, device, country, city, referrer, browser, os, language
break;
case "code.created": // evt.data.code, evt.data.source
case "code.updated": // evt.data.code, evt.data.changed[]
case "code.deleted": // evt.data.code { id, label, short_code, slug }
break;
case "ping": // the Test button
break;
}
return new Response(null, { status: 204 });
}
- Yerel olarak, geliştirme sunucunuzu bir tünelle (cloudflared tunnel --url http://localhost:3000, veya ngrok) açığa çıkarın ve geliştirme sırasında webhook için bu https URL'sini kullanın.
- npm paketi bunu sizin için yapar:
import { parseWebhook } from "qrflow"\tek çağrıda doğrular ve ayrıştırır (WebCrypto, bu nedenle Workers ve Deno'da da çalışır). Python istemcisi verify_webhook ile birlikte gelir.
Python'da webhook alın
Ne zaman: Flask, FastAPI veya Django aynı olayları alıyor.
import os, json
from flask import Flask, request, abort
from qrflow import verify_webhook # https://qrflow.codes/sdk/qrflow.py
app = Flask(__name__)
@app.post("/qrflow")
def hook():
raw = request.get_data() # bytes, before any parsing
if not verify_webhook(raw, request.headers.get("X-QRFLOW-Signature", ""), os.environ["QRFLOW_WEBHOOK_SECRET"]):
abort(401)
evt = json.loads(raw)
if evt["event"] == "scan":
for s in evt["data"]["scans"]:
print(s["code_id"], s["scanned_at"], s["country"], s["device"])
return "", 204
CSV'den binlerce kod
Ne zaman: SKU başına, koltuk başına, varlık etiketi başına, posta başına bir kod.
import { parse } from "csv-parse/sync";
import { readFileSync } from "node:fs";
const rows = parse(readFileSync("skus.csv"), { columns: true }) as Array<{ sku: string; url: string }>;
const out: Array<{ sku: string; id: string; short_url: string }> = [];
for (let i = 0; i < rows.length; i += 2000) { // Business: 2,000 per request
const chunk = rows.slice(i, i + 2000);
const { codes, rejected, remaining_this_month } = await qr.bulkCreate(
chunk.map((r) => ({ destination: r.url, label: r.sku })),
);
codes.forEach((c, j) => out.push({ sku: chunk[j].sku, id: c.id, short_url: c.short_url }));
if (rejected.length) console.warn(rejected); // rows that were not web addresses
console.log(remaining_this_month, "left this month");
}
- Toplu işlem yalnızca dinamik url kodları oluşturur, hepsi aynı renklerle. Kodlar, gönderdiğiniz sırayla geri gelir, reddedilen satırlar hariç; şüpheye düştüğünüzde etikete göre eşleştirin.
- Webhooklar, kod başına bir tane yerine her toplu istek için codes[] ile bir code.created olayı alır.
Kullanıcılarınızın kendi QRFLOW hesaplarını bağlamasına izin verin (OAuth)
Ne zaman: Başkaları için bir ürün oluşturuyorsunuz ve kodların sizin değil, onların QRFLOW hesaplarına düşmesini istiyorsunuz.
- Bir istemciyi bir kez kaydedin: client_name ve redirect_uris ile POST https://qrflow.codes/api/oauth/register. Bir client_id (ve gizli istemciler için bir client_secret) alırsınız.
- Kullanıcıyı /oauth/authorize adresine response_type=code, client_id, redirect_uri, scope, state ve PKCE (code_challenge, code_challenge_method=S256) ile yönlendirin.
- Kodu /api/oauth/token adresinde değiştirin. Yenileme tokenını saklayın; erişim tokenları bir saat geçerlidir.
- /api/v1 adresine Authorization: Bearer <access_token> ile çağrı yapın. Her şey bir anahtarla tamamen aynı şekilde, kullanıcının planı altında çalışır.
curl -X POST https://qrflow.codes/api/oauth/register -H "Content-Type: application/json" \
-d '{ "client_name": "Acme Menus", "redirect_uris": ["https://app.example.com/oauth/qrflow"], "token_endpoint_auth_method": "none" }'
# { "client_id": "dyn_…", "redirect_uris": [...], "grant_types": ["authorization_code","refresh_token"], … }
https://qrflow.codes/oauth/authorize?response_type=code&client_id=dyn_…&redirect_uri=https%3A%2F%2Fapp.example.com%2Foauth%2Fqrflow
&scope=profile%20codes%3Aread%20codes%3Awrite%20analytics%3Aread&state=…&code_challenge=…&code_challenge_method=S256
- Kapsamlar, API anahtarlarıyla aynı altı tanesidir. En az ihtiyacınız olanı isteyin; onay ekranı bunları listeler.
- Uygulamanız bir sohbet asistanı veya aracıysa, yetkilendirme isteğine resource=https://qrflow.codes/mcp ekleyin ve bunun yerine MCP sunucusuyla konuşun; token ona bağlanacaktır.
Zapier, Make, n8n: hiç kod yok
Ne zaman: Taramaların veya yeni kodların bir sayfaya, Slack kanalına veya CRM'e düşmesini istiyorsunuz.
- Bir yakalama kancası tetikleyicisi oluşturun (Zapier: Webhooks by Zapier › Catch Hook; Make: Custom webhook; n8n: Webhook node) ve https URL'sini kopyalayın.
- Hesap › Webhooks üzerinde bu URL'yi ekleyin ve olayları seçin. Test'e basın; ping araçta görünür ve ona yük şeklini verir.
- data.scans[] (tarama için) veya data.code (code.* için) alanlarını sayfanıza, mesajınıza veya kaydınıza eşleyin.
- Bu araçlardan kod oluşturmak için, HTTP modüllerini Authorization başlığıyla POST /codes karşısında kullanın. Anahtarı aracın kimlik bilgisi deposunda tutun.
- Bu araçlar imzayı doğrulayamaz. Size verdikleri URL tahmin edilemez, bu sizin sahip olduğunuz korumadır; onu hiçbir yere göndermeyin.
Vibe coding
Yapıştırılacak istemler
Kodlama asistanları, kurallar baştan söylendiğinde doğru şeyi oluşturur. Bu istemler kuralları taşır. Birini yapıştırın, köşeli parantezi doldurun ve asistan, bir satır yazmadan önce Markdown referansını okuyacaktır.
Uygulamama QR kodları ekle
Claude, ChatGPT, Cursor, Codex, Windsurf, Copilot Chat: sohbete yapıştırın
Add QR codes to this project using the QRFLOW.codes API.
Read https://qrflow.codes/llms-full.txt before writing code; it is the complete reference.
Rules:
- The API key is in the environment variable QRFLOW_KEY. It must only be used server-side (route handler, server action, edge function). Never expose it to the browser.
- Create dynamic codes: POST https://qrflow.codes/api/v1/codes with { "type": "url", "destination_data": { "url": ... }, "label": ... }.
- Save the returned code.id and code.short_url on my record. short_url is what gets printed or displayed.
- Show the image by proxying GET /codes/:id/image.svg through my server, or by encoding short_url with a QR library on the client.
- Handle errors from the JSON body: { "error", "message" }. Map 402 to "upgrade needed", 429 to a retry with the Retry-After header.
What I want: [describe the feature, e.g. "every event in my events table gets a QR code that opens its public page; show it on the event admin page with a download button"].
Deponuza QRFLOW hakkında bilgi verin
CLAUDE.md, AGENTS.md, .cursorrules veya .github/copilot-instructions.md dosyasına ekleyin
## QR codes (QRFLOW.codes)
- Docs: https://qrflow.codes/llms-full.txt (Markdown), https://qrflow.codes/api/v1/openapi.json (OpenAPI 3.1).
- Base URL https://qrflow.codes/api/v1, header Authorization: Bearer $QRFLOW_KEY. Server-side only.
- Codes are created with POST /codes { type: "url", destination_data: { url }, label }. Store code.id and code.short_url.
- Change the destination with PATCH /codes/:id { destination_data: { url } }. Never change slug/domain_id after printing.
- Image: GET /codes/:id/image.svg (needs the key). Prefer paused: true over DELETE when a print exists.
- Webhooks arrive as POST with X-QRFLOW-Signature (t=,v1=HMAC-SHA256 of "t.rawBody"); verify with the raw body.
Lovable, Bolt, v0, Replit ve diğer uygulama oluşturucularında
Size bir arka uç (Supabase, sunucusuz işlevler) veren ön uç odaklı oluşturucular
Integrate QRFLOW.codes QR codes. The API refuses browser calls, so create a backend function (Supabase Edge Function / serverless function) that holds the secret QRFLOW_KEY and calls POST https://qrflow.codes/api/v1/codes with { "type": "url", "destination_data": { "url": "<the page URL>" }, "label": "<name>" }. Return code.id and code.short_url to the UI and save them in the database. Render the QR in the UI by encoding short_url with a QR library; add a "Download for print" button that fetches /codes/:id/image.svg through the same backend function. Reference: https://qrflow.codes/llms-full.txt
Kodlarımı yöneten özel bir GPT
ChatGPT › GPT Oluştur › Eylemler
Import from URL: https://qrflow.codes/api/v1/openapi.json
Authentication: API Key › Bearer › paste a Business key with the scopes you want the GPT to have.
Then the GPT can list, create, re-point and report on your codes. For a no-setup version, add the MCP connector instead (Developer mode › Plugins › https://qrflow.codes/mcp).
Bağlayıcı açıldıktan sonra söylenecek şeyler
Claude, ChatGPT, QRFLOW MCP sunucusu bağlı Claude Code
"Make a QR code for https://example.com/fall-menu, call it Fall menu, frame caption 'Scan for menu'."
"Which of my codes got the most scans this month? Show a breakdown by country for the top one."
"Point the 'Lobby poster' code at https://example.com/events/october."
"Name the 'Business card' code's link 'hi' on my domain."
"Pause every code with 'Summer' in the label."
"Make 40 codes, one per table, going to https://example.com/order?table=1 through 40."
"Show me the PNG of the 'Front door' code."
MCP sunucusu
Claude, ChatGPT, Cursor ve Claude Code'dan kullanın
QRFLOW, https://qrflow.codes/mcp adresinde bir MCP sunucusudur. Bir kez bağlayın, oturum açın ve ardından "sonbahar menü sayfamız için, alan adımda menu adıyla bir QR kodu yap", "lobi posterinin kodunu yeni sayfaya yönlendir" veya "broşür geçen hafta ülkeye göre kaç tarama aldı?" gibi şeyler söyleyin. Asistan, bu API'nin sunduğu araçların aynısını, aynı kurallar altında alır ve kodlar, kaynak olarak mcp ile panonuza düşer.
Geliştirici değil misiniz? Her asistan için tam tıklamalarla sade dille anlatım Make QR codes with your AI assistant adresindedir.
Bağlan
Özelleştir › Bağlayıcılar › Özel bağlayıcı ekle › adresi yapıştırın veya QRFLOW'un dizin listesinde Bağlan'a basın. Claude bir QRFLOW oturum açma sayfası açar; İzin Ver'e basın. Her planda çalışır.
https://qrflow.codes/mcp
Ayarlar › Güvenlik ve oturum açma › Geliştirici modunu açın, ardından Ayarlar › Eklentiler › + › adresi yapıştırın; istendiğinde oturum açın. Plus, Pro, Team, Enterprise ve Edu.
https://qrflow.codes/mcp
Tek komut, ardından oturum açmak için /mcp. Oturum açmayı atlamak için bir Business anahtarını başlık olarak ekleyin.
claude mcp add --transport http qrflow https://qrflow.codes/mcp
# or, with a key:
claude mcp add --transport http qrflow https://qrflow.codes/mcp --header "Authorization: Bearer $QRFLOW_KEY"
Cursor, Windsurf, VS Code, herhangi bir MCP istemcisi
URL'ye bir HTTP sunucusu ekleyin. OAuth oturum açma tarayıcıda gerçekleşir; veya bir anahtarla Authorization başlığı iletin.
{
"mcpServers": {
"qrflow": { "type": "http", "url": "https://qrflow.codes/mcp" }
}
}
Kendi aracınız (Anthropic veya OpenAI SDK)
MCP bağlayıcısını veya aracını, taşıyıcı olarak bir Business anahtarıyla URL'ye yönlendirin; tarayıcı akışı gerekmez.
// Anthropic Messages API, MCP connector
mcp_servers: [{ type: "url", url: "https://qrflow.codes/mcp", name: "qrflow", authorization_token: process.env.QRFLOW_KEY }]
Asistanın yapabilecekleri
| Araç | Ne yapar | Kapsam |
|---|---|---|
| list_code_kinds | Her kod türü, alanları ve gerektirdiği plan. Asistan, alışılmadık bir şey oluşturmadan önce bunu çağırır. | profile |
| list_domains | Bağlantı alan adlarınız, varsayılan ve kimlikleri. | domains:read |
| get_qr_image | Asistanın gösterebileceği veya kaydedebileceği bir PNG ve baskı için SVG URL'si. | codes:read |
| get_account | Kimin oturum açtığı, plan, limitler. | profile |
Nasıl güvende kalır
- Asistan yalnızca sizin hesabınız için, siz bir QRFLOW sayfasında İzin Ver'e bastıktan sonra verilen bir token tutar. Hesap › Bağlı uygulamalar üzerinden istediğiniz zaman bağlantısını kesin.
- Tokenlar MCP sunucusuna bağlıdır; REST API'ye karşı yeniden oynatılamaz.
- Her yazma işlemi, panoyla aynı doğrulamadan geçer: izin listesindeki hedefler, plan kontrolleri, adil kullanım tavanları.
- Yıkıcı araçlar kendilerini dikkatli tanımlar:
delete_qr_code, bir baskı mevcut olduğunda duraklatmayı tercih etmesi için modele söyler. - Keşif belgeleri
/.well-known/oauth-authorization-serverve/.well-known/oauth-protected-resourceadreslerinde yaşar; kayıt RFC 7591'dir; yalnızca PKCE S256.
SDK'lar ve OpenAPI belirtimi
- TypeScript / JavaScript:
npm install qrflow(npm). Sıfır bağımlılık, ESM ve CommonJS, tam tipler; Node 18+, Bun, Deno ve Workers'ta çalışır. 429'ları sizin için yeniden dener veverifyWebhook/parseWebhookile birlikte gelir. - Python 3.9+, yalnızca standart kitaplık: qrflow.py.
- OpenAPI 3.1: /api/v1/openapi.json. Postman veya Insomnia'ya içe aktarın, herhangi bir dilde bir istemci oluşturun veya bir ChatGPT Eylemine ekleyin.
- Her iki istemci de yazılmış bir hata fırlatır (
QRFlowErrorilestatus,code,message,retryAfter) ve bir webhook doğrulayıcı gönderir. Tek dosyalık TypeScript kaynağı, satıcı olarak kullanmayı tercih ederseniz hâlâ /sdk/qrflow.ts adresindedir.
| TypeScript | Python | Çağrılar |
|---|---|---|
| me() | me() | GET /me |
| catalog() | catalog() | GET /catalog |
| listCodes({ limit, q }) | list_codes(limit, q) | GET /codes |
| getCode(id) | get_code(id) | GET /codes/:id |
| createCode(input) | create_code(**fields) | POST /codes |
| updateCode(id, patch) | update_code(id, **patch) | PATCH /codes/:id |
| deleteCode(id) | delete_code(id) | DELETE /codes/:id |
| makeDynamic(id) | make_dynamic(id) | POST /codes/:id/dynamic |
| scans(id, { from, to, group }) | scans(id, from_, to, group) | GET /codes/:id/scans |
| bulkCreate(rows, colors) | bulk_create(rows, **colors) | POST /codes/bulk |
| domains() | domains() | GET /domains |
| listWebhooks() / createWebhook() / testWebhook(id) / deleteWebhook(id) | list_webhooks() / create_webhook() / test_webhook(id) / delete_webhook(id) | /webhooks |
| imageUrl(id, size) | image_url(id, size) | Görsel adresi (anahtarla getirin) |
| verifyWebhook(raw, header, secret) | verify_webhook(raw, header, secret) | Teslimatlar için imza kontrolü |
Uç nokta referansı
Base URL https://qrflow.codes/api/v1. Gövdeler ve yanıtlar JSON'dur. Tarihler UTC cinsinden ISO 8601'dir. PATCH'te yalnızca değişen alanları gönderin.
GETprofile
Bu hesaba uygulanan plan, özellik bayrakları ve limitler ile anahtarın kapsamları.
curl https://qrflow.codes/api/v1/me \
-H "Authorization: Bearer $QRFLOW_KEY"
{ "id": "…", "email": "ops@example.com", "plan": "business", "paid": true,
"features": { "dynamic_codes": true, "custom_domain": true, "link_names": true, "gs1": true, "api_keys": true },
"limits": { "saved_codes": 25000, "bulk_per_month": 10000, "bulk_per_request": 2000, "link_domains": 5, "requests_per_minute": 600 },
"auth": "api_key", "scopes": ["codes:read", "codes:write"] }
GETpublic
Yerel türler (url, wifi, vcard, email, phone, sms, text, location) ve 50'yi aşkın alt tür (Instagram, Google yorumu, Wi-Fi, uygulama mağazası…), her biri ihtiyaç duyduğu alanlar ve gerektirdiği planla birlikte. Anahtar gerekmez.
curl https://qrflow.codes/api/v1/catalog
GETcodes:read
En yeniler önce.?limit= 100'e kadar,?q= etiketleri arar.
curl "https://qrflow.codes/api/v1/codes?limit=20&q=menu" \
-H "Authorization: Bearer $QRFLOW_KEY"
POSTcodes:write
Sitedeki Kaydet ile aynı kurallar: url, phone, email, sms ve location kodları ücretli planlarda dinamiktir; Wi-Fi, vCard ve text içeriklerini desende taşır. Örneğin bir Google yorumu kodu yapmak için destination_data.subtype içine bir alt tür kimliği koyun. İsteğe bağlı domain_id, kodun hangi bağlantı alan adınla basılacağını seçer (GET /domains bunları listeler).
curl -X POST https://qrflow.codes/api/v1/codes \
-H "Authorization: Bearer $QRFLOW_KEY" \
-H "Content-Type: application/json" \
-d '{ "type": "url", "destination_data": { "url": "https://example.com/menu" }, "label": "Table tents", "frame_style": "caption-below", "frame_caption": "Scan for menu" }'
{ "code": { "id": "…", "label": "Table tents", "kind": "url", "dynamic": true, "short_code": "x7k2p9a",
"short_url": "https://go.example.com/x7k2p9a", "scans": 0, "image_url": "https://qrflow.codes/api/v1/codes/…/image.svg", … } }
GETcodes:read
Tarama sayısı, kısa bağlantısı ve görsel adresiyle birlikte kod.
curl https://qrflow.codes/api/v1/codes/$ID \
-H "Authorization: Bearer $QRFLOW_KEY"
PATCHcodes:write
Şunlardan herhangi biri: destination_data (yalnızca dinamik kodlar, baskı geçerli kalır), label, paused, expires_at (ISO veya null), slug (alan adında bir bağlantı adı), domain_id (bu kodun hangi bağlantı alan adınla basılacağı; null = hesap varsayılanı), fg_color, bg_color, frame_style, frame_caption, frame_caption2. Yalnızca değiştirdiğiniz alanları gönderin.
curl -X PATCH https://qrflow.codes/api/v1/codes/$ID \
-H "Authorization: Bearer $QRFLOW_KEY" \
-H "Content-Type: application/json" \
-d '{ "destination_data": { "url": "https://example.com/menu-fall" }, "slug": "menu" }'
DELETEcodes:write
Tamamen silinir, tarama geçmişi dahil. Dinamik bir kodun basılı bağlantısı çözümlenmeyi durdurur. Baskı hâlâ ortalıktaysa paused: true'yu tercih edin.
curl -X DELETE https://qrflow.codes/api/v1/codes/$ID \
-H "Authorization: Bearer $QRFLOW_KEY"
204 No Content
POSTcodes:write
Basılı desen değişir (artık kısa bağlantıyı kodlar), bu yüzden sonrasında görseli yeniden oluşturun.
curl -X POST https://qrflow.codes/api/v1/codes/$ID/dynamic \
-H "Authorization: Bearer $QRFLOW_KEY"
GETcodes:read
Çerçeve ve renklerle baskıya hazır SVG.?size= modül ızgara genişliğini piksel cinsinden ayarlar; dosya yine de kayıpsız ölçeklenir.
curl https://qrflow.codes/api/v1/codes/$ID/image.svg \
-H "Authorization: Bearer $QRFLOW_KEY" -o code.svg
GETanalytics:read
?from= ve?to= (ISO tarihleri, en fazla 92 gün, varsayılan son 30 gün) ve?group= day, device, country, city, browser, os veya referrer. Analiz sayfasıyla aynı sayılar.
curl "https://qrflow.codes/api/v1/codes/$ID/scans?from=2026-09-01&to=2026-09-21&group=day" \
-H "Authorization: Bearer $QRFLOW_KEY"
{ "code_id": "…", "from": "…", "to": "…", "group": "day", "total": 412,
"rows": [ { "key": "2026-09-01", "scans": 18 }, { "key": "2026-09-02", "scans": 25 }, … ] }
POSTcodes:write
Tek çağrıda 2.000'e kadar URL kodu, hepsi dinamik. Toplu sayfasıyla aynı aylık toplu kotaya tabidir (Business'ta 10.000). Web adresi olmayan satırlar rejected içinde döner; geri kalanı oluşturulur.
curl -X POST https://qrflow.codes/api/v1/codes/bulk \
-H "Authorization: Bearer $QRFLOW_KEY" \
-H "Content-Type: application/json" \
-d '{ "rows": [ { "destination": "https://example.com/t/1", "label": "Table 1" }, { "destination": "https://example.com/t/2", "label": "Table 2" } ] }'
{ "codes": [ … ], "rejected": [], "remaining_this_month": 9998 }
GETdomains:read
Bağlı alan adlarınız, durumları ve dinamik kodların varsayılan olarak hangisiyle basıldığı (default_base). Bir kodda domain_id olarak bir alan adının kimliğini iletirseniz, o kod farklı bir alan adıyla basılır.
curl https://qrflow.codes/api/v1/domains \
-H "Authorization: Bearer $QRFLOW_KEY"
GETwebhooks:manage
Olayları, son durumu ve hata sayısıyla birlikte webhook'larınız.
curl https://qrflow.codes/api/v1/webhooks \
-H "Authorization: Bearer $QRFLOW_KEY"
POSTwebhooks:manage
url, genel bir sunucuda https olmalıdır; events, scan, code.created, code.updated, code.deleted'den herhangi biri olabilir. İmzalama sırrı yalnızca bir kez döndürülür.
curl -X POST https://qrflow.codes/api/v1/webhooks \
-H "Authorization: Bearer $QRFLOW_KEY" \
-H "Content-Type: application/json" \
-d '{ "url": "https://example.com/hooks/qrflow", "events": ["scan", "code.updated"] }'
{ "webhook": { "id": "…", "url": "…", "events": ["scan", "code.updated"], "active": true, "secret": "whsec_…" } }
POSTwebhooks:manage
Şimdi imzalı bir ping gönderir ve yanıtı bildirir.
curl -X POST https://qrflow.codes/api/v1/webhooks/$WEBHOOK_ID \
-H "Authorization: Bearer $QRFLOW_KEY"
DELETEwebhooks:manage
Kuyruktaki yeniden denemeler dahil tüm teslimatları durdurur.
curl -X DELETE https://qrflow.codes/api/v1/webhooks/$WEBHOOK_ID \
-H "Authorization: Bearer $QRFLOW_KEY"
204 No Content
GETpublic
Çerçeve kimlikleri ve her birinin neye ihtiyaç duyduğu (altyazı, ikinci satır), özelleştirici gibi gruplandırılmıştır. Anahtar gerekmez.
curl https://qrflow.codes/api/v1/frames
Kod nesnesi
Bir koda dokunan her uç nokta aynı şekli döndürür. Bilmediğiniz alanları yok sayın; zamanla yenileri eklenir.
| Alan | Tür | Anlam |
|---|---|---|
| id | uuid | Kararlı kimlik. Diğer tüm çağrılarda bunu kullanın. |
| label | string | null | Panodaki ad. En fazla 120 karakter. ?q= ile aranabilir. |
| kind | string | Katalog kimliği: url, wifi, instagram, googlereview,... kind_label insan tarafından okunabilir addır. |
| type | string | Kodlama: url, text, wifi, vcard, email, phone, sms, location. |
| destination_data | object | Gönderdiğiniz alanlar (türler için alt tür dahil). destination bunun tek satırlık bir özetidir. |
| dynamic | boolean | Taramalar QRFLOW üzerinden geçtiğinde ve hedef değişebildiğinde doğrudur. dynamic_capable, bu türün ücretli bir planda dinamik olup olamayacağını söyler. |
| short_code | string | Yedi karakter, asla değişmez. |
| short_url | string | Dinamik bir kod için basılacak şey. Ayarlandığında alan adınızı ve slug'ı içerir. |
| domain_id | uuid | null | Bu kodun hangi bağlantı alan adıyla basıldığı; null, hesap varsayılanı anlamına gelir. |
| fg_color, bg_color | hex | Modül ve arka plan renkleri. |
| has_logo | boolean | Panoya bir logo eklendi; image.svg bunu içerir. |
| frame_style, frame_caption, frame_caption2 | string | null | Özelleştiricideki gibi çerçeve kimliği ve altyazılar. |
| scans | integer | Ömür boyu tarama sayısı. |
| created_at, updated_at | ISO 8601 | UTC. |
| manage_url | url | 'QRFLOW'da Aç' bağlantısı için kodun panodaki sayfası. |
| image_url | url | GET /codes/:id/image.svg. Authorization başlığı gerektirir; herkese açık bir görsel URL'si değildir. |
| svg_download_url, png_download_url | url | Aynı SVG (çerçeve, renkler, logo) ve başlık gerektirmeyen, 24 saat geçerli imzalı bağlantılar aracılığıyla düz bir PNG: <img> etiketleri, betikler ve dosya kaydeden asistanlar için. download_expires_at ne zaman sona ereceklerini söyler; kodun herhangi bir okunması yenilerini döndürür. |
Diğer şekiller: Scans (code_id, from, to, group, total, rows[key, scans]), Domain (id, host, status, active, is_default, verified_at, grace_until), Webhook (id, url, events, active, last_status, last_delivery_at, consecutive_failures, artı bir kez secret), Me (id, email, plan, paid, features, limits, auth, scopes) ve Error (error, message). OpenAPI belgesi her özelliği türleriyle birlikte içerir.
Business
Webhooks
Bir şey olduğunda QRFLOW, https URL'nizi çağırır. Hesap › Webhooks üzerinden veya POST /webhooks ile bir tane oluşturun; imzalama sırrını bir kez alırsınız. Hesap başına en fazla 10.
| Olay | Ne zaman | veri |
|---|---|---|
| scan | Toplu: her birkaç dakikada bir, son teslimattan bu yana tüm yeni taramalar, çağrı başına en fazla 500. | count, from, to, scans[] ile code_id, label, short_code, slug, scanned_at, device, country, city, referrer, browser, os, language |
| code.created | API ve asistanlardan anında; panodan dakikalar içinde. Toplu bir istek, bulk: true ve codes[] ile tek bir olay gönderir. | code, source |
| code.updated | Aynı zamanlama. Hedef, etiket, duraklatma, süre sonu, bağlantı adı, alan adı, renkler, çerçeve ve dinamik dönüşümü kapsar. | code, changed[] (değişen alan adları) |
| code.deleted | Aynı zamanlama. | code: { id, label, short_code, slug } |
| ping | Test'e bastığınızda. | webhook_id, message |
Ne gelir
Her yük { id, event, created_at, data }'dir. id, tek bir teslimatın yeniden denemeleri arasında sabittir, böylece onunla yinelenenleri ayıklayabilirsiniz.
{
"id": "9b1c6d2e-…",
"event": "scan",
"created_at": "2026-09-21T18:05:00.000Z",
"data": {
"count": 2,
"from": "2026-09-21T18:00:00.000Z",
"to": "2026-09-21T18:04:12.331Z",
"scans": [
{ "code_id": "…", "label": "Table tents", "short_code": "x7k2p9a", "slug": "menu", "scanned_at": "2026-09-21T18:03:40.101Z",
"device": "mobile", "country": "US", "city": "Las Vegas", "referrer": null, "browser": "Safari", "os": "iOS", "language": "en-US" },
{ "code_id": "…", "label": "Table tents", "short_code": "x7k2p9a", "slug": "menu", "scanned_at": "2026-09-21T18:04:12.331Z",
"device": "mobile", "country": "MX", "city": "Tijuana", "referrer": null, "browser": "Chrome", "os": "Android", "language": "es-MX" }
]
}
}
{
"id": "2f0a…",
"event": "code.updated",
"created_at": "2026-09-21T18:06:00.000Z",
"data": {
"code": { "id": "…", "label": "Table tents", "kind": "url", "dynamic": true, "short_url": "https://go.example.com/menu", "scans": 412, "…": "…" },
"changed": ["destination_data"]
}
}
POST /your/endpoint HTTP/1.1
Content-Type: application/json
User-Agent: QRFLOW-Webhooks/1.0 (+https://qrflow.codes/developers)
X-QRFLOW-Event: scan
X-QRFLOW-Signature: t=1758477900,v1=5f1c…e9
İmzayı doğrulayın
X-QRFLOW-Signature: t=<unix seconds>,v1=<hex>. Sırrınızla ${t}.${rawBody} üzerinde HMAC-SHA256 hesaplayın ve sabit zamanda v1 ile karşılaştırın; t beş dakikadan eskiyse reddedin. Aldığınız ham baytları kullanın, asla yeniden serileştirilmiş bir nesneyi kullanmayın. Next.js ve Python için çalışan alıcılar tariflerde ve her iki SDK da yardımcıyı içerir.
Teslimat kuralları
- 8 saniye içinde herhangi bir 2xx yanıtı verin. İşi yanıtladıktan sonra yapın.
- Diğer her şey 1, 5, 15, 60, 240 ve 720 dakika sonra yeniden denenir.
- Yirmi ardışık hata webhook'u kapatır ve hesap sahibine e-posta gönderir. Alıcı düzeltildiğinde tekrar açın; kuyruktaki yeniden denemeler devam eder.
- URL'ler genel bir sunucuda https olmalıdır. localhost, özel aralıklar ve qrflow.codes'un kendisi reddedilir. Geliştirme sırasında bir tünel kullanın.
- İmzalı bir
pingalmak ve sunucunuzun yanıtladığı durumu görmek için Test'e basın.
Hatalar
Her hata, aşağıdaki durumla birlikte { "error": "<code>", "message": "<what to do>" }'tür. Mesaj bir kişi için yazılmıştır; onu gösterin.
| Durum | error | Anlam |
|---|
Belirti, neden, çözüm
Sorun giderme
Her çağrıda 401 invalid_token
NedenBaşlık yanlış veya anahtar etkin değil.
ÇözümTam olarak Authorization: Bearer qrf_live_… gönderin (iki nokta üst üste değil, bir boşluk). Anahtarın Hesap › API anahtarları üzerinden iptal edilmediğini kontrol edin. Bir sohbetten veya belgeden kopyaladıysanız, sondaki noktaya veya akıllı tırnak işaretine dikkat edin.
MCP sunucusunda çalışan bir belirteçle /api/v1'de 401
Nedenhttps://qrflow.codes/mcp için üretilen belirteçler ona bağlıdır.
ÇözümREST için bir API anahtarı kullanın veya REST API için bir belirteç almak üzere resource= olmadan ikinci bir OAuth akışı çalıştırın.
Anahtar veya webhook oluştururken 402 upgrade_required
NedenHer ikisi de Business özellikleridir.
Çözüm/pricing üzerinden yükseltin veya oturum açma yoluyla her planda çalışan MCP sunucusunu kullanın.
Bir OAuth uygulamasından POST /codes'ta 402
NedenKullanıcının planı, uygulamanın istediğini (dinamik bir kod, bir alan adı) içermiyor.
ÇözümÖnce GET /me features'ı okuyun ve uyarlayın: kodu yine de oluşturun (Free'de statik olacaktır) veya kullanıcıya planın neye ihtiyacı olduğunu söyleyin.
403 insufficient_scope
NedenKapsamlar bir anahtar oluşturulduğunda sabitlenir.
Çözümİhtiyacınız olan kapsamlarla yeni bir anahtar oluşturun ve eskisini iptal edin. OAuth için, yetkilendirme isteğinde kapsamı isteyin.
destination_data'yı PATCH'lerken 400 not_dynamic
NedenKod statik: Free'de oluşturulmuş veya Wi-Fi/vCard/text türünde.
ÇözümÜcretli bir plandaki url/phone/email/sms/location için POST /codes/:id/dynamic yapın, ardından yeniden indirin ve yeniden yazdırın (resim değişir). Wi-Fi, vCard ve text asla dinamik olamaz; bunun yerine bir sayfa açan bir url kodu oluşturun.
slug ayarlarken 400 no_domain
NedenBağlantı adları alan adınızda yaşar.
ÇözümÖnce Hesap sayfasında bir alan adı bağlayın ve doğrulayın. qrflow.codes/q üzerinde yol her zaman short_code'dur.
slug üzerinde 409 conflict
NedenBaşka bir kodunuz o ada sahip.
ÇözümOnu bulmak için GET /codes?q= kullanın veya başka bir ad seçin. Adlar hesaba özeldir, genel değildir.
Tarayıcı konsolunda CORS hatası
NedenAPI yalnızca sunucudan sunucuya çağrıları (ve Canva'yı) kabul eder. Bu kasıtlıdır: bir web sayfasındaki anahtar, sızdırılmış bir anahtardır.
ÇözümÇağrıyı bir rota işleyicisine, sunucu eylemine, edge fonksiyonuna veya backend'e taşıyın ve sayfadan onu çağırın.
Görsel bir QRFLOW filigranı gösteriyor
NedenHesap Free planında.
ÇözümÜcretli planlar onu kaldırır. Free, sitenin kendi üreticisi içindir.
Alan adımı ekledikten sonra short_url hâlâ qrflow.codes/q/… diyor
NedenAlan adı henüz doğrulanmadı veya CNAME'i yanlış.
ÇözümHesap sayfasındaki durumu veya GET /domains'i kontrol edin (durum doğrulanmış olmalıdır). Doğrulandığında mevcut kodlar otomatik olarak geçer.
image_url bir <img> etiketinde 401 veriyor
NedenAuthorization başlığı gerektirir ve bir <img> bunu gönderemez.
ÇözümAynı Kod nesnesinden svg_download_url veya png_download_url kullanın: başlık olmadan 24 saat çalışan imzalı bağlantılar. Kalıcı bir şey için image_url'yi sunucunuz üzerinden proxy'leyin (Next.js tarifine bakın) veya short_url'yi kendiniz kodlayın.
SVG değil PNG'ye ihtiyacım var
NedenSVG çerçeveyi ve logoyu taşır; PNG düz koddur.
ÇözümGET /codes/:id/image.png (bearer veya imzalı png_download_url) 256 ila 2048 piksel arasında bir PNG döndürür. Çerçeveli bir PNG için SVG'yi sharp veya resvg ile dönüştürün (sharp(svgBuffer).png().toBuffer()).
Asistanım görsel uç noktasının reddettiğini söyledi ve kodu kendisi çizdi
NedenBearer gerektiren image_url'yi getirdi.
ÇözümArtık her kod png_download_url ve svg_download_url taşıyor ve get_qr_image bunları döndürüyor; asistan bunları oturum açmadan curl ile alabilir. Aynı short_url'yi kodlayan yerel olarak çizilmiş bir kod yine de çalışır ve taramaları sayar, ancak çerçeve ve logodan yoksundur.
Webhook asla gelmiyor
NedenURL kuralları veya alıcı.
ÇözümURL, genel bir sunucuda https olmalıdır (localhost yok, özel IP yok, qrflow.codes yok). Webhook'ta Test'e basın: sonuç, sunucunuzun yanıtladığı durumu gösterir. Tarama olayları topludur ve yaklaşık beş dakika sürebilir; panodan gelen code.* olayları da birkaç dakika kuyruğa alınırken, API ve MCP yazımları anında teslim edilir.
İmza asla doğrulanmıyor
NedenYeniden serileştirilmiş bir gövdeyi imzaladınız.
FixVerify'i, JSON ayrıştırmadan önce aldığınız tam ham baytlara karşı yapın. Express'te bu rotada express.raw({ type: 'application/json' }) kullanın; Next.js App Router'da await req.text() kullanın; Flask'ta request.get_data() kullanın. Ardından ${t}.${raw}\ değerinin HMAC-SHA256'sını hesaplayın.
Webhook kendini kapattı
NedenArka arkaya yirmi başarısız deneme.
ÇözümAlıcıyı düzeltin, ardından tekrar etkinleştirin (Hesap › Webhook'lar veya silip yeniden oluşturun). Bu olduğunda size e-posta gönderildi. Kuyruktaki yeniden denemeler devam eder.
Yinelenen webhook teslimatları
NedenYavaş bir 2xx (8 saniyeden uzun) başarısızlık sayılır ve yeniden denenir.
ÇözümÖnce yanıt verin, sonra işleyin. Yeniden denemelerde sabit olan yükün id alanında yinelemeyi önleyin.
İçe aktarma sırasında 429 rate_limited
NedenDakikada anahtar başına 600 istek.
ÇözümHer kod için tek tek POST yerine POST /codes/bulk (tek istekte 2.000 kod) kullanın veya Retry-After saniyesi kadar bekleyin.
Bir kodu sildim ve basılı poster artık 'Code not found' gösteriyor
NedenSilme kalıcıdır ve bağlantıyı öldürür.
ÇözümGeri almak yok. Bir dahaki sefere PATCH { paused: true } kullanın; duraklatılmış bir kod dostça bir sayfa gösterir ve devam ettirilebilir.
Planımı düşürdükten sonra anahtarım çalışmayı bıraktı
NedenAnahtarlar Business'tan ayrıldıktan sonra 30 gün çalışmaya devam eder, ardından 402 yanıtı verir.
ÇözümYeniden abone olun; hiçbir şey silinmedi ve aynı anahtarlar yeniden çalışır.
Listede olmayan bir şey mi var? Aldığınız tam istek ve JSON hatasıyla birlikte hello@qrflow.codes adresine yazın. Business hesapları önceliklidir.
Limitler ve adil kullanım
| Limit | |
|---|---|
| Dakikada anahtar başına istek | 600. Bunun ötesinde 429 ve Retry-After. |
| Hesap başına anahtar | 10 |
| Hesap başına webhook | 10 |
| Kayıtlı kodlar (adil kullanım) | 1.000 Premium, 25.000 Business; API bunun iki katında durur. |
| Toplu | Premium'da ayda 500 (istek başına 500); Business'ta ayda 10.000 (istek başına 2.000). |
| Bağlantı alan adları | 1 Premium, 5 Business |
| Taramalar | Sınırsız. Premium'da kod başına ayda 100.000 taramada, Business'ta 1.000.000'da bir kontrol e-postası; hiçbir şey kısıtlanmaz. |
| Tarama analiz penceresi | İstek başına 92 gün |
| Liste sayfa boyutu | 100 (?limit=) |
| Etiket / başlık / kısa ad | 120 / 60 / 40 karakter |
| Webhook zaman aşımı ve yeniden denemeler | 8 saniye; 1, 5, 15, 60, 240 ve 720 dakika sonra yeniden dener; 20 ardışık başarısızlıktan sonra kapanır. |
| Business'tan ayrıldıktan sonra | Anahtarlar ve webhook'lar 30 gün çalışmaya devam eder, ardından 402. Hiçbir şey silinmez. |
Adil kullanım, planın fiyatlandırıldığı şeydir. Sayıda hiçbir şey kısıtlanmaz; API bunun iki katında durur ve önce bir kişi size e-posta gönderir. Daha yüksek hacimler: hello@qrflow.codes.
Sizin ve tarayan kişiler için güvenlik
QRFLOW hesabınızı nasıl korur
- Anahtarlar yalnızca bir kez gösterilir ve SHA-256 karmaları olarak saklanır. QRFLOW'da hiç kimse bir anahtarı geri okuyamaz; kaybederseniz yenisini oluşturun.
- Her istek, anahtarın ait olduğu hesapla sınırlıdır. Başka bir hesaptan gelen bir kod kimliği 404'tür, asla bir sızıntı değildir.
- Kapsamlar anahtar başına sabittir; bu nedenle bir raporlama paneli için olan anahtar kod oluşturamaz veya silemez.
- Dakikada anahtar başına 600 istek; bunun üzeri herkes için yavaşlama değil, temiz bir 429'dur.
- Hedefler beyaz listeye alınmıştır: http, https, mailto, tel, sms, geo ve kısa bir uygulama şemaları listesi (whatsapp, tg, signal, spotify, uygulama mağazaları). javascript:, data: ve file: oluşturma sırasında reddedilir; böylece güvenliği ihlal edilmiş bir entegrasyon kodlarınızı bir saldırıya dönüştüremez.
- Webhook URL'leri genel ana bilgisayarlarda https olmalıdır; QRFLOW asla özel ağları veya kendisini çağırmaz. Her teslimat imzalanır ve her yükün sabit bir kimliği vardır.
- OAuth istemcileri PKCE S256 ile kaydolur ve belirteçler verildikleri sunucuya bağlanır; MCP sunucusu için bir belirteç REST API'sinde yeniden kullanılamaz.
- Herkes Hesap sayfasında bir anahtarı iptal edebilir veya bir uygulamanın bağlantısını kesebilir; etkisi anında olur.
Kendi tarafınızda yapmanız gerekenler
- Ortam değişkenleri, asla kaynak kod değil. Bir anahtar git geçmişine girerse, onu iptal edin.
- Yalnızca sunucu tarafı. API tarayıcı kaynaklarını reddeder, ancak onu saran kendi uç noktalarınızın da kimlik doğrulamasına ihtiyacı vardır; aksi takdirde herkes sizin faturanıza kod oluşturabilir.
- Her entegrasyona, ihtiyaç duyduğu kapsamlarla, entegrasyonun adıyla anılan kendi anahtarını verin. Birini iptal etmek yalnızca bir şeyi etkiler.
- Webhook imzalarını doğrulayın ve beş dakikadan eski zaman damgalarını reddedin.
- Kullanıcılarınızın verileri etiketlere veya hedeflere giriyorsa, QRFLOW'un bunları sakladığını unutmayın; mümkünse kişisel verileri etiketlerden uzak tutun.
Taramalar ne kaydeder ve ne kaydetmez
- Her yönlendirme, istekten türetilen cihaz türü, ülke, şehir, yönlendiren, tarayıcı, işletim sistemi ve dili ve kod + gün + IP + kullanıcı aracısının tek yönlü karmasını saklar; böylece sahip benzersiz ziyaretçileri sayabilir. Karma bir adrese geri dönüştürülemez.
- Tarayan kişiye çerez yerleştirilmez ve IP adresinin kendisi taramayla birlikte tutulmaz. Bilinen botlar ve bağlantı önizleme tarayıcıları atlanır.
- Bir kodu silmek, taramalarını da siler. Hesabı silmek her şeyi siler.
- Tam metin: https://qrflow.codes/privacy ve https://qrflow.codes/terms.
Sürüm oluşturma ve kararlılık
API, yolda sürümlenir: /api/v1. v1 içinde alanlar, uç noktalar, türler ve olaylar ekleriz; hiçbir şeyi kaldırmayız veya yeniden adlandırmayız ve yanıtlardaki bilinmeyen alanlar kodunuz tarafından yok sayılmalıdır.
Bir değişiklik v1'i bozmak zorunda kalırsa, /api/v2 olarak yayınlanır ve v1 en az on iki ay çalışmaya devam eder. Anahtar sahiplerine kullanımdan kaldırmalar hakkında 90 gün önceden e-posta gönderilir.
MCP sunucusu, araçları için aynı kuralı izler: bağımsız değişkenler yalnızca eklenir ve her araç adını korur.
/api/v1/openapi.json adresindeki OpenAPI belgesi ve /llms-full.txt adresindeki Markdown, API'ye hizmet veren koddan üretilir; bu nedenle bugün canlı olanı tanımlarlar.
Geliştiricilerin sorduğu sorular
QRFLOW API'sini kullanmak için ödeme yapmam gerekiyor mu?
API anahtarları Business planıyla birlikte gelir, ayda 29 $, aydan aya. MCP sunucusu (Claude, ChatGPT, Cursor, Claude Code) ve kendi uygulamanız için OAuth, oturum açma yoluyla her planda çalışır ve oluşturabilecekleri şey planı izler. GET /catalog, GET /frames ve /preview.svg hiç anahtar gerektirmez.
API aracılığıyla ücretsiz QR kodu oluşturabilir miyim?
Anahtarla değil. Düz statik bir görüntü için qrflow.codes adresindeki ücretsiz oluşturucu veya herhangi bir açık kaynak QR kitaplığı işi görür. API, dinamik kodlar, kendi alan adınız, analizler, toplu işlemler ve webhook'lar içindir; bunlar ücretli bir hesabın sahip olduğu şeylerdir.
API'yi tarayıcıdan çağırabilir miyim?
Hayır. Bir anahtarın asla bir web sayfasına girememesi için tarayıcı kaynaklarını reddeder. Bir rota işleyicisinden, sunucu eyleminden, uç işlevden veya arka uçtan çağırın ve sayfanızdan onu çağırın.
Hangi görüntü biçimlerini alırım?
Renkleriniz, çerçeveniz, başlıklarınız ve logonuzla SVG (GET /codes/:id/image.svg, 256 ila 4096 px nominal) ve düz PNG (GET /codes/:id/image.png, 256 ila 2048 px). Her ikisi de bir taşıyıcı veya her Code nesnesinin taşıdığı, 24 saat boyunca başlık olmadan çalışan imzalı svg_download_url / png_download_url alır. MCP aracı get_qr_image, PNG'yi satır içi artı her iki bağlantıyı döndürür.
QR kodunu bastıktan sonra değiştirebilir miyim?
Evet, dinamikse (ücretli planda url, phone, email, sms, location). Yeni bir destination_data ile PATCH /codes/:id; resim değişmez, sonraki tarama yeni yere gider. Wi-Fi, vCard ve metin kodları içeriklerini resimde taşır ve değiştirilemez.
short_url ile hedef arasındaki fark nedir?
short_url, resmin içindeki bağlantıdır (go.example.com/menu). Hedef, bu bağlantının yönlendirdiği yerdir (https://example.com/menu-fall). short_url'yi bir kez basarsınız ve hedefi istediğiniz sıklıkta değiştirirsiniz.
Kodlar kendi alan adımı kullanabilir mi?
Evet. Premium 1 alan adı bağlar, Business 5; bir CNAME eklersiniz ve Hesap sayfasında doğrularsınız. Business, domain_id ile kod başına bir alan adı seçer. Bağlantı adları (slug) üzerinde okunabilir yollar oluşturur.
Tarama, tarayan kişi hakkında ne kaydeder?
Cihaz türü, ülke, şehir, yönlendiren, tarayıcı, işletim sistemi ve dil, istekten ve benzersiz ziyaretçi sayıları için tek yönlü günlük karma. Çerez yok ve IP adresi saklanmaz. Bir grafik için yeterli, kimseyi tanımlamak için yeterli değil. Ayrıntılar: https://qrflow.codes/privacy#scans
npm veya PyPI paketi var mı?
npm: npm install qrflow\ (https://www.npmjs.com/package/qrflow), sıfır bağımlılık, ESM ve CommonJS, tam TypeScript türleri, Node 18+, Bun, Deno ve Workers'ta çalışır; her uç noktayı sarar, 429'ları yeniden dener ve verifyWebhook/parseWebhook içerir. Python: https://qrflow.codes/sdk/qrflow.py adresinde tek dosyalık bir istemci (yalnızca standart kitaplık) verify_webhook ile; bir PyPI paketi yakında gelecek.
Claude, ChatGPT, Cursor ve Claude Code ile çalışıyor mu?
Evet. QRFLOW, https://qrflow.codes/mcp. adresinde bir MCP sunucusudur. Bağlayıcı olarak ekleyin, bir kez oturum açın ve düz kelimelerle sorun. On bir araç oluşturma, düzenleme, duraklatma, adlandırma, toplu işlem, analiz, görüntü ve alan adlarını kapsar.
Kendi kullanıcılarım QRFLOW hesaplarını uygulamama bağlayabilir mi?
Evet, OAuth 2.0 ile. /api/oauth/register adresinde bir istemci kaydedin (hesap gerekmez), kullanıcıları PKCE ile /oauth/authorize adresine gönderin ve API'yi belirteçleriyle çağırın. Kodlar, planları kapsamında hesaplarına düşer.
Webhook'ları localhost'ta nasıl test ederim?
Geliştirme sunucunuzu bir tünelle (cloudflared veya ngrok) açığa çıkarın ve https adresini webhook URL'si olarak kullanın, ardından imzalı bir ping almak için Hesap › Webhook'lar'da Test'e basın. Webhook URL'leri genel https olmalıdır; localhost ve özel adresler reddedilir.
Business'ı iptal edersem entegrasyonuma ne olur?
Anahtarlar ve webhook'lar 30 gün çalışmaya devam eder, ardından 402 yanıtı verir. Kodlar, taramalar ve alan adları hesapta kalır. Yeniden abone olmak, aynı anahtarlarla her şeyi yeniden açar.
API aracılığıyla Google yorumu, Instagram, Wi-Fi veya PDF kodu nasıl oluştururum?
GET /catalog her türü alanlarıyla listeler. Ardından türün type ve fields alanlarıyla POST /codes yapın, türler için subtype ekleyin: { type: 'url', destination_data: { subtype: 'googlereview', placeId: 'ChIJ…' } }, { type: 'wifi', destination_data: { ssid, password, encryption: 'WPA' } }, { type: 'url', destination_data: { subtype: 'instagram', handle: 'acme' } }.
API bir koda logo yükleyebilir mi?
Henüz değil. Logoyu panoda ekleyin; image.svg onu içerir ve has_logo size orada olduğunu söyler. Renkler, çerçeveler ve başlıklar API aracılığıyla ayarlanabilir.
API kararlı mı?
v1 yalnızca ekler; asla kaldırmaz veya yeniden adlandırmaz. Kırıcı bir değişiklik, v1'in en az on iki ay canlı tutulduğu ve e-postayla 90 gün önceden bildirildiği v2 olarak yayınlanır.
Bunu okuyan aracılar, araçlar ve asistanlar için
Makine tarafından okunabilir
Bu sayfadaki her şey, yazılımın getirebileceği bir biçimde mevcuttur. Tümü, API'ye hizmet veren koddan üretilir; bu nedenle asla güncel değildir.
| URL | Ne olduğu | |
|---|---|---|
| llms-full.txt | https://qrflow.codes/llms-full.txt | Bu referansın tamamı Markdown olarak: kavramlar, her uç nokta, her MCP aracı, tarifler, sorun giderme, SSS. Bu sayfayla aynı kaynaktan üretilmiştir. |
| developers.md | https://qrflow.codes/developers.md | Aynı belge, .md dosyası getiren araçlar için. |
| llms.txt | https://qrflow.codes/llms.txt | Asistanlar için site dizini, buraya işaret eder. |
| API tek sayfada | https://qrflow.codes/qr-code-api | API'nin ne yaptığı, istemci tarafı kitaplığın ne zaman daha iyi bir yanıt olduğu ve maliyetinin ne olduğu. Bu referansın kısa versiyonu, inşa etmekten çok karar vermek için. |
| openapi.json | https://qrflow.codes/api/v1/openapi.json | OpenAPI 3.1. Postman, Insomnia, bir kod üretici veya bir ChatGPT Action'a aktarın. |
| MCP sunucusu | https://qrflow.codes/mcp | Streamable HTTP, dinamik kayıtla OAuth veya taşıyıcı olarak Business anahtarı. |
| server.json | https://qrflow.codes/.well-known/mcp/server.json | MCP kayıt defteri manifestosu. |
| OAuth keşfi | https://qrflow.codes/.well-known/oauth-authorization-server | RFC 8414 meta verileri; korumalı kaynak belgesi yanındadır. |
| npm paketi | https://www.npmjs.com/package/qrflow | npm install qrflow. Yazılmış istemci, sıfır bağımlılık, webhook doğrulama. Python tek dosyalık istemci https://qrflow.codes/sdk/qrflow.py. adresinde |
| GitHub | https://github.com/nativecodeapps/qrflow-sdk | İstemciler, OpenAPI anlık görüntüsü ve Next.js, Workers, Express, FastAPI ve Flask webhook'ları için çalıştırılabilir örnekler. Sorunlar ve PR'ler memnuniyetle karşılanır. |
Sorular, fikirler, eklememiz gereken bir tür kod: hello@qrflow.codes. Şartlar: /terms. Gizlilik: /privacy.