Dokumentácia pre partnerov
Všetko potrebné na publikovanie vašich ponúk predaja a výkupu na QuizzBuy a na notifikovanie objednávok pripísaných našej návštevnosti.
1. Získanie API kľúča
Kontaktujte svoju kontaktnú osobu QuizzBuy (alebo kontaktný formulár). Vygenerujeme pre vás kľúč vo formáte zzb_live_… — je vám odovzdaný iba raz, uchovávajte ho na bezpečnom mieste. Odosielajte ho pri každej požiadavke v HTTP hlavičke:
Authorization: Bearer zzb_live_VOTRE_CLE2. Overenie vášho kľúč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. Publikovanie vašich ponúk
Ponuka je buď ponuka výkupu (BUYBACK — vy odkúpite zariadenie za danú cenu), alebo ponuka predaja (SALE — repasovaný produkt, ktorý predávate). Odoslanie je typu upsert: opätovné odoslanie rovnakého externalId ponuku aktualizuje.
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 alebo GAMING.condition: LIKE_NEW, EXCELLENT, GOOD, FAIR alebo BROKEN.priceCents: cena v centoch (52000 = 520 €).- Každá nová ponuka (alebo úprava) prechádza pred publikovaním moderáciou.
Aktualizácia, výpis alebo deaktivácia:
# 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. Sledovanie kliknutí
Keď návštevník QuizzBuy klikne na vašu stránku, príchodová URL obsahuje identifikátor kliknutia:
https://votre-site.fr/vendre?zzb_click=6f1e0c9a-3b2d-4e8f-9a10-abcdef123456Uložte túto hodnotu (cookie alebo relácia na strane vášho webu, odporúčaná doba: 45 dní). Práve ona umožní priradiť objednávku. Názov parametra (predvolene zzb_click) je na požiadanie konfigurovateľný.
5. Notifikácia objednávky (postback S2S)
Hneď ako zákazník zadá objednávku (nákup alebo potvrdená žiadosť o výkup) a máte k dispozícii zzb_click, zavolajte náš postback zo svojho servera:
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 }- Atribučné okno: 45 dní po kliknutí; po jeho uplynutí odpoveď
422 attribution_window_expired. order_refmusí byť jedinečný: duplikát vráti409 duplicate_order_ref(idempotencia — môžete bezpečne skúsiť znova).type:SALEpre nákup,BUYBACKpre výkup.currency: iba EUR — akákoľvek iná mena je odmietnutá (422 unsupported_currency).
6. Testovanie v sandboxe
Pridajte "test": true do postbacku: požiadavka je plne overená (kľúč, click_id, 45-dňové okno), ale žiadna konverzia sa nezaznamená ani nefakturuje.
{ "click_id": "…", "type": "SALE", "amount_cents": 10000, "order_ref": "TEST-1", "test": true }
# → 200 { "test": true, "valid": true, "commission_cents": 500 }7. Chybové kódy
| Kód | Chyba | Vysvetlenie |
|---|---|---|
| 400 | invalid_input | Neplatné telo požiadavky (podrobnosti v odpovedi). |
| 401 | unauthorized | API kľúč chýba, je zrušený alebo neplatný. |
| 404 | click_not_found / not_found | click_id alebo ponuka nie je známa (alebo nie je vaša). |
| 409 | duplicate_order_ref | Objednávka už bola notifikovaná. |
| 422 | attribution_window_expired | Kliknutie staršie ako 45 dní. |
| 429 | rate_limited | Príliš veľa požiadaviek — skúste znova o minútu. |
8. Fakturácia
Každá pripísaná konverzia generuje províziu (zmluvná sadzba, viditeľná cez /api/v1/me). QuizzBuy vám zasiela periodickú súhrnnú faktúru za validované konverzie. V prípade otázok: kontaktujte nás.
9. Marketplace — predaj na QuizzBuy
Ponuky SALE s quantity > 0 sa predávajú priamo na QuizzBuy (platba zákazníka u nás, výplata čistej sumy po odpočítaní provízie). Doplňujúce polia: quantity (sklad), color, grade (A/B/C), batteryHealth (%), warrantyMonths. Ponuka je automaticky priradená k zodpovedajúcej produktovej karte (značka + model + kapacita + farba).
# 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. Webhooky — upozornenie na predaje
Zaregistrujte HTTPS endpoint; upozorníme vás pri každom kroku objednávky obsahujúcej vaše produkty (order.created, order.paid, order.cancelled). Tajný kľúč sa vráti iba pri vytvorení — uložte si ho.
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"Každé doručenie je podpísané. Overte hlavičku 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 prípade zlyhania (≠ 2xx) opakujeme pokusy s postupným predlžovaním: 1 min, 5 min, 30 min, 2 h, 12 h. Dostanete tiež e-mailové upozornenie o predaji.
11. Spracovanie vašich objednávok
Vypíšte si položky objednávky, potvrďte prijatie a následne odošlite so sledovacím číslom (zákazník je notifikovaný automaticky). Dodacia adresa je viditeľná až po zaplatení.
# 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. Riadená reprise (trade-in)
Riadená reprise ide ďalej ako jednoduchý výkup cez presmerovanie: súkromná osoba odošle svoje zariadenie z QuizzBuy a vy riadite celý proces cez API (prijatie, príjem, protiponuka, platba). Cena zobrazená zákazníkovi je pri odoslaní zamknutá podľa vášho cenníka výkupu (pozri §14); zmeniť ju smerom nadol môžete až po prijatí, a to prostredníctvom odôvodnenej protiponuky.
Všetky endpointy sa autentifikujú vaším API kľúčom (Authorization: Bearer zzb_live_…) a vracajú iba vaše prípady.
Životný cyklus
SUBMITTED → ACCEPTED → SHIPPED → RECEIVED → PAID. Dve odbočky: REJECTED (zamietnutie pred odoslaním) a COUNTER_OFFER (protiponuka po inšpekcii, ktorú súkromná osoba prijme — potom PAID — alebo odmietne — vrátenie zariadenia, CANCELLED).
| Stav | Význam |
|---|---|
| SUBMITTED | Žiadosť vytvorená súkromnou osobou, čaká na vaše rozhodnutie. |
| ACCEPTED | Potvrdili ste výkup; zákazník musí zariadenie odoslať. |
| SHIPPED | Súkromná osoba zadala svoje sledovacie číslo. |
| RECEIVED | Prijali ste zariadenie; prebieha inšpekcia. |
| COUNTER_OFFER | Po inšpekcii navrhujete upravenú (nižšiu) sumu. |
| PAID | Platba súkromnej osobe vykonaná — prípad uzavretý. |
| REJECTED | Žiadosť zamietnutá pred odoslaním (nespĺňa podmienky, podvod…). |
| CANCELLED | Zrušené (odmietnutie protiponuky, vrátenie zariadenia). |
Zoznam a nahliadnutie
# 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(voliteľný filter): jedna z hodnôt vyššie uvedenej tabuľky — inak400 invalid_status.limit: max 200 (predvolene 50);offsetpre stránkovanie.customer(kontakt na súkromnú osobu) je viditeľný iba v tomto partnerskom API, nikdy vo webhookoch.
Prechody
Každá akcia je POST a vracia { "ok": true, "trade_in": { … } }. Prechod z nekompatibilného stavu vráti 409 invalid_status (so skutočným current). Súkromná osoba je pri každom kroku notifikovaná e-mailom.
# 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: iba zo stavu
SUBMITTED.shippingLabelUrlvoliteľné (URL, ≤ 500 znakov). - receive: zo stavu
SHIPPEDaleboACCEPTED(odoslanie/podanie neoznámené zákazníkom). - counter: zo stavu
RECEIVED.amountCentsmusí byť striktne nižšie akooffer_cents, inak400 counter_not_lower;reasonpovinné (1–500 znakov). Následne súkromná osoba prijme alebo odmietne zo svojej stránky sledovania. - pay: zo stavu
RECEIVED.payoutRefpovinné (referencia prevodu, 1–120 znakov). - reject: iba zo stavu
SUBMITTED— telo požiadavky sa nevyžaduje.
13. Webhooky reprise (trade_in.*)
Rovnaké webhooky (§10, identická signatúra X-ZZbuy-Signature) pokrývajú riadenú reprise. Pri vytvorení endpointu sa prihláste na všetky alebo časť udalostí 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"]
}'| Udalosť | Spúšťač |
|---|---|
| trade_in.created | Nová žiadosť podaná súkromnou osobou (stav SUBMITTED). |
| trade_in.shipped | Súkromná osoba zadala svoje sledovanie zásielky. |
| trade_in.counter_accepted | Súkromná osoba prijala vašu protiponuku. |
| trade_in.counter_declined | Súkromná osoba odmietla vašu protiponuku (vrátenie zariadenia). |
| trade_in.cancelled | Reprise zrušená. |
Telo doručenia (kontakt na súkromnú osobu sa v ňom nenachádza — získajte ho cez 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. Odoslanie vášho cenníka výkupu
Alternatíva typu „push“ k CSV toku, ktorý ťaháme my: pošlite priamo svoj cenník výkupu. Každý riadok obsahuje 4 sumy podľa stavu zariadenia. Ceny napĺňajú rovnakú tabuľku ako automatická synchronizácia — okamžite sa teda objavia v porovnávači a zároveň slúžia ako zamknutá cena pre riadenú reprise (§12). Operácia je typu upsert podľa (značka, kategória, model, kapacita).
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 až 2000 riadkov na požiadavku.category: SMARTPHONE, TABLET, LAPTOP, SMARTWATCH, AUDIO alebo GAMING.priceNewCents(nové),priceGoodCents(dobré),priceFairCents(opotrebované),priceBrokenCents(rozbité) — v centoch, ≥ 0.storageaurlvoliteľné; kapacita sa automaticky normalizuje (napr. „256go“ → „256 GB“).