Dokumentacija za partnerje
Vse, kar potrebujete za objavo svojih oglasov za prodajo in odkup na QuizzBuy ter za obveščanje o naročilih, pripisanih našemu prometu.
1. Pridobitev API ključa
Kontaktirajte svojega sogovornika pri QuizzBuy (ali kontaktni obrazec). Zase ustvarimo ključ v formatu zzb_live_… — sporočen vam bo samo enkrat, zato ga hranite na varnem. Pošljite ga pri vsaki zahtevi v HTTP glavi:
Authorization: Bearer zzb_live_VOTRE_CLE2. Preverjanje vašega ključa
curl https://quizzbuy.com/api/v1/me \
-H "Authorization: Bearer zzb_live_VOTRE_CLE"
# Réponse
{
"company": { "id": "…", "name": "Votre société", "slug": "votre-societe" },
"commission_rate": 0.05,
"click_param": "zzb_click"
}3. Objava vaših oglasov
Oglas je bodisi ponudba za odkup (BUYBACK — prevzamete napravo po določeni ceni) bodisi ponudba za prodajo (SALE — obnovljen izdelek, ki ga prodajate). Pošiljanje je upsert: ponovno pošiljanje istega externalId posodobi oglas.
curl -X POST https://quizzbuy.com/api/v1/listings \
-H "Authorization: Bearer zzb_live_VOTRE_CLE" \
-H "Content-Type: application/json" \
-d '{
"externalId": "ref-interne-123",
"type": "BUYBACK",
"title": "Reprise iPhone 15 Pro 256 Go",
"brand": "Apple",
"model": "iPhone 15 Pro",
"category": "SMARTPHONE",
"storage": "256 GB",
"condition": "GOOD",
"priceCents": 52000,
"currency": "EUR",
"url": "https://votre-site.fr/reprise/iphone-15-pro",
"country": "FR"
}'category: SMARTPHONE, LAPTOP, SMARTWATCH, AUDIO ali GAMING.condition: LIKE_NEW, EXCELLENT, GOOD, FAIR ali BROKEN.priceCents: cena v centih (52000 = 520 €).- Vsak nov oglas (ali sprememba) gre v moderacijo pred objavo.
Posodobitev, izpis ali deaktivacija:
# Lister vos annonces
curl "https://quizzbuy.com/api/v1/listings?type=BUYBACK&status=APPROVED" \
-H "Authorization: Bearer zzb_live_VOTRE_CLE"
# Mise à jour partielle
curl -X PATCH https://quizzbuy.com/api/v1/listings/ID_ANNONCE \
-H "Authorization: Bearer zzb_live_VOTRE_CLE" \
-H "Content-Type: application/json" \
-d '{ "priceCents": 49000 }'
# Désactiver (soft delete)
curl -X DELETE https://quizzbuy.com/api/v1/listings/ID_ANNONCE \
-H "Authorization: Bearer zzb_live_VOTRE_CLE"4. Sledenje klikom
Ko obiskovalec QuizzBuy klikne na povezavo do vašega spletnega mesta, ciljni URL vsebuje identifikator klika:
https://votre-site.fr/vendre?zzb_click=6f1e0c9a-3b2d-4e8f-9a10-abcdef123456Shranite to vrednost (piškotek ali seja na strani vašega spletnega mesta, priporočeno trajanje: 45 dni). Ta vrednost omogoča pripis naročila. Ime parametra (privzeto zzb_click) je na zahtevo mogoče prilagoditi.
5. Obveščanje o naročilu (postback S2S)
Takoj ko stranka odda naročilo (nakup ali potrjena zahteva za odkup) in imate na voljo zzb_click, pokličite naš postback s svojega strežnika:
curl -X POST https://quizzbuy.com/api/v1/postback \
-H "Authorization: Bearer zzb_live_VOTRE_CLE" \
-H "Content-Type: application/json" \
-d '{
"click_id": "6f1e0c9a-3b2d-4e8f-9a10-abcdef123456",
"type": "BUYBACK",
"amount_cents": 52000,
"currency": "EUR",
"order_ref": "CMD-2026-000123"
}'
# Réponse 201
{ "conversion_id": "…", "status": "TO_INVOICE", "commission_cents": 2600 }- Okno pripisa: 45 dni po kliku; po tem obdobju odgovor
422 attribution_window_expired. order_refmora biti edinstven: podvojena vrednost vrne409 duplicate_order_ref(idempotenca — lahko varno poskusite znova).type:SALEza nakup,BUYBACKza odkup.currency: samo EUR — vsaka druga valuta je zavrnjena (422 unsupported_currency).
6. Testiranje v peskovniku
Dodajte "test": true v postback: zahteva je v celoti preverjena (ključ, click_id, 45-dnevno okno), vendar nobena konverzija ni zabeležena niti zaračunana.
{ "click_id": "…", "type": "SALE", "amount_cents": 10000, "order_ref": "TEST-1", "test": true }
# → 200 { "test": true, "valid": true, "commission_cents": 500 }7. Kode napak
| Koda | Napaka | Razlaga |
|---|---|---|
| 400 | invalid_input | Neveljavno telo zahteve (podrobnosti v odgovoru). |
| 401 | unauthorized | API ključ manjka, je preklican ali neveljaven. |
| 404 | click_not_found / not_found | Neznan click_id ali oglas (ali ni vaš). |
| 409 | duplicate_order_ref | Naročilo je že bilo sporočeno. |
| 422 | attribution_window_expired | Klik je star več kot 45 dni. |
| 429 | rate_limited | Preveč zahtev — poskusite znova čez minuto. |
8. Obračunavanje
Vsaka pripisana konverzija ustvari provizijo (pogodbena stopnja, vidna prek /api/v1/me). QuizzBuy vam periodično pošlje zbirni račun potrjenih konverzij. Za vsa vprašanja: kontaktirajte nas.
9. Marketplace — prodaja na QuizzBuy
Oglasi SALE s quantity > 0 se prodajajo neposredno na QuizzBuy (plačilo stranke pri nas, izplačilo neto zneska po odbitku provizije). Dodatna polja: quantity (zaloga), color, grade (A/B/C), batteryHealth (%), warrantyMonths. Oglas se samodejno poveže z ustrezno stranjo izdelka (znamka + model + kapaciteta + barva).
# Mettre à jour le stock (sans re-modération)
curl -X PATCH https://quizzbuy.com/api/v1/listings/ID_ANNONCE/stock \
-H "Authorization: Bearer zzb_live_VOTRE_CLE" \
-H "Content-Type: application/json" \
-d '{ "quantity": 12 }'
# Ajouter une photo (multipart, max 5 × 5 Mo, jpeg/png/webp)
curl -X POST https://quizzbuy.com/api/v1/listings/ID_ANNONCE/images \
-H "Authorization: Bearer zzb_live_VOTRE_CLE" \
-F "file=@photo.jpg"10. Webhooks — obvestila o prodajah
Registrirajte HTTPS končno točko; obveščamo vas ob vsaki fazi naročila, ki vsebuje vaše izdelke (order.created, order.paid, order.cancelled). Skrivnost je vrnjena samo ob ustvarjanju — shranite jo.
curl -X POST https://quizzbuy.com/api/v1/webhooks \
-H "Authorization: Bearer zzb_live_VOTRE_CLE" \
-H "Content-Type: application/json" \
-d '{ "url": "https://votre-site.fr/webhooks/quizzbuy", "events": ["order.paid"] }'
# Réponse (secret affiché une seule fois)
{ "webhook": { "id": "…", "secret": "whsec_…", "events": ["order.paid"] } }
# Tester
curl -X POST https://quizzbuy.com/api/v1/webhooks/ID_WEBHOOK/test \
-H "Authorization: Bearer zzb_live_VOTRE_CLE"Vsaka dostava je podpisana. Preverite glavo X-ZZbuy-Signature (t=timestamp,v1=hex):
// Node.js
const [t, v1] = signature.split(",").map((p) => p.split("=")[1]);
const expected = crypto
.createHmac("sha256", WEBHOOK_SECRET)
.update(`${t}.${rawBody}`)
.digest("hex");
const valid =
crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1)) &&
Math.abs(Date.now() / 1000 - Number(t)) < 300; // anti-replay 5 minV primeru neuspeha (≠ 2xx) ponovno poskusimo z zamikom: 1 min, 5 min, 30 min, 2 h, 12 h. Prejmete tudi e-poštno obvestilo o prodaji.
11. Obdelava vaših naročil
Izpišite svoje postavke naročil, potrdite prejem in nato odpošljite s sledilno številko (stranka je samodejno obveščena). Naslov za dostavo je viden šele po plačilu.
# Lister les commandes à traiter
curl "https://quizzbuy.com/api/v1/orders?status=PENDING" \
-H "Authorization: Bearer zzb_live_VOTRE_CLE"
# Accuser réception
curl -X POST https://quizzbuy.com/api/v1/orders/ID_LIGNE/ack \
-H "Authorization: Bearer zzb_live_VOTRE_CLE"
# Expédier
curl -X POST https://quizzbuy.com/api/v1/orders/ID_LIGNE/ship \
-H "Authorization: Bearer zzb_live_VOTRE_CLE" \
-H "Content-Type: application/json" \
-d '{ "carrier": "Colissimo", "trackingNumber": "6A123456789FR" }'12. Upravljana reprevzem (trade-in)
Upravljana reprevzem gre dlje kot preprost odkup prek preusmeritve: posameznik odda svojo napravo prek QuizzBuy, vi pa celoten postopek vodite prek API-ja (sprejem, prejem, protiponudba, plačilo). Cena, prikazana stranki, je zaklenjena ob oddaji na podlagi vaše cenovne tabele za odkup (glejte §14); znižate jo lahko šele po prejemu, z utemeljeno protiponudbo.
Vse končne točke se avtenticirajo z vašim API ključem (Authorization: Bearer zzb_live_…) in vrnejo samo vaše zadeve.
Življenjski cikel
SUBMITTED → ACCEPTED → SHIPPED → RECEIVED → PAID. Dve razvejitvi: REJECTED (zavrnitev pred pošiljanjem) in COUNTER_OFFER (protiponudba po pregledu, ki jo posameznik sprejme — nato PAID — ali zavrne — vrnitev naprave, CANCELLED).
| Status | Pomen |
|---|---|
| SUBMITTED | Zahtevo je ustvaril posameznik, čaka na vašo odločitev. |
| ACCEPTED | Potrdili ste odkup; stranka mora odposlati napravo. |
| SHIPPED | Posameznik je vnesel svojo sledilno številko. |
| RECEIVED | Prejeli ste napravo; pregled je v teku. |
| COUNTER_OFFER | Po pregledu predlagate popravljen (nižji) znesek. |
| PAID | Plačilo posamezniku je izvedeno — zadeva zaključena. |
| REJECTED | Zahteva zavrnjena pred pošiljanjem (ni upravičena, goljufija …). |
| CANCELLED | Preklicano (zavrnitev protiponudbe, vrnitev naprave). |
Izpis in vpogled
# Lister vos reprises (plus récentes d'abord)
curl "https://quizzbuy.com/api/v1/trade-ins?status=SUBMITTED&limit=50&offset=0" \
-H "Authorization: Bearer zzb_live_VOTRE_CLE"
# Réponse
{
"total": 3,
"trade_ins": [
{
"trade_in_id": "…",
"reference": "TI-2026-000042",
"status": "SUBMITTED",
"device": {
"brand": "Apple", "category": "SMARTPHONE", "model": "iPhone 15 Pro",
"storage": "256 GB", "condition": "GOOD",
"functional_status": "FULLY_WORKING", "battery_health": 92, "imei": "…"
},
"offer_cents": 52000,
"currency": "EUR",
"price_locked_until": "2026-08-05T12:00:00.000Z",
"country": "FR",
"customer": { "email": "…", "first_name": "…", "last_name": "…", "locale": "fr" },
"comment": null,
"counter_offer_cents": null, "counter_reason": null,
"tracking_carrier": null, "tracking_number": null,
"shipping_label_url": null, "payout_ref": null,
"accepted_at": null, "shipped_at": null, "received_at": null,
"paid_at": null, "cancelled_at": null,
"created_at": "2026-07-21T12:00:00.000Z"
}
]
}
# Détail d'une reprise
curl https://quizzbuy.com/api/v1/trade-ins/ID_REPRISE \
-H "Authorization: Bearer zzb_live_VOTRE_CLE"
# → { "trade_in": { … } }status(neobvezen filter): ena od vrednosti iz zgornje tabele — sicer400 invalid_status.limit: največ 200 (privzeto 50);offsetza straničenje.customer(kontakt posameznika) je viden samo prek tega partnerskega API-ja, nikoli v webhookih.
Prehodi
Vsaka akcija je POST in vrne { "ok": true, "trade_in": { … } }. Prehod iz neustreznega statusa vrne 409 invalid_status (z dejanskim current). Posameznik je ob vsaki fazi obveščen po e-pošti.
# 1. Accepter (depuis SUBMITTED) — shippingLabelUrl facultatif (étiquette prépayée)
curl -X POST https://quizzbuy.com/api/v1/trade-ins/ID_REPRISE/accept \
-H "Authorization: Bearer zzb_live_VOTRE_CLE" \
-H "Content-Type: application/json" \
-d '{ "shippingLabelUrl": "https://votre-site.fr/labels/ti-42.pdf" }'
# 2. Réceptionner l'appareil (depuis SHIPPED ou ACCEPTED)
curl -X POST https://quizzbuy.com/api/v1/trade-ins/ID_REPRISE/receive \
-H "Authorization: Bearer zzb_live_VOTRE_CLE"
# 3a. Payer le montant garanti (depuis RECEIVED) — clôt la reprise
curl -X POST https://quizzbuy.com/api/v1/trade-ins/ID_REPRISE/pay \
-H "Authorization: Bearer zzb_live_VOTRE_CLE" \
-H "Content-Type: application/json" \
-d '{ "payoutRef": "VIR-2026-000123" }'
# 3b. …ou contre-offrer après inspection (depuis RECEIVED) — montant < offre garantie
curl -X POST https://quizzbuy.com/api/v1/trade-ins/ID_REPRISE/counter \
-H "Authorization: Bearer zzb_live_VOTRE_CLE" \
-H "Content-Type: application/json" \
-d '{ "amountCents": 42000, "reason": "Rayures écran non déclarées" }'
# Refuser avant envoi (depuis SUBMITTED uniquement)
curl -X POST https://quizzbuy.com/api/v1/trade-ins/ID_REPRISE/reject \
-H "Authorization: Bearer zzb_live_VOTRE_CLE"- accept: samo iz
SUBMITTED.shippingLabelUrlneobvezen (URL, ≤ 500 znakov). - receive: iz
SHIPPEDaliACCEPTED(oddaja/pošiljanje, ki ga stranka ni prijavila). - counter: iz
RECEIVED.amountCentsmora biti strogo nižji odoffer_cents, sicer400 counter_not_lower;reasonobvezen (1–500 znakov). Nato posameznik na svoji strani za sledenje sprejme ali zavrne ponudbo. - pay: iz
RECEIVED.payoutRefobvezen (referenca nakazila, 1–120 znakov). - reject: samo iz
SUBMITTED— telo ni potrebno.
13. Webhooks za reprevzem (trade_in.*)
Isti webhooki (§10, enak podpis X-ZZbuy-Signature) pokrivajo upravljano reprevzem. Ob ustvarjanju končne točke se naročite na vse ali del dogodkov trade_in.*:
curl -X POST https://quizzbuy.com/api/v1/webhooks \
-H "Authorization: Bearer zzb_live_VOTRE_CLE" \
-H "Content-Type: application/json" \
-d '{
"url": "https://votre-site.fr/webhooks/quizzbuy",
"events": ["trade_in.created", "trade_in.shipped", "trade_in.counter_accepted"]
}'| Dogodek | Sprožilec |
|---|---|
| trade_in.created | Nova zahteva, ki jo je oddal posameznik (status SUBMITTED). |
| trade_in.shipped | Posameznik je vnesel svojo sledilno številko pošiljke. |
| trade_in.counter_accepted | Posameznik je sprejel vašo protiponudbo. |
| trade_in.counter_declined | Posameznik je zavrnil vašo protiponudbo (vrnitev naprave). |
| trade_in.cancelled | Reprevzem preklican. |
Telo dostave (kontakt posameznika ni vključen — pridobite ga prek GET /api/v1/trade-ins/:id):
{
"trade_in_id": "…",
"reference": "TI-2026-000042",
"status": "SHIPPED",
"device": {
"brand": "Apple", "category": "SMARTPHONE", "model": "iPhone 15 Pro",
"storage": "256 GB", "condition": "GOOD",
"functional_status": "FULLY_WORKING", "battery_health": 92, "imei": "…"
},
"offer_cents": 52000,
"currency": "EUR",
"price_locked_until": "2026-08-05T12:00:00.000Z",
"country": "FR"
}14. Pošiljanje vaše cenovne tabele za odkup
Alternativa »push« namesto CSV toka, ki ga sami pridobivamo: neposredno pošljite svojo cenovno tabelo za odkup. Vsaka vrstica vsebuje 4 zneske glede na stanje naprave. Cene napajajo isto tabelo kot samodejna sinhronizacija — zato se takoj pojavijo v primerjalniku in služijo kot zaklenjena cena za upravljano reprevzem (§12). Operacija je upsert po (znamka, kategorija, model, kapaciteta).
curl -X PUT https://quizzbuy.com/api/v1/buyback/prices \
-H "Authorization: Bearer zzb_live_VOTRE_CLE" \
-H "Content-Type: application/json" \
-d '{
"prices": [
{
"brand": "Apple",
"category": "SMARTPHONE",
"model": "iPhone 15 Pro",
"storage": "256 GB",
"priceNewCents": 60000,
"priceGoodCents": 52000,
"priceFairCents": 40000,
"priceBrokenCents": 15000,
"currency": "EUR",
"url": "https://votre-site.fr/reprise/iphone-15-pro"
}
]
}'
# Réponse
{ "ok": true, "upserted": 1 }prices: 1 do 2000 vrstic na zahtevo.category: SMARTPHONE, TABLET, LAPTOP, SMARTWATCH, AUDIO ali GAMING.priceNewCents(novo),priceGoodCents(dobro),priceFairCents(rabljeno),priceBrokenCents(pokvarjeno) — v centih, ≥ 0.storageinurlneobvezno; kapaciteta se samodejno normalizira (npr. »256go« → »256 GB«).