QRFLOW.codes

resmi

Buat 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_url yang dapat dicetak untuk URL apa pun, dengan tujuan yang dapat diubah kapan saja setelah dicetak.
  • Ubah arah kode yang sudah dicetak — Minta pembaruan destination_data kode ke URL baru; kode cetak yang ada tetap berfungsi tanpa perlu mencetak ulang.
  • Ambil analitik pindaian — Minta rincian Scans berdasarkan 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 slug yang 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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. Kirim hanya bidang yang berubah pada PATCH. Jangan pernah mengubah slug atau domain_id setelah sesuatu dicetak; keduanya mengubah tautan yang dicetak.
  6. Utamakan paused: true daripada DELETE ketika cetakan sudah ada. Menghapus mematikan tautan.
  7. 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.
  8. 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.
  9. Ketika sesuatu gagal, baca error dan message di isi JSON. Bagian pemecahan masalah di bawah memetakan setiap kode kesalahan ke perbaikannya.
  10. 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.

GratisPremium $4Bisnis $29
Kunci API (REST dari kode Anda)TidakTidakYa, hingga 10 kunci
Server MCP (Claude, ChatGPT, Cursor, Claude Code)Ya, masukYaYa, masuk atau kunci
OAuth untuk aplikasi Anda sendiri (pengguna menghubungkan QRFLOW mereka)YaYaYa
Kode dinamis (ubah tujuan setelah dicetak)Tidak, hanya statisYaYa
Domain tautan Anda sendiriTidak1 domain5 domain, pilih per kode
Nama tautan (go.brand.com/menu)TidakYaYa
Analitik pemindaianTidakYaYa
WebhookTidakTidakYa, hingga 10
Buat massalTidak500/bulan, 500 per permintaan10.000/bulan, 2.000 per permintaan
Kode tersimpan (penggunaan wajar)Beberapa1.00025.000
Kursi tim115
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

  1. Di paket Bisnis, buka Akun › Kunci API.
  2. Beri nama sesuai dengan tujuannya ("Backend toko", "Pelaporan") dan pilih cakupannya. Cakupan tidak dapat diubah nanti; buat kunci baru jika Anda membutuhkan lebih banyak.
  3. Salin sekali. Bentuknya seperti qrf_live_…. Letakkan di variabel lingkungan bernama QRFLOW_KEY.
  4. Kirim sebagai Authorization: Bearer $QRFLOW_KEY pada 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:

CakupanMengizinkan
profileGET /me: paket, fitur, batas. Setiap kunci memilikinya.
codes:readDaftar dan baca kode, unduh gambar.
codes:writeBuat, ubah, jadikan dinamis, hapus, buat massal.
analytics:readGET /codes/:id/scans.
domains:readGET /domains (diperlukan untuk menggunakan domain_id dengan bijak).
webhooks:manageDaftar, 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.

EndpointURLCatatan
Otorisasihttps://qrflow.codes/oauth/authorizeKirim pengguna ke sini; mereka masuk dan tekan Izinkan.
Tokenhttps://qrflow.codes/api/oauth/tokenHibah authorization_code dan refresh_token. Token akses berlaku 1 jam, token penyegaran 90 hari.
Cabuthttps://qrflow.codes/api/oauth/revokeRFC 7009. Pengguna juga dapat memutuskan di Akun › Aplikasi terhubung.
Daftarkan klienhttps://qrflow.codes/api/oauth/registerPendaftaran dinamis RFC 7591, tanpa akun. Klien publik mendapatkan dyn_ client_id dan harus menggunakan PKCE S256.
Penemuanhttps://qrflow.codes/.well-known/oauth-authorization-serverRFC 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: 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.

  1. Letakkan kunci Anda di .env.local sebagai QRFLOW_KEY. Jangan pernah menambahkannya dengan awalan NEXT_PUBLIC_.
  2. Tambahkan POST route handler yang membuat kode dan mengembalikan id dan short_url.
  3. Tambahkan GET route yang mem-proxy gambar sehingga browser tidak pernah melihat kunci.
  4. 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.

  1. Tambahkan dua kolom ke tabel Anda: qrflow_code_id (uuid) dan qr_short_url (teks).
  2. 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.
  3. Saat halaman baris berpindah (domain baru, jalur baru), PATCH destination_data. Kode yang sudah dicetak tetap berfungsi.
  4. Saat baris dihentikan, PATCH { paused: true } jika ada yang sudah dicetak; DELETE hanya jika belum ada yang dicetak.
  5. 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.

  1. 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.
  2. 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.
  3. Beri kode nama yang mudah dibaca dengan slug: PATCH { "slug": "menu" } menghasilkan go.example.com/menu. Lakukan ini sebelum mencetak.
  4. 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.

  1. Buat webhook di Akun › Webhooks atau dengan POST /webhooks. Salin rahasia (whsec_...) sekali ke QRFLOW_WEBHOOK_SECRET.
  2. Baca body mentah sebagai teks sebelum mengurai; tanda tangan mencakup byte yang tepat.
  3. Verifikasi, lalu alihkan berdasarkan event. Jawab 2xx dengan cepat; lakukan pekerjaan lambat setelah Anda merespons atau dalam antrean.
  4. 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.

  1. 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).
  2. Arahkan pengguna ke /oauth/authorize dengan response_type=code, client_id, redirect_uri, scope, state, dan PKCE (code_challenge, code_challenge_method=S256).
  3. Tukar kode di /api/oauth/token. Simpan refresh token; token akses bertahan satu jam.
  4. 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.

  1. Buat pemicu catch-hook (Zapier: Webhooks by Zapier › Catch Hook; Make: Custom webhook; n8n: Webhook node) dan salin URL https-nya.
  2. Di Akun › Webhooks, tambahkan URL itu dan pilih event-nya. Tekan Test; ping muncul di alat tersebut dan memberinya bentuk payload.
  3. Petakan data.scans[] (untuk scan) atau data.code (untuk code.*) ke spreadsheet, pesan, atau catatan Anda.
  4. 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

