QRFLOW.codes
resmiBuat kode QR, arahkan ulang kode dinamis yang tercetak, beri nama tautan di domain Anda sendiri, dan baca analitik pemindaian.
Apa yang bisa Anda lakukan dengan QRFLOW Codes MCP?
- Buat kode QR dinamis — Minta untuk menghasilkan
short_urlyang dapat dicetak untuk URL apa pun, dengan tujuan yang dapat diubah kapan saja setelah dicetak. - Ubah arah kode yang sudah dicetak — Minta pembaruan
destination_datakode ke URL baru; kode cetak yang ada tetap berfungsi tanpa perlu mencetak ulang. - Ambil analitik pindaian — Minta rincian
Scansberdasarkan hari, negara, atau perangkat untuk melihat kinerja kode cetak. - Jeda atau kedaluwarsakan kode — Instruksikan untuk menjeda kode atau menetapkan tanggal kedaluwarsa saat kampanye atau penawaran berakhir.
- Beri nama tautan di domain Anda — Minta pengaturan
slugyang mudah dibaca di domain Anda sendiri sehingga kode tercetak sebagai go.yourbrand.com/menu, bukan jalur acak.
Server MCP Terhosting
npx add-mcp 'https://qrflow.codes/mcp'Terpasang ke Claude Code, Codex, Cursor, dan lainnya
Dokumentasi
QRFLOW.codes untuk pengembang
Mulai di sini
QRFLOW.codes membuat kode QR yang dapat Anda ubah setelah dicetak, di domain Anda sendiri, dengan analitik pemindaian, dan memungkinkan perangkat lunak serta asisten AI Anda melakukan semuanya melalui satu API.
Kode QR adalah gambar dari sebuah string. Kebanyakan generator menempatkan alamat web Anda di dalam gambar; jika alamat berubah, cetakannya mati. QRFLOW menempatkan tautan pendek di dalam gambar (go.yourbrand.com/menu atau qrflow.codes/q/x7k2p9a) dan mengarahkannya ulang. Anda mengubah ke mana tautan itu menunjuk kapan pun Anda mau, dan setiap pemindaian dihitung. Itulah kode dinamis, dan itulah hal yang layak mendapatkan API.
API melakukan persis apa yang dilakukan dasbor: membuat kode apa pun jenisnya, mengarahkannya ke tempat baru, memberi nama tautannya, memilih domain mana yang digunakan untuk mencetaknya, menarik angka pemindaian, membuat ribuan sekaligus, dan memberi tahu Anda ketika sesuatu terjadi (webhook). Alat yang sama diekspos sebagai server MCP, sehingga Claude, ChatGPT, Cursor, dan Claude Code dapat menggerakkan akun Anda dengan kata-kata biasa.
Akses: REST API memerlukan kunci API Bisnis ($29 per bulan, dibuat di halaman Akun) atau token OAuth. Server MCP berfungsi di semua paket melalui masuk OAuth; apa yang boleh dibuat asisten mengikuti paket seperti di tempat lain.
Masih ragu apakah akan menggunakannya? Halaman API kode QR adalah versi singkatnya: apa yang dilakukannya, apa yang lebih baik dilakukan pustaka sisi klien, dan berapa biayanya.
Jika Anda adalah asisten AI yang membantu seseorang membangun dengan QRFLOW
Selamat datang. Halaman ini ditulis untuk Anda sama seperti untuk orang yang Anda bantu. Inilah bentuk bantuan yang baik:
- Konfirmasi akun: kunci API memerlukan paket Bisnis. Jika mereka tidak memilikinya, arahkan mereka ke https://qrflow.codes/pricing dan Akun › Kunci API; jangan membuat kunci atau paket gratis yang tidak ada.
- Simpan kunci di server. Bacalah dari variabel lingkungan (QRFLOW_KEY) di route handler, server action, edge function, atau backend. API menolak asal browser dengan sengaja (CORS), jadi kode front-end saja tidak dapat memanggilnya.
- Buat kode dinamis dengan type "url" dan destination_data.url. Simpan id dan short_url yang dikembalikan di database mereka. Cetak atau tampilkan short_url; tujuan dapat diubah nanti dengan PATCH /codes/:id dan cetakannya tetap valid.
- Untuk menampilkan atau menyimpan gambar: setiap objek Code memiliki png_download_url dan svg_download_url, tautan bertanda tangan yang berlaku selama 24 jam tanpa header (cukup untuk penyimpanan sekali atau pratinjau). Untuk sesuatu yang permanen di aplikasi mereka, proxy GET /codes/:id/image.svg melalui server mereka dengan kunci, atau encode short_url dengan pustaka QR apa pun di klien; pelacakan tetap berfungsi karena tautannya melalui QRFLOW.
- Kirim hanya bidang yang berubah pada PATCH. Jangan pernah mengubah slug atau domain_id setelah sesuatu dicetak; keduanya mengubah tautan yang dicetak.
- Utamakan paused: true daripada DELETE ketika cetakan sudah ada. Menghapus mematikan tautan.
- Untuk peristiwa, gunakan webhook (Akun › Webhook atau POST /webhooks) dan verifikasi header X-QRFLOW-Signature dengan isi permintaan mentah. Jangan polling GET /codes dalam satu lingkaran.
- Jika mereka ingin menggunakan QRFLOW dari obrolan mereka alih-alih dari kode, hubungkan server MCP di https://qrflow.codes/mcp;; tidak perlu kunci untuk itu.
- Ketika sesuatu gagal, baca error dan message di isi JSON. Bagian pemecahan masalah di bawah memetakan setiap kode kesalahan ke perbaikannya.
- Referensi lengkap dalam Markdown ada di https://qrflow.codes/llms-full.txt dan dokumen OpenAPI 3.1 di https://qrflow.codes/api/v1/openapi.json.. Keduanya dibuat dari sumber yang sama dengan halaman ini.
Manusia: blok ini adalah cara kami memastikan asisten yang Anda pasangkan memberi Anda versi aman dari setiap jawaban. Ini juga kebetulan merupakan ringkasan yang baik.
Paket mana yang Anda perlukan
Kunci API adalah satu-satunya hal yang khusus Bisnis. Segala sesuatu yang dilakukan asisten melalui server MCP, dan segala sesuatu yang dilakukan aplikasi pihak ketiga melalui OAuth, berfungsi di paket apa pun dan hanya mengikuti fitur paket tersebut. Harga lengkap dan penggunaan wajar: /pricing.
| Gratis | Premium $4 | Bisnis $29 | |
|---|---|---|---|
| Kunci API (REST dari kode Anda) | Tidak | Tidak | Ya, hingga 10 kunci |
| Server MCP (Claude, ChatGPT, Cursor, Claude Code) | Ya, masuk | Ya | Ya, masuk atau kunci |
| OAuth untuk aplikasi Anda sendiri (pengguna menghubungkan QRFLOW mereka) | Ya | Ya | Ya |
| Kode dinamis (ubah tujuan setelah dicetak) | Tidak, hanya statis | Ya | Ya |
| Domain tautan Anda sendiri | Tidak | 1 domain | 5 domain, pilih per kode |
| Nama tautan (go.brand.com/menu) | Tidak | Ya | Ya |
| Analitik pemindaian | Tidak | Ya | Ya |
| Webhook | Tidak | Tidak | Ya, hingga 10 |
| Buat massal | Tidak | 500/bulan, 500 per permintaan | 10.000/bulan, 2.000 per permintaan |
| Kode tersimpan (penggunaan wajar) | Beberapa | 1.000 | 25.000 |
| Kursi tim | 1 | 1 | 5 |
| Harga | $0 | $4/bulan | $29/bulan |
Dua belas kata yang melakukan semua pekerjaan
Konsep
Baca ini sekali dan setiap endpoint di bawah akan masuk akal.
Static code
Kontennya ada di dalam gambar. Kode Wi-Fi, kartu kontak (vCard), dan teks biasa selalu statis, dan di paket Gratis setiap kode adalah statis. Kode statis tidak memerlukan server dan tidak pernah kedaluwarsa, dan tidak dapat diubah atau dihitung.
Dynamic code
Gambar memegang tautan pendek yang dialihkan QRFLOW. Kode url, phone, email, sms, dan location bersifat dinamis di Premium dan Bisnis. Anda dapat mengarahkan ulang, menjeda, mengakhiri, mengganti nama, dan menghitungnya tanpa menyentuh cetakan.
short_url
String persis yang dienkode dalam kode dinamis, dan hal yang dicetak. Ini adalah https://qrflow.codes/q/<short_code> sampai Anda menghubungkan domain, lalu https://<your domain>/<slug or short_code>.. Setiap objek Code membawanya.
short_code
Tujuh karakter acak, unik per kode, ditetapkan saat pembuatan dan tidak pernah diubah. Jalur cadangan ketika kode tidak memiliki nama tautan.
slug (link name)
Jalur yang dapat dibaca di domain Anda sendiri: go.example.com/menu. 3 hingga 40 huruf kecil, angka, dan tanda hubung, unik dalam akun Anda, hanya dengan domain yang terhubung. Atur sebelum Anda mencetak: mengubahnya mengubah tautan yang dicetak.
Link domain
Nama host yang Anda miliki (go.example.com) yang diarahkan ke QRFLOW melalui CNAME dan diverifikasi di halaman Akun. Premium mendapat satu; Bisnis mendapat lima dan dapat memilih per kode dengan domain_id. Domain langsung tertua adalah default.
Kind, type and subtype
type adalah pengkodeannya: url, text, wifi, vcard, email, phone, sms, location. kind adalah nama yang lebih ramah untuk apa yang orang inginkan (instagram, googlereview, whatsapp, pdf, menu, appstore,...). Sebagian besar kind adalah kode url dengan destination_data.subtype diatur. GET /catalog mencantumkan setiap kind dengan bidangnya; kind pada Code memberi tahu Anda yang mana.
destination_data
Bidang untuk type, sebagai string: { url } untuk situs web, { ssid, password, encryption } untuk Wi-Fi, { placeId } untuk ulasan Google, { handle } untuk Instagram. Pada kode dinamis, Anda dapat menggantinya kapan saja.
Scans
Setiap pengalihan mencatat jenis perangkat, negara, kota, perujuk, browser, OS, dan bahasa dari permintaan itu sendiri, plus hash harian satu arah untuk menghitung pengunjung unik. Tidak ada cookie yang disetel dan alamat IP tidak disimpan. scans pada Code adalah total seumur hidup; GET /codes/:id/scans merincinya.
Source
Setiap kode mengingat apa yang membuatnya: dashboard, api:<key name>, mcp, canva, atau bulk. Ini muncul di dasbor dan di payload webhook, sehingga Anda dapat membedakan kode integrasi Anda dari yang dibuat manual.
Workspace
Pemilik Bisnis dapat mengundang hingga empat rekan tim. Kunci dan webhook milik akun pemilik; kode yang dibuat oleh siapa pun di ruang kerja terlihat oleh seluruh tim.
Lima menit
Mulai cepat
Dapatkan kunci
- Di paket Bisnis, buka Akun › Kunci API.
- Beri nama sesuai dengan tujuannya ("Backend toko", "Pelaporan") dan pilih cakupannya. Cakupan tidak dapat diubah nanti; buat kunci baru jika Anda membutuhkan lebih banyak.
- Salin sekali. Bentuknya seperti
qrf_live_…. Letakkan di variabel lingkungan bernamaQRFLOW_KEY. - Kirim sebagai
Authorization: Bearer $QRFLOW_KEYpada setiap permintaan. Itulah seluruh cerita autentikasi.
Kunci untuk server. Jangan pernah menaruhnya di halaman web, aplikasi seluler, atau spreadsheet bersama; cabut dan terbitkan ulang jika bocor.
Lima langkah yang sama dalam curl, TypeScript, dan Python. Masing-masing membuat kode dinamis, mengunduh gambarnya, mengubah ke mana ia menunjuk, dan membaca pemindaiannya.
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
Autentikasi
Kunci API (Bisnis)
Hingga 10 per akun, 600 permintaan per menit masing-masing, disimpan dengan hash, ditampilkan sekali. Kunci membawa cakupan yang dibuat dengannya:
| Cakupan | Mengizinkan |
|---|---|
| profile | GET /me: paket, fitur, batas. Setiap kunci memilikinya. |
| codes:read | Daftar dan baca kode, unduh gambar. |
| codes:write | Buat, ubah, jadikan dinamis, hapus, buat massal. |
| analytics:read | GET /codes/:id/scans. |
| domains:read | GET /domains (diperlukan untuk menggunakan domain_id dengan bijak). |
| webhooks:manage | Daftar, buat, uji, dan hapus webhook. |
OAuth 2.0 (paket apa pun, untuk aplikasi dan asisten)
Ketika kode harus menjadi milik akun pengguna Anda alih-alih milik Anda, atau ketika asisten obrolan adalah kliennya, gunakan OAuth. Klien mendaftarkan diri mereka sendiri; PKCE S256 diperlukan untuk klien publik; token dapat diikat ke server MCP dengan resource=. Resep OAuth memandu Anda melaluinya.
| Endpoint | URL | Catatan |
|---|---|---|
| Otorisasi | https://qrflow.codes/oauth/authorize | Kirim pengguna ke sini; mereka masuk dan tekan Izinkan. |
| Token | https://qrflow.codes/api/oauth/token | Hibah authorization_code dan refresh_token. Token akses berlaku 1 jam, token penyegaran 90 hari. |
| Cabut | https://qrflow.codes/api/oauth/revoke | RFC 7009. Pengguna juga dapat memutuskan di Akun › Aplikasi terhubung. |
| Daftarkan klien | https://qrflow.codes/api/oauth/register | Pendaftaran dinamis RFC 7591, tanpa akun. Klien publik mendapatkan dyn_ client_id dan harus menggunakan PKCE S256. |
| Penemuan | https://qrflow.codes/.well-known/oauth-authorization-server | RFC 8414. Dokumen sumber daya MCP ada di /.well-known/oauth-protected-resource. |
Token akses berlaku 1 jam, token penyegaran 90 hari. Pengguna melihat aplikasi terhubung di Akun › Aplikasi terhubung dan dapat memutuskan kapan saja. Token yang dibuat untuk https://qrflow.codes/mcp ditolak di /api/v1, dan sebaliknya.
Hal-hal yang sebenarnya orang minta
Resep pembuatan
Setiap resep lengkap dan disalin langsung dari kode yang berfungsi. Pilih yang sesuai dengan tumpukan Anda; bentuknya selalu sama: panggilan sisi server dengan kunci, simpan id dan short_url, tampilkan gambar.
- Next.js
- Tampilkan QR tanpa proxy
- Express atau server Node apa pun
- Cloudflare Workers, Vercel Edge, Deno Deploy, Supabase Edge Functions
- Python
- Satu kode QR per pesanan, meja, produk, tiket, atau acara
- Ubah ke mana kode yang dicetak pergi
- Cetak kode di domain Anda sendiri
- Grafik pemindaian di admin Anda sendiri
- Terima webhook di Next.js dan verifikasi
- Terima webhook di Python
- Ribuan kode dari CSV
- Biarkan pengguna Anda menghubungkan akun QRFLOW mereka sendiri (OAuth)
- Zapier, Make, n8n
Next.js: rute yang membuat kode dan rute yang menampilkannya
Kapan: Anda memiliki aplikasi Next.js (App Router) dan menginginkan tombol yang membuat kode QR dan halaman yang menampilkannya.
- Letakkan kunci Anda di .env.local sebagai QRFLOW_KEY. Jangan pernah menambahkannya dengan awalan NEXT_PUBLIC_.
- Tambahkan POST route handler yang membuat kode dan mengembalikan id dan short_url.
- Tambahkan GET route yang mem-proxy gambar sehingga browser tidak pernah melihat kunci.
- Simpan id dan short_url di catatan Anda sendiri (pesanan, meja, produk, acara).
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>
- Server Actions bekerja dengan cara yang sama: panggil fetch dengan kunci di dalam action.
- Untuk Pages Router, kode yang sama masuk ke pages/api/qr.ts dengan req/res.
Tampilkan QR tanpa proxy: render short_url sendiri
Kapan: Anda ingin gambar di browser segera dan tidak memerlukan bingkai atau logo QRFLOW di atasnya. Pustaka QR apa pun bisa digunakan, karena kodenya memang tautan pendeknya
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.
- Ini jalur tercepat untuk pratinjau. Untuk cetak, unduh /codes/:id/image.svg: file tersebut membawa warna, bingkai, keterangan, dan logo yang tersimpan, dan berupa vektor.
- Jika nanti Anda mengubah slug atau domain_id, short_url akan berubah; render ulang.
Express atau server Node apa pun
Kapan: Backend Node biasa.
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
Kapan: Runtime khusus fetch tanpa built-in Node.
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_...
- Paket npm
qrflow\hanya menggunakan fetch dan WebCrypto, sehingga berjalan di semua lingkungan tersebut tanpa perubahan.
Python: FastAPI, Flask, Django, atau skrip
Kapan: Backend Anda menggunakan 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")
Satu kode QR per pesanan, meja, produk, tiket, atau acara
Kapan: Setiap baris di salah satu tabel Anda membutuhkan kode sendiri, dibuat otomatis.
- Tambahkan dua kolom ke tabel Anda: qrflow_code_id (uuid) dan qr_short_url (teks).
- Saat baris dibuat, POST /codes dengan URL publik baris tersebut dan label yang menamai baris itu ("Pesanan 10432", "Meja 7"). Simpan id dan short_url.
- Saat halaman baris berpindah (domain baru, jalur baru), PATCH destination_data. Kode yang sudah dicetak tetap berfungsi.
- Saat baris dihentikan, PATCH { paused: true } jika ada yang sudah dicetak; DELETE hanya jika belum ada yang dicetak.
- Perlu ribuan sekaligus (menu per meja untuk 300 restoran)? Gunakan POST /codes/bulk dalam beberapa bagian dan petakan kembali kode yang dikembalikan ke baris Anda berdasarkan label atau urutan.
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 });
- Penggunaan wajar adalah 25.000 kode tersimpan di paket Business; API berhenti pada dua kali lipatnya. Jika Anda membutuhkan satu kode per struk selamanya, hubungi kami dulu: hello@qrflow.codes.
Mengubah tujuan kode yang sudah dicetak
Kapan: Kampanye berakhir, halaman berpindah, PDF diganti, musim berganti.
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" } }'
Jeda kode tersebut, atau beri tanggal akhir
# 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" }'
- Hanya kode dinamis yang bisa diarahkan ulang. Kode url yang dibuat di akun Free, atau kode Wi-Fi/vCard/teks, menjawab 400 not_dynamic. Untuk kode url/telepon/email/sms/lokasi di paket berbayar, POST /codes/:id/dynamic mengonversinya, dan Anda harus merender ulang serta mencetak ulang karena gambarnya berubah.
- Pemindai melihat tujuan baru pada pemindaian berikutnya. Tidak ada cache yang perlu ditunggu.
Cetak kode di domain Anda sendiri
Kapan: Anda ingin go.example.com/menu di dalam kode, bukan qrflow.codes/q/x7k2p9a.
- Di halaman Akun, di bawah Your own link domain, tambahkan go.example.com dan buat CNAME yang ditampilkan di penyedia DNS Anda. Verifikasi biasanya selesai dalam hitungan menit.
- Setelah itu, setiap short_url kode dinamis baru menggunakan domain tersebut. Kode yang ada juga ikut berpindah: gambar mereka mengodekan qrflow.codes/q/..., yang terus mengarahkan ulang, jadi tidak ada yang dicetak menjadi rusak.
- Beri kode nama yang mudah dibaca dengan slug: PATCH { "slug": "menu" } menghasilkan go.example.com/menu. Lakukan ini sebelum mencetak.
- Di paket Business dengan beberapa domain, GET /domains mencantumkannya beserta id; berikan domain_id pada POST atau PATCH untuk memilih per kode.
Beri nama tautan dan pilih domain
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
Grafik pemindaian di admin Anda sendiri
Kapan: Anda ingin melihat pemindaian per hari, per negara, atau per perangkat di samping angka Anda sendiri.
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
- Satu permintaan mencakup hingga 92 hari; ulangi untuk rentang yang lebih panjang. Tanggal menggunakan UTC.
- Untuk angka langsung tanpa polling, langgankan webhook ke peristiwa scan: Anda menerima setiap pemindaian beserta detailnya dalam batch setiap beberapa menit.
Menerima webhook di Next.js dan memverifikasinya
Kapan: Anda ingin tahu kapan kode dipindai atau diubah, di database Anda sendiri, hampir secara real time.
- Buat webhook di Akun › Webhooks atau dengan POST /webhooks. Salin rahasia (whsec_...) sekali ke QRFLOW_WEBHOOK_SECRET.
- Baca body mentah sebagai teks sebelum mengurai; tanda tangan mencakup byte yang tepat.
- Verifikasi, lalu alihkan berdasarkan event. Jawab 2xx dengan cepat; lakukan pekerjaan lambat setelah Anda merespons atau dalam antrean.
- Tekan Test pada webhook untuk menerima ping bertanda tangan dan memastikan koneksinya berfungsi.
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 });
}
- Secara lokal, ekspos server pengembangan Anda dengan tunnel (cloudflared tunnel --url http://localhost:3000, atau ngrok) dan gunakan URL https itu untuk webhook saat Anda membangun.
- Paket npm melakukan ini untuk Anda:
import { parseWebhook } from "qrflow"\memverifikasi dan mengurai dalam satu panggilan (WebCrypto, sehingga juga berjalan di Workers dan Deno). Klien Python menyertakan verify_webhook.
Menerima webhook di Python
Kapan: Flask, FastAPI, atau Django menerima event yang sama.
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
Ribuan kode dari CSV
Kapan: Satu kode per SKU, per kursi, per tag aset, per kiriman.
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");
}
- Bulk hanya membuat kode url dinamis, semuanya dengan warna yang sama. Kode kembali dalam urutan yang Anda kirim, dikurangi baris yang ditolak; cocokkan dengan label jika ragu.
- Webhook menerima satu event code.created per permintaan bulk dengan codes[] alih-alih satu per kode.
Biarkan pengguna Anda menghubungkan akun QRFLOW mereka sendiri (OAuth)
Kapan: Anda membangun produk untuk orang lain dan ingin kode masuk ke akun QRFLOW mereka, bukan milik Anda.
- Daftarkan klien sekali: POST https://qrflow.codes/api/oauth/register dengan client_name dan redirect_uris. Anda mendapatkan client_id (dan client_secret untuk klien rahasia).
- Arahkan pengguna ke /oauth/authorize dengan response_type=code, client_id, redirect_uri, scope, state, dan PKCE (code_challenge, code_challenge_method=S256).
- Tukar kode di /api/oauth/token. Simpan refresh token; token akses bertahan satu jam.
- Panggil /api/v1 dengan Authorization: Bearer <access_token>. Semuanya bekerja persis seperti dengan kunci, di bawah paket pengguna.
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
- Scope sama dengan enam scope kunci API. Minta yang paling sedikit yang Anda butuhkan; layar persetujuan mencantumkannya.
- Jika aplikasi Anda adalah asisten obrolan atau agen, tambahkan resource=https://qrflow.codes/mcp ke permintaan authorize dan bicaralah dengan server MCP sebagai gantinya; token akan terikat padanya.
Zapier, Make, n8n: tanpa kode sama sekali
Kapan: Anda ingin pemindaian atau kode baru masuk ke spreadsheet, saluran Slack, atau CRM.
- Buat pemicu catch-hook (Zapier: Webhooks by Zapier › Catch Hook; Make: Custom webhook; n8n: Webhook node) dan salin URL https-nya.
- Di Akun › Webhooks, tambahkan URL itu dan pilih event-nya. Tekan Test; ping muncul di alat tersebut dan memberinya bentuk payload.
- Petakan data.scans[] (untuk scan) atau data.code (untuk code.*) ke spreadsheet, pesan, atau catatan Anda.
- Untuk membuat kode dari alat tersebut, gunakan modul HTTP mereka terhadap POST /codes dengan header Authorization. Simpan kunci di penyimpanan kredensial alat tersebut.
- Alat-alat ini tidak dapat memverifikasi tanda tangan. URL yang mereka berikan tidak dapat ditebak, itulah perlindungan yang Anda miliki; jangan mempostingnya di mana pun.
Vibe coding
Prompt untuk ditempel
Asisten pengodean membangun hal yang benar ketika mereka diberi tahu aturannya di awal. Prompt ini membawa aturan tersebut. Tempel satu, isi tanda kurung, dan asisten akan membaca referensi Markdown sebelum menulis satu baris pun.
Tambahkan kode QR ke aplikasi saya
Claude, ChatGPT, Cursor, Codex, Windsurf, Copilot Chat: tempel ke dalam obrolan
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"].
Ajari repositori Anda tentang QRFLOW
Masukkan ke CLAUDE.md, AGENTS.md, .cursorrules, atau .github/copilot-instructions.md
## 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.
Di Lovable, Bolt, v0, Replit, dan pembangun aplikasi lainnya
Pembangun berbasis front-end yang memberi Anda backend (Supabase, fungsi serverless)
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
GPT khusus yang mengelola kode saya
ChatGPT › Create a GPT › Actions
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).
Hal yang perlu dikatakan setelah konektor aktif
Claude, ChatGPT, Claude Code dengan server MCP QRFLOW terhubung
"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."
Server MCP
Gunakan dari Claude, ChatGPT, Cursor, dan Claude Code
QRFLOW adalah server MCP di https://qrflow.codes/mcp. Hubungkan sekali, masuk, lalu ucapkan hal-hal seperti "buatkan kode QR untuk halaman menu musim gugur kami, bernama menu di domain saya", "arahkan kode poster lobi ke halaman baru", atau "berapa banyak pemindaian yang didapat selebaran minggu lalu, berdasarkan negara?". Asisten mendapatkan alat yang sama dengan yang ditawarkan API ini, di bawah aturan yang sama, dan kode masuk ke dasbor Anda dengan mcp sebagai sumbernya.
Bukan pengembang? Versi bahasa sederhana, dengan klik yang tepat untuk setiap asisten, ada di Buat kode QR dengan asisten AI Anda.
Hubungkan
Customize › Connectors › Add custom connector › tempel alamatnya, atau tekan Connect di daftar direktori QRFLOW. Claude membuka halaman masuk QRFLOW; tekan Allow. Berfungsi di semua paket.
https://qrflow.codes/mcp
Settings › Security and login › aktifkan Developer mode, lalu Settings › Plugins › + › tempel alamatnya; masuk saat diminta. Plus, Pro, Team, Enterprise, dan Edu.
https://qrflow.codes/mcp
Satu perintah, lalu /mcp untuk masuk. Tambahkan kunci Business sebagai header untuk melewati proses masuk.
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, klien MCP apa pun
Tambahkan server HTTP di URL tersebut. Masuk OAuth terjadi di browser; atau berikan header Authorization dengan kunci.
{
"mcpServers": {
"qrflow": { "type": "http", "url": "https://qrflow.codes/mcp" }
}
}
Agen Anda sendiri (SDK Anthropic atau OpenAI)
Arahkan konektor MCP atau alat ke URL dengan kunci Business sebagai bearer; tidak perlu alur browser.
// Anthropic Messages API, MCP connector
mcp_servers: [{ type: "url", url: "https://qrflow.codes/mcp", name: "qrflow", authorization_token: process.env.QRFLOW_KEY }]
Yang bisa dilakukan asisten
| Alat | Fungsinya | Cakupan |
|---|---|---|
| list_code_kinds | Setiap jenis kode beserta bidangnya dan paket yang dibutuhkan. Asisten memanggil ini sebelum membuat sesuatu yang tidak biasa. | profile |
| list_domains | Domain tautan Anda, default-nya, dan id-nya. | domains:read |
| get_qr_image | PNG yang bisa ditampilkan atau disimpan asisten, plus URL SVG untuk cetak. | codes:read |
| get_account | Siapa yang masuk, paket, batasan. | profile |
Cara tetap aman
- Asisten hanya memegang token untuk akun Anda, yang diterbitkan setelah Anda menekan Allow di halaman QRFLOW. Putuskan kapan saja di Akun › Connected apps.
- Token terikat ke server MCP; token tidak dapat diputar ulang terhadap REST API.
- Setiap penulisan melalui validasi yang sama dengan dasbor: daftar tujuan yang diizinkan, pemeriksaan paket, batas penggunaan wajar.
- Alat yang merusak mendeskripsikan diri mereka dengan hati-hati:
delete_qr_codememberi tahu model untuk lebih memilih jeda saat cetakan ada. - Dokumen penemuan berada di
/.well-known/oauth-authorization-serverdan/.well-known/oauth-protected-resource; registrasi adalah RFC 7591; hanya PKCE S256.
SDK dan spesifikasi OpenAPI
- TypeScript / JavaScript:
npm install qrflow(npm). Tanpa dependensi, ESM dan CommonJS, tipe lengkap; berjalan di Node 18+, Bun, Deno, dan Workers. Mengulangi 429 untuk Anda dan menyertakanverifyWebhook/parseWebhook. - Python 3.9+, hanya pustaka standar: qrflow.py.
- OpenAPI 3.1: /api/v1/openapi.json. Impor ke Postman atau Insomnia, buat klien dalam bahasa apa pun, atau lampirkan ke ChatGPT Action.
- Kedua klien melempar error bertipe (
QRFlowErrordenganstatus,code,message,retryAfter) dan menyertakan verifikator webhook. Sumber TypeScript satu file masih di /sdk/qrflow.ts jika Anda lebih suka menyimpannya sendiri.
| TypeScript | Python | Panggilan |
|---|---|---|
| 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) | Alamat gambar (ambil dengan kunci) |
| verifyWebhook(raw, header, secret) | verify_webhook(raw, header, secret) | Pemeriksaan tanda tangan untuk pengiriman |
Referensi endpoint
Base URL https://qrflow.codes/api/v1. Badan dan respons berupa JSON. Tanggal dalam format ISO 8601 UTC. Kirim hanya kolom yang berubah pada PATCH.
GETprofile
Paket, flag fitur, dan batasan yang berlaku untuk akun ini, plus cakupan (scopes) dari kunci.
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
Tipe native (url, wifi, vcard, email, phone, sms, text, location) dan sekitar 50 subtipe (Instagram, ulasan Google, Wi-Fi, toko aplikasi…), masing-masing dengan kolom yang dibutuhkan dan paket yang disyaratkan. Tidak perlu kunci.
curl https://qrflow.codes/api/v1/catalog
GETcodes:read
Terbaru lebih dulu.?limit= hingga 100,?q= mencari label.
curl "https://qrflow.codes/api/v1/codes?limit=20&q=menu" \
-H "Authorization: Bearer $QRFLOW_KEY"
POSTcodes:write
Aturan yang sama seperti Simpan di situs: kode url, phone, email, sms, dan location bersifat dinamis pada paket berbayar; Wi-Fi, vCard, dan text membawa kontennya di dalam pola. Masukkan id subtipe di destination_data.subtype untuk membuat, misalnya, kode ulasan Google. domain_id opsional memilih domain tautan mana yang digunakan kode saat dicetak (GET /domains mencantumkannya).
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
Kode beserta jumlah pindaian, tautan pendek, dan alamat gambar.
curl https://qrflow.codes/api/v1/codes/$ID \
-H "Authorization: Bearer $QRFLOW_KEY"
PATCHcodes:write
Salah satu dari: destination_data (khusus kode dinamis, cetakan tetap valid), label, paused, expires_at (ISO atau null), slug (nama tautan di domain Anda), domain_id (domain tautan mana yang digunakan kode ini saat dicetak; null = bawaan akun), fg_color, bg_color, frame_style, frame_caption, frame_caption2. Kirim hanya kolom yang Anda ubah.
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
Hilang selamanya, termasuk riwayat pindaiannya. Tautan cetak dari kode dinamis berhenti berfungsi. Utamakan paused: true jika cetakan masih beredar.
curl -X DELETE https://qrflow.codes/api/v1/codes/$ID \
-H "Authorization: Bearer $QRFLOW_KEY"
204 No Content
POSTcodes:write
Pola cetakan berubah (sekarang mengenkode tautan pendek), jadi render ulang gambar setelahnya.
curl -X POST https://qrflow.codes/api/v1/codes/$ID/dynamic \
-H "Authorization: Bearer $QRFLOW_KEY"
GETcodes:read
SVG siap cetak dengan bingkai dan warna.?size= mengatur lebar grid modul dalam px; file tetap dapat diskalakan tanpa kehilangan kualitas.
curl https://qrflow.codes/api/v1/codes/$ID/image.svg \
-H "Authorization: Bearer $QRFLOW_KEY" -o code.svg
GETanalytics:read
?from= dan?to= (tanggal ISO, hingga 92 hari, bawaan 30 hari terakhir) dan?group= day, device, country, city, browser, os, atau referrer. Angkanya sama dengan halaman analitik.
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
Hingga 2.000 kode URL dalam satu panggilan, semuanya dinamis. Dihitung terhadap tunjangan massal bulanan yang sama seperti halaman Bulk (10.000 untuk Business). Baris yang bukan alamat web dikembalikan di rejected; sisanya dibuat.
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
Domain yang terhubung, statusnya, dan domain mana yang digunakan kode dinamis secara bawaan saat dicetak (default_base). Berikan id domain sebagai domain_id pada kode untuk mencetak kode tersebut dengan domain lain.
curl https://qrflow.codes/api/v1/domains \
-H "Authorization: Bearer $QRFLOW_KEY"
GETwebhooks:manage
Webhook Anda beserta event, status terakhir, dan jumlah kegagalan.
curl https://qrflow.codes/api/v1/webhooks \
-H "Authorization: Bearer $QRFLOW_KEY"
POSTwebhooks:manage
url harus https di host publik; events adalah salah satu dari scan, code.created, code.updated, code.deleted. Rahasia penandatanganan (signing secret) dikembalikan satu kali.
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
Mengirim ping bertanda tangan sekarang dan melaporkan responsnya.
curl -X POST https://qrflow.codes/api/v1/webhooks/$WEBHOOK_ID \
-H "Authorization: Bearer $QRFLOW_KEY"
DELETEwebhooks:manage
Menghentikan semua pengiriman, termasuk percobaan ulang yang diantrekan.
curl -X DELETE https://qrflow.codes/api/v1/webhooks/$WEBHOOK_ID \
-H "Authorization: Bearer $QRFLOW_KEY"
204 No Content
GETpublic
Id bingkai dan apa yang dibutuhkan masing-masing (keterangan, baris kedua), dikelompokkan seperti penyesuai (customizer). Tidak perlu kunci.
curl https://qrflow.codes/api/v1/frames
Objek Kode
Setiap endpoint yang menyentuh kode mengembalikan bentuk yang sama. Abaikan kolom yang tidak Anda kenal; kolom baru ditambahkan seiring waktu.
| Kolom | Tipe | Arti |
|---|---|---|
| id | uuid | Id stabil. Gunakan di setiap panggilan lain. |
| label | string | null | Nama di dasbor. Hingga 120 karakter. Dapat dicari dengan?q=. |
| kind | string | Id katalog: url, wifi, instagram, googlereview,... kind_label adalah nama yang mudah dibaca manusia. |
| type | string | Pengodean: url, text, wifi, vcard, email, phone, sms, location. |
| destination_data | object | Kolom yang Anda kirim (plus subtype untuk kind). destination adalah ringkasan satu baris darinya. |
| dynamic | boolean | True saat pindaian melalui QRFLOW dan tujuan dapat berubah. dynamic_capable menyatakan apakah tipe ini bisa dinamis pada paket berbayar. |
| short_code | string | Tujuh karakter, tidak pernah berubah. |
| short_url | string | Yang dicetak untuk kode dinamis. Menyertakan domain dan slug Anda jika diatur. |
| domain_id | uuid | null | Domain tautan mana yang digunakan kode ini saat dicetak; null berarti bawaan akun. |
| fg_color, bg_color | hex | Warna modul dan latar belakang. |
| has_logo | boolean | Logo ditambahkan di dasbor; image.svg menyertakannya. |
| frame_style, frame_caption, frame_caption2 | string | null | Id bingkai dan keterangan, seperti di penyesuai. |
| scans | integer | Jumlah pindaian seumur hidup. |
| created_at, updated_at | ISO 8601 | UTC. |
| manage_url | url | Halaman kode di dasbor, untuk tautan 'Buka di QRFLOW'. |
| image_url | url | GET /codes/:id/image.svg. Membutuhkan header Authorization; bukan URL gambar publik. |
| svg_download_url, png_download_url | url | SVG yang sama (bingkai, warna, logo) dan PNG polos melalui tautan bertanda tangan yang berlaku 24 jam tanpa header: untuk tag <img>, skrip, dan asisten yang menyimpan file. download_expires_at menyatakan kapan kedaluwarsa; pembacaan kode apa pun mengembalikan yang baru. |
Bentuk lain: 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, plus secret sekali), Me (id, email, plan, paid, features, limits, auth, scopes) dan Error (error, message). Dokumen OpenAPI memiliki setiap properti dengan tipe.
Business
Webhooks
QRFLOW memanggil URL https Anda saat sesuatu terjadi. Buat satu di Akun › Webhooks atau dengan POST /webhooks; Anda mendapatkan rahasia penandatanganan sekali. Hingga 10 per akun.
| Event | Kapan | data |
|---|---|---|
| scan | Dikelompokkan: setiap beberapa menit, semua pindaian baru sejak pengiriman terakhir, hingga 500 per panggilan. | count, from, to, scans[] dengan code_id, label, short_code, slug, scanned_at, device, country, city, referrer, browser, os, language |
| code.created | Segera dari API dan asisten; dalam beberapa menit dari dasbor. Permintaan massal mengirim satu event dengan bulk: true dan codes[]. | code, source |
| code.updated | Waktu yang sama. Mencakup tujuan, label, jeda, kedaluwarsa, nama tautan, domain, warna, bingkai, dan konversi ke dinamis. | code, changed[] (nama kolom yang berubah) |
| code.deleted | Waktu yang sama. | code: { id, label, short_code, slug } |
| ping | Saat Anda menekan Tes. | webhook_id, message |
Apa yang tiba
Setiap payload adalah { id, event, created_at, data }. id stabil di seluruh percobaan ulang satu pengiriman, jadi Anda dapat menghapus duplikat berdasarkan itu.
{
"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
Verifikasi tanda tangan
X-QRFLOW-Signature: t=<unix seconds>,v1=<hex>. Hitung HMAC-SHA256 atas ${t}.${rawBody} dengan rahasia Anda dan bandingkan dengan v1 dalam waktu konstan; tolak jika t lebih dari lima menit. Gunakan byte mentah yang Anda terima, jangan pernah objek yang diserialisasi ulang. Penerima yang berfungsi untuk Next.js dan Python ada di resep, dan kedua SDK menyertakan pembantunya.
Aturan pengiriman
- Jawab 2xx apa pun dalam 8 detik. Lakukan pekerjaan setelah Anda merespons.
- Hal lain dicoba ulang setelah 1, 5, 15, 60, 240, dan 720 menit.
- Dua puluh kegagalan berturut-turut mematikan webhook dan mengirim email ke pemilik akun. Nyalakan kembali setelah penerima diperbaiki; percobaan ulang yang diantrekan dilanjutkan.
- URL harus https di host publik. localhost, rentang privat, dan qrflow.codes sendiri ditolak. Gunakan tunnel saat mengembangkan.
- Tekan Tes untuk menerima
pingbertanda tangan dan melihat status yang dijawab server Anda.
Kesalahan
Setiap kesalahan adalah { "error": "<code>", "message": "<what to do>" } dengan status di bawah. Pesan ditulis untuk manusia; tampilkan.
| Status | error | Arti |
|---|
Gejala, penyebab, perbaikan
Pemecahan Masalah
401 invalid_token pada setiap panggilan
MengapaHeader salah atau kunci tidak aktif.
PerbaikanKirim persis Authorization: Bearer qrf_live_… (spasi, bukan titik dua). Periksa kunci tidak dicabut di Akun › Kunci API. Jika Anda menyalinnya dari obrolan atau dokumen, perhatikan titik di akhir atau tanda kutip cerdas.
401 di /api/v1 dengan token yang berfungsi di server MCP
MengapaToken yang dibuat untuk https://qrflow.codes/mcp terikat padanya.
PerbaikanGunakan kunci API untuk REST, atau jalankan alur OAuth kedua tanpa resource= untuk mendapatkan token untuk REST API.
402 upgrade_required saat membuat kunci atau webhook
MengapaKeduanya fitur Business.
PerbaikanTingkatkan di /pricing, atau gunakan server MCP, yang berfungsi di semua paket melalui masuk.
402 di POST /codes dari aplikasi OAuth
MengapaPaket pengguna tidak menyertakan apa yang diminta aplikasi (kode dinamis, domain).
PerbaikanBaca fitur GET /me terlebih dahulu dan sesuaikan: buat kode tetap (akan statis di Free) atau beri tahu pengguna apa yang dibutuhkan paket.
403 insufficient_scope
MengapaCakupan ditetapkan saat kunci dibuat.
PerbaikanBuat kunci baru dengan cakupan yang Anda butuhkan dan cabut yang lama. Untuk OAuth, minta cakupan dalam permintaan otorisasi.
400 not_dynamic saat saya PATCH destination_data
MengapaKode statis: dibuat di Free, atau tipe Wi-Fi/vCard/text.
PerbaikanUntuk url/phone/email/sms/location di paket berbayar, POST /codes/:id/dynamic, lalu unduh ulang dan cetak ulang (gambar berubah). Wi-Fi, vCard, dan text tidak pernah bisa dinamis; buat kode url yang membuka halaman sebagai gantinya.
400 no_domain saat saya mengatur slug
MengapaNama tautan berada di domain Anda.
PerbaikanHubungkan dan verifikasi domain di halaman Akun terlebih dahulu. Di qrflow.codes/q jalurnya selalu short_code.
409 conflict pada slug
MengapaKode lain Anda memiliki nama itu.
PerbaikanGET /codes?q= untuk menemukannya, atau pilih nama lain. Nama bersifat per akun, bukan global.
Kesalahan CORS di konsol browser
MengapaAPI hanya menerima panggilan server-ke-server (dan Canva). Ini disengaja: kunci di halaman web adalah kunci yang bocor.
PerbaikanPindahkan panggilan ke route handler, server action, edge function, atau backend dan panggil dari halaman.
Gambar menampilkan tanda air QRFLOW
MengapaAkun berada di paket Free.
PerbaikanPaket berbayar menghapusnya. Free dimaksudkan untuk generator situs itu sendiri.
short_url masih mengatakan qrflow.codes/q/… setelah saya menambahkan domain
MengapaDomain belum diverifikasi, atau CNAME-nya salah.
PerbaikanPeriksa status di halaman Akun atau GET /domains (status harus verified). Kode yang ada beralih otomatis setelah itu.
image_url memberikan 401 di tag <img>
MengapaIni membutuhkan header Authorization, yang tidak dapat dikirim oleh <img>.
PerbaikanGunakan svg_download_url atau png_download_url dari objek Kode yang sama: tautan bertanda tangan yang berlaku 24 jam tanpa header. Untuk sesuatu yang permanen, proxy image_url melalui server Anda (lihat resep Next.js) atau encode short_url sendiri.
Saya butuh PNG, bukan SVG
MengapaSVG membawa bingkai dan logo; PNG adalah kode polos.
PerbaikanGET /codes/:id/image.png (bearer atau png_download_url bertanda tangan) mengembalikan PNG, 256 hingga 2048 px. Untuk PNG dengan bingkai, konversi SVG dengan sharp atau resvg (sharp(svgBuffer).png().toBuffer()).
Asisten saya mengatakan endpoint gambar menolaknya dan menggambar kode sendiri
MengapaIni mengambil image_url, yang membutuhkan bearer.
PerbaikanSetiap kode sekarang membawa png_download_url dan svg_download_url, dan get_qr_image mengembalikannya; asisten dapat curl itu tanpa masuk. Kode yang digambar lokal yang mengenkode short_url yang sama tetap berfungsi dan tetap menghitung pindaian, tetapi tidak memiliki bingkai dan logo.
Webhook tidak pernah tiba
MengapaAturan URL atau penerima.
PerbaikanURL harus https di host publik (tanpa localhost, tanpa IP privat, bukan qrflow.codes). Tekan Tes di webhook: hasilnya menunjukkan status yang dijawab server Anda. Event pindaian dikelompokkan dan dapat memakan waktu hingga sekitar lima menit; event code.* dari dasbor juga diantrekan beberapa menit, sementara penulisan API dan MCP dikirim segera.
Tanda tangan tidak pernah terverifikasi
MengapaAnda menandatangani badan yang diserialisasi ulang.
FixVerify terhadap byte mentah persis yang Anda terima, sebelum penguraian JSON. Di Express gunakan express.raw({ type: 'application/json' }) pada rute tersebut; di Next.js App Router gunakan await req.text(); di Flask request.get_data(). Kemudian hitung HMAC-SHA256 dari ${t}.${raw}\.
Webhook mati dengan sendirinya
MengapaDua puluh kegagalan berturut-turut.
PerbaikiPerbaiki penerimanya, lalu aktifkan lagi (Akun › Webhooks, atau hapus dan buat ulang). Anda akan mendapat email saat itu terjadi. Percobaan ulang yang diantrekan akan dilanjutkan.
Pengiriman webhook duplikat
MengapaRespons 2xx yang lambat (lebih dari 8 detik) dihitung sebagai kegagalan dan dicoba ulang.
PerbaikiBalas dulu, proses setelahnya. Hilangkan duplikat pada id payload, yang stabil di seluruh percobaan ulang.
429 rate_limited selama impor
Mengapa600 permintaan per menit per kunci.
PerbaikiGunakan POST /codes/bulk (2.000 kode dalam satu permintaan) alih-alih satu POST per kode, atau tidur selama Retry-After detik.
Saya menghapus kode dan poster cetak sekarang menampilkan 'Kode tidak ditemukan'
MengapaPenghapusan bersifat permanen dan memutus tautan.
PerbaikiTidak ada pembatalan. Lain kali PATCH { paused: true }; kode yang dijeda menampilkan halaman yang ramah dan dapat dilanjutkan.
Kunci saya berhenti berfungsi setelah saya menurunkan paket
MengapaKunci tetap berfungsi 30 hari setelah meninggalkan Business, lalu menjawab 402.
PerbaikiBerlangganan ulang; tidak ada yang dihapus, dan kunci yang sama berfungsi lagi.
Sesuatu yang tidak ada dalam daftar? hello@qrflow.codes, dengan permintaan persis dan kesalahan JSON yang Anda terima. Akun Business mendapat prioritas.
Batasan dan penggunaan wajar
| Batas | |
|---|---|
| Permintaan per menit, per kunci | 600. 429 dengan Retry-After di luar itu. |
| Kunci per akun | 10 |
| Webhook per akun | 10 |
| Kode tersimpan (penggunaan wajar) | 1.000 Premium, 25.000 Business; API berhenti pada dua kali lipatnya. |
| Massal | 500/bulan (500 per permintaan) Premium; 10.000/bulan (2.000 per permintaan) Business. |
| Domain tautan | 1 Premium, 5 Business |
| Pindai | Tanpa batas. Email check-in pada 100.000 pindai per kode per bulan di Premium, 1.000.000 di Business; tidak ada yang dibatasi. |
| Jendela analitik pindai | 92 hari per permintaan |
| Ukuran halaman daftar | 100 (?limit=) |
| Label / keterangan / slug | 120 / 60 / 40 karakter |
| Waktu tunggu dan percobaan ulang webhook | 8 detik; percobaan ulang setelah 1, 5, 15, 60, 240 dan 720 menit; mati setelah 20 kegagalan berturut-turut. |
| Setelah meninggalkan Business | Kunci dan webhook tetap berfungsi 30 hari, lalu 402. Tidak ada yang dihapus. |
Penggunaan wajar adalah apa yang menjadi dasar harga paket. Tidak ada yang dibatasi pada angka tersebut; API berhenti pada dua kali lipatnya dan seseorang mengirim email kepada Anda terlebih dahulu. Volume lebih tinggi: hello@qrflow.codes.
Keamanan, untuk Anda dan untuk orang yang memindai
Bagaimana QRFLOW melindungi akun Anda
- Kunci ditampilkan sekali dan disimpan sebagai hash SHA-256. Tidak ada seorang pun di QRFLOW yang dapat membaca kembali kunci; jika Anda kehilangannya, buat yang baru.
- Setiap permintaan dibatasi pada akun tempat kunci itu berada. id kode dari akun lain adalah 404, tidak pernah bocor.
- Cakupan ditetapkan per kunci, sehingga kunci untuk dasbor pelaporan tidak dapat membuat atau menghapus kode.
- 600 permintaan per menit per kunci; di atas itu adalah 429 yang bersih, bukan perlambatan untuk semua orang.
- Tujuan masuk daftar izin: http, https, mailto, tel, sms, geo dan daftar pendek skema aplikasi (whatsapp, tg, signal, spotify, toko aplikasi). javascript:, data: dan file: ditolak saat pembuatan, sehingga integrasi yang disusupi tidak dapat mengubah kode Anda menjadi serangan.
- URL webhook harus https di host publik; QRFLOW tidak pernah memanggil jaringan pribadi atau dirinya sendiri. Setiap pengiriman ditandatangani dan setiap payload memiliki id yang stabil.
- Klien OAuth mendaftar dengan PKCE S256 dan token terikat pada server yang menerbitkannya; token untuk server MCP tidak dapat diputar ulang di REST API.
- Siapa pun dapat mencabut kunci atau memutuskan aplikasi di halaman Akun; efeknya langsung.
Apa yang harus dilakukan di sisi Anda
- Variabel lingkungan, jangan pernah kode sumber. Jika kunci masuk ke riwayat git, cabut.
- Hanya sisi server. API menolak asal browser, tetapi endpoint Anda sendiri yang membungkusnya juga perlu autentikasi, atau siapa pun dapat membuat kode atas biaya Anda.
- Beri setiap integrasi kunci sendiri dengan cakupan yang dibutuhkannya, dinamai sesuai integrasi. Mencabut satu kemudian memengaruhi satu hal.
- Verifikasi tanda tangan webhook dan tolak stempel waktu yang lebih lama dari lima menit.
- Jika data pengguna Anda masuk ke label atau tujuan, ingat QRFLOW menyimpannya; jaga data pribadi keluar dari label jika memungkinkan.
Apa yang dicatat pindai, dan apa yang tidak
- Setiap pengalihan menyimpan jenis perangkat, negara, kota, perujuk, browser, sistem operasi dan bahasa, yang berasal dari permintaan, dan hash satu arah dari kode + hari + IP + agen pengguna sehingga pemilik dapat menghitung pengunjung unik. Hash tidak dapat diubah kembali menjadi alamat.
- Tidak ada cookie yang disetel pada orang yang memindai dan alamat IP itu sendiri tidak disimpan dengan pindai. Bot yang dikenal dan perayap pratinjau tautan dilewati.
- Menghapus kode menghapus pindaiannya. Menghapus akun menghapus semuanya.
- Teks lengkap: https://qrflow.codes/privacy dan https://qrflow.codes/terms.
Versi dan stabilitas
API diberi versi di jalur: /api/v1. Dalam v1 kami menambahkan bidang, endpoint, jenis dan peristiwa; kami tidak menghapus atau mengganti nama apa pun, dan bidang yang tidak dikenal dalam respons harus diabaikan oleh kode Anda.
Jika perubahan harus memutus v1, itu dikirim sebagai /api/v2 dan v1 tetap berjalan setidaknya selama dua belas bulan. Pemilik kunci diberi email tentang penghentian 90 hari sebelumnya.
Server MCP mengikuti aturan yang sama untuk alatnya: argumen hanya ditambahkan, dan setiap alat mempertahankan namanya.
Dokumen OpenAPI di /api/v1/openapi.json dan Markdown di /llms-full.txt dihasilkan dari kode yang melayani API, sehingga mereka menggambarkan apa yang aktif hari ini.
Pertanyaan yang diajukan pengembang
Apakah saya harus membayar untuk menggunakan API QRFLOW?
Kunci API disertakan dengan paket Business, $29 per bulan, bulan ke bulan. Server MCP (Claude, ChatGPT, Cursor, Claude Code) dan OAuth untuk aplikasi Anda sendiri berfungsi di setiap paket melalui masuk, dan apa yang dapat mereka buat mengikuti paket. GET /catalog, GET /frames dan /preview.svg tidak memerlukan kunci sama sekali.
Bisakah saya membuat kode QR secara gratis melalui API?
Tidak dengan kunci. Untuk gambar statis biasa, generator gratis di qrflow.codes atau pustaka QR sumber terbuka mana pun dapat melakukannya. API untuk kode dinamis, domain Anda sendiri, analitik, massal dan webhook, yang merupakan tujuan akun berbayar.
Bisakah saya memanggil API dari browser?
Tidak. API menolak asal browser sehingga kunci tidak pernah berakhir di halaman web. Panggil dari penangan rute, tindakan server, fungsi edge atau backend, dan panggil itu dari halaman Anda.
Format gambar apa yang saya dapatkan?
SVG dengan warna, bingkai, keterangan dan logo Anda (GET /codes/:id/image.svg, 256 hingga 4096 px nominal) dan PNG polos (GET /codes/:id/image.png, 256 hingga 2048 px). Keduanya menerima bearer, atau signed svg_download_url / png_download_url yang dibawa setiap objek Code, yang berfungsi selama 24 jam tanpa header. Alat MCP get_qr_image mengembalikan PNG inline plus kedua tautan.
Bisakah saya mengubah kode QR setelah dicetak?
Ya, jika dinamis (url, telepon, email, sms, lokasi pada paket berbayar). PATCH /codes/:id dengan destination_data baru; gambar tidak berubah, pindai berikutnya pergi ke tempat baru. Kode Wi-Fi, vCard dan teks membawa kontennya di gambar dan tidak dapat diubah.
Apa perbedaan antara short_url dan tujuan?
short_url adalah tautan di dalam gambar (go.example.com/menu). Tujuannya adalah ke mana tautan itu mengalihkan (https://example.com/menu-fall). Anda mencetak short_url sekali dan mengubah tujuan sesering yang Anda suka.
Bisakah kode menggunakan domain saya sendiri?
Ya. Premium menghubungkan 1 domain, Business 5; Anda menambahkan CNAME dan verifikasi di halaman Akun. Business memilih domain per kode dengan domain_id. Nama tautan (slug) membuat jalur yang dapat dibaca di atasnya.
Apa yang dicatat pindai tentang orang yang memindai?
Jenis perangkat, negara, kota, perujuk, browser, sistem operasi dan bahasa, dari permintaan, plus hash harian satu arah untuk hitungan pengunjung unik. Tidak ada cookie, dan alamat IP tidak disimpan. Cukup untuk bagan, tidak cukup untuk mengidentifikasi siapa pun. Detail: https://qrflow.codes/privacy#scans
Apakah ada paket npm atau PyPI?
npm: npm install qrflow\ (https://www.npmjs.com/package/qrflow), tanpa dependensi, ESM dan CommonJS, tipe TypeScript lengkap, berjalan di Node 18+, Bun, Deno dan Workers; ini membungkus setiap endpoint, mencoba ulang 429, dan menyertakan verifyWebhook/parseWebhook. Python: klien satu file di https://qrflow.codes/sdk/qrflow.py (hanya pustaka standar) dengan verify_webhook; paket PyPI akan menyusul.
Apakah ini berfungsi dengan Claude, ChatGPT, Cursor dan Claude Code?
Ya. QRFLOW adalah server MCP di https://qrflow.codes/mcp. Tambahkan sebagai konektor, masuk sekali, dan minta dengan kata-kata biasa. Sebelas alat mencakup pembuatan, pengeditan, penjeda, penamaan, massal, analitik, gambar dan domain.
Bisakah pengguna saya sendiri menghubungkan akun QRFLOW mereka ke aplikasi saya?
Ya, dengan OAuth 2.0. Daftarkan klien di /api/oauth/register (tidak perlu akun), kirim pengguna ke /oauth/authorize dengan PKCE, dan panggil API dengan token mereka. Kode masuk ke akun mereka di bawah paket mereka.
Bagaimana cara menguji webhook di localhost?
Ekspos server dev Anda dengan tunnel (cloudflared atau ngrok) dan gunakan alamat https-nya sebagai URL webhook, lalu tekan Test di Akun › Webhooks untuk menerima ping yang ditandatangani. URL webhook harus https publik; localhost dan alamat pribadi ditolak.
Apa yang terjadi pada integrasi saya jika saya membatalkan Business?
Kunci dan webhook tetap berfungsi selama 30 hari, lalu menjawab 402. Kode, pindaian dan domain tetap di akun. Berlangganan ulang mengaktifkan semuanya kembali dengan kunci yang sama.
Bagaimana cara membuat kode Google review, Instagram, Wi-Fi atau PDF melalui API?
GET /catalog mencantumkan setiap jenis dengan bidangnya. Lalu POST /codes dengan jenis dan bidang jenis itu, menambahkan subtipe untuk jenis: { type: 'url', destination_data: { subtype: 'googlereview', placeId: 'ChIJ…' } }, { type: 'wifi', destination_data: { ssid, password, encryption: 'WPA' } }, { type: 'url', destination_data: { subtype: 'instagram', handle: 'acme' } }.
Bisakah API mengunggah logo ke kode?
Belum. Tambahkan logo di dasbor; image.svg menyertakannya dan has_logo memberi tahu Anda bahwa itu ada. Warna, bingkai dan keterangan semuanya dapat diatur melalui API.
Apakah API stabil?
v1 hanya menambahkan; tidak pernah menghapus atau mengganti nama. Perubahan yang memutus akan dikirim sebagai v2 dengan v1 tetap hidup setidaknya selama dua belas bulan dan pemberitahuan 90 hari melalui email.
Untuk agen, alat dan asisten yang membaca ini
Dapat dibaca mesin
Segala sesuatu di halaman ini ada dalam bentuk yang dapat diambil oleh perangkat lunak. Semuanya dihasilkan dari kode yang melayani API, sehingga tidak pernah kedaluwarsa.
| URL | Apa itu | |
|---|---|---|
| llms-full.txt | https://qrflow.codes/llms-full.txt | Seluruh referensi ini sebagai Markdown: konsep, setiap endpoint, setiap alat MCP, resep, pemecahan masalah, FAQ. Dihasilkan dari sumber yang sama dengan halaman ini. |
| developers.md | https://qrflow.codes/developers.md | Dokumen yang sama, untuk alat yang mengambil file .md. |
| llms.txt | https://qrflow.codes/llms.txt | Indeks situs untuk asisten, mengarah ke sini. |
| API dalam satu halaman | https://qrflow.codes/qr-code-api | Apa yang dilakukan API, kapan pustaka sisi klien adalah jawaban yang lebih baik, dan berapa biayanya. Versi singkat dari referensi ini, untuk memutuskan daripada membangun. |
| openapi.json | https://qrflow.codes/api/v1/openapi.json | OpenAPI 3.1. Impor ke Postman, Insomnia, generator kode, atau Tindakan ChatGPT. |
| Server MCP | https://qrflow.codes/mcp | HTTP yang dapat dialirkan, OAuth dengan registrasi dinamis atau kunci Bisnis sebagai bearer. |
| server.json | https://qrflow.codes/.well-known/mcp/server.json | Manifes registri MCP. |
| Penemuan OAuth | https://qrflow.codes/.well-known/oauth-authorization-server | Metadata RFC 8414; dokumen sumber daya yang dilindungi ada di sebelahnya. |
| Paket npm | https://www.npmjs.com/package/qrflow | npm install qrflow. Klien bertipe, tanpa dependensi, verifikasi webhook. Klien Python satu file di https://qrflow.codes/sdk/qrflow.py. |
| GitHub | https://github.com/nativecodeapps/qrflow-sdk | Klien, snapshot OpenAPI, dan contoh yang dapat dijalankan untuk webhook Next.js, Workers, Express, FastAPI, dan Flask. Isu dan PR diterima. |
Pertanyaan, ide, jenis kode yang harus kami tambahkan: hello@qrflow.codes. Ketentuan: /terms. Privasi: /privacy.