AlatFungsinyaCakupan
list_code_kindsSetiap jenis kode beserta bidangnya dan paket yang dibutuhkan. Asisten memanggil ini sebelum membuat sesuatu yang tidak biasa.profile
list_domainsDomain tautan Anda, default-nya, dan id-nya.domains:read
get_qr_imagePNG yang bisa ditampilkan atau disimpan asisten, plus URL SVG untuk cetak.codes:read
get_accountSiapa 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_code memberi tahu model untuk lebih memilih jeda saat cetakan ada.
  • Dokumen penemuan berada di /.well-known/oauth-authorization-server dan /.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 menyertakan verifyWebhook / 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 (QRFlowError dengan status, code, message, retryAfter) dan menyertakan verifikator webhook. Sumber TypeScript satu file masih di /sdk/qrflow.ts jika Anda lebih suka menyimpannya sendiri.
TypeScriptPythonPanggilan
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.

KolomTipeArti
iduuidId stabil. Gunakan di setiap panggilan lain.
labelstring | nullNama di dasbor. Hingga 120 karakter. Dapat dicari dengan?q=.
kindstringId katalog: url, wifi, instagram, googlereview,... kind_label adalah nama yang mudah dibaca manusia.
typestringPengodean: url, text, wifi, vcard, email, phone, sms, location.
destination_dataobjectKolom yang Anda kirim (plus subtype untuk kind). destination adalah ringkasan satu baris darinya.
dynamicbooleanTrue saat pindaian melalui QRFLOW dan tujuan dapat berubah. dynamic_capable menyatakan apakah tipe ini bisa dinamis pada paket berbayar.
short_codestringTujuh karakter, tidak pernah berubah.
short_urlstringYang dicetak untuk kode dinamis. Menyertakan domain dan slug Anda jika diatur.
domain_iduuid | nullDomain tautan mana yang digunakan kode ini saat dicetak; null berarti bawaan akun.
fg_color, bg_colorhexWarna modul dan latar belakang.
has_logobooleanLogo ditambahkan di dasbor; image.svg menyertakannya.
frame_style, frame_caption, frame_caption2string | nullId bingkai dan keterangan, seperti di penyesuai.
scansintegerJumlah pindaian seumur hidup.
created_at, updated_atISO 8601UTC.
manage_urlurlHalaman kode di dasbor, untuk tautan 'Buka di QRFLOW'.
image_urlurlGET /codes/:id/image.svg. Membutuhkan header Authorization; bukan URL gambar publik.
svg_download_url, png_download_urlurlSVG 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.

EventKapandata
scanDikelompokkan: 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.createdSegera dari API dan asisten; dalam beberapa menit dari dasbor. Permintaan massal mengirim satu event dengan bulk: true dan codes[].code, source
code.updatedWaktu yang sama. Mencakup tujuan, label, jeda, kedaluwarsa, nama tautan, domain, warna, bingkai, dan konversi ke dinamis.code, changed[] (nama kolom yang berubah)
code.deletedWaktu yang sama.code: { id, label, short_code, slug }
pingSaat 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 ping bertanda 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.

StatuserrorArti

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 kunci600. 429 dengan Retry-After di luar itu.
Kunci per akun10
Webhook per akun10
Kode tersimpan (penggunaan wajar)1.000 Premium, 25.000 Business; API berhenti pada dua kali lipatnya.
Massal500/bulan (500 per permintaan) Premium; 10.000/bulan (2.000 per permintaan) Business.
Domain tautan1 Premium, 5 Business
PindaiTanpa 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 pindai92 hari per permintaan
Ukuran halaman daftar100 (?limit=)
Label / keterangan / slug120 / 60 / 40 karakter
Waktu tunggu dan percobaan ulang webhook8 detik; percobaan ulang setelah 1, 5, 15, 60, 240 dan 720 menit; mati setelah 20 kegagalan berturut-turut.
Setelah meninggalkan BusinessKunci 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.

URLApa itu
llms-full.txthttps://qrflow.codes/llms-full.txtSeluruh referensi ini sebagai Markdown: konsep, setiap endpoint, setiap alat MCP, resep, pemecahan masalah, FAQ. Dihasilkan dari sumber yang sama dengan halaman ini.
developers.mdhttps://qrflow.codes/developers.mdDokumen yang sama, untuk alat yang mengambil file .md.
llms.txthttps://qrflow.codes/llms.txtIndeks situs untuk asisten, mengarah ke sini.
API dalam satu halamanhttps://qrflow.codes/qr-code-apiApa 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.jsonhttps://qrflow.codes/api/v1/openapi.jsonOpenAPI 3.1. Impor ke Postman, Insomnia, generator kode, atau Tindakan ChatGPT.
Server MCPhttps://qrflow.codes/mcpHTTP yang dapat dialirkan, OAuth dengan registrasi dinamis atau kunci Bisnis sebagai bearer.
server.jsonhttps://qrflow.codes/.well-known/mcp/server.jsonManifes registri MCP.
Penemuan OAuthhttps://qrflow.codes/.well-known/oauth-authorization-serverMetadata RFC 8414; dokumen sumber daya yang dilindungi ada di sebelahnya.
Paket npmhttps://www.npmjs.com/package/qrflownpm install qrflow. Klien bertipe, tanpa dependensi, verifikasi webhook. Klien Python satu file di https://qrflow.codes/sdk/qrflow.py.
GitHubhttps://github.com/nativecodeapps/qrflow-sdkKlien, 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.