Partnerdokumentation
Allt du behöver för att publicera dina försäljnings- och återköpsannonser på QuizzBuy och meddela oss om beställningar som tillskrivs vår trafik.
1. Skaffa en API-nyckel
Kontakta din QuizzBuy-kontakt (eller kontaktformuläret). Vi genererar en nyckel åt dig i formatet zzb_live_… — den visas endast en gång, förvara den på ett säkert ställe. Skicka med den i varje förfrågan i HTTP-headern:
Authorization: Bearer zzb_live_VOTRE_CLE2. Verifiera din nyckel
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. Publicera dina annonser
En annons är antingen ett återköpserbjudande (BUYBACK — du köper tillbaka en enhet till ett givet pris) eller ett försäljningserbjudande (SALE — en renoverad produkt du säljer). Inskickningen är en upsert: att skicka samma externalId igen uppdaterar annonsen.
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 eller GAMING.condition: LIKE_NEW, EXCELLENT, GOOD, FAIR eller BROKEN.priceCents: pris i cent (52000 = 520 €).- Varje ny annons (eller ändring) genomgår moderering innan publicering.
Uppdatera, lista eller inaktivera:
# 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. Klickspårning
När en QuizzBuy-besökare klickar sig vidare till din webbplats innehåller destinations-URL:en ett klick-ID:
https://votre-site.fr/vendre?zzb_click=6f1e0c9a-3b2d-4e8f-9a10-abcdef123456Spara detta värde (cookie eller session på din sida, rekommenderad varaktighet: 45 dagar). Det är detta som gör det möjligt att tillskriva beställningen. Parameterns namn (zzb_click som standard) kan konfigureras på begäran.
5. Meddela en beställning (S2S-postback)
Så snart en kund lägger en beställning (köp eller godkänd återköpsförfrågan) och du har ett zzb_click, anropa vår postback från din server:
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 }- Tillskrivningsfönster: 45 dagar efter klicket; därefter svaras
422 attribution_window_expired. order_refmåste vara unik: en duplikat ger409 duplicate_order_ref(idempotens — du kan försöka igen utan risk).type:SALEför ett köp,BUYBACKför ett återköp.currency: endast EUR — alla andra valutor avvisas (422 unsupported_currency).
6. Testa i sandbox
Lägg till "test": true i postbacken: förfrågan valideras fullständigt (nyckel, click_id, 45-dagarsfönster) men ingen konvertering registreras eller faktureras.
{ "click_id": "…", "type": "SALE", "amount_cents": 10000, "order_ref": "TEST-1", "test": true }
# → 200 { "test": true, "valid": true, "commission_cents": 500 }7. Felkoder
| Kod | Fel | Förklaring |
|---|---|---|
| 400 | invalid_input | Ogiltig förfrågningskropp (detaljer i svaret). |
| 401 | unauthorized | API-nyckel saknas, är återkallad eller ogiltig. |
| 404 | click_not_found / not_found | click_id eller annons okänd (eller inte din). |
| 409 | duplicate_order_ref | Beställning redan anmäld. |
| 422 | attribution_window_expired | Klick äldre än 45 dagar. |
| 429 | rate_limited | För många förfrågningar — försök igen om en minut. |
8. Fakturering
Varje tillskriven konvertering genererar en provision (avtalad taxa, synlig via /api/v1/me). QuizzBuy skickar dig en periodisk sammanfattningsfaktura över godkända konverteringar. Vid frågor: kontakta oss.
9. Marketplace — sälj på QuizzBuy
Annonser av typen SALE med quantity > 0 säljs direkt på QuizzBuy (kundbetalning hos oss, utbetalning av nettobeloppet efter provision). Ytterligare fält: quantity (lager), color, grade (A/B/C), batteryHealth (%), warrantyMonths. Annonsen kopplas automatiskt till motsvarande produktsida (märke + modell + kapacitet + färg).
# 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 — bli meddelad om försäljningar
Registrera en HTTPS-endpoint; vi meddelar dig vid varje steg i en beställning som innehåller dina produkter (order.created, order.paid, order.cancelled). Hemligheten returneras endast vid skapandet — spara den.
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"Varje leverans är signerad. Kontrollera headern 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 minVid misslyckande (≠ 2xx) försöker vi igen med backoff: 1 min, 5 min, 30 min, 2 h, 12 h. Du får även ett e-postmeddelande om försäljningen.
11. Hantera dina beställningar
Lista dina orderrader, bekräfta mottagandet och skicka sedan med ett spårningsnummer (kunden meddelas automatiskt). Leveransadressen visas först efter betalning.
# 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. Hanterad återköp (trade-in)
Hanterad återköp går längre än enkel återköpsomdirigering: privatpersonen skickar in sin enhet via QuizzBuy, och du hanterar hela ärendet via API:et (godkännande, mottagning, motbud, betalning). Priset som visas kunden är låst vid inskickning enligt din återköpstabell (se §14); du kan endast revidera det nedåt efter mottagning via ett motiverat motbud.
Alla endpoints autentiseras med din API-nyckel (Authorization: Bearer zzb_live_…) och returnerar endast dina ärenden.
Livscykel
SUBMITTED → ACCEPTED → SHIPPED → RECEIVED → PAID. Två förgreningar: REJECTED (avslag innan avsändning) och COUNTER_OFFER (motbud efter inspektion, som privatpersonen antingen accepterar — och det blir PAID — eller avvisar — enheten returneras, CANCELLED).
| Status | Betydelse |
|---|---|
| SUBMITTED | Förfrågan skapad av privatpersonen, väntar på ditt beslut. |
| ACCEPTED | Du har bekräftat återköpet; kunden ska skicka enheten. |
| SHIPPED | Privatpersonen har angett sitt spårningsnummer. |
| RECEIVED | Du har tagit emot enheten; inspektion pågår. |
| COUNTER_OFFER | Efter inspektion föreslår du ett reviderat (lägre) belopp. |
| PAID | Betalning utförd till privatpersonen — ärendet avslutat. |
| REJECTED | Förfrågan avvisad innan avsändning (ej godkänd, bedrägeri…). |
| CANCELLED | Avbruten (avvisat motbud, enheten returnerad). |
Lista & visa
# 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(valfritt filter): ett värde från tabellen ovan — annars400 invalid_status.limit: max 200 (standard 50);offsetför paginering.customer(privatpersonens kontaktuppgifter) syns endast via detta partner-API, aldrig i webhooks.
Övergångar
Varje åtgärd är en POST och returnerar { "ok": true, "trade_in": { … } }. En övergång från en oförenlig status ger 409 invalid_status (med det faktiska current-värdet). Privatpersonen meddelas via e-post vid varje steg.
# 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: endast från
SUBMITTED.shippingLabelUrlvalfritt (URL, ≤ 500 tecken). - receive: från
SHIPPEDellerACCEPTED(avlämning/avsändning ej registrerad av kunden). - counter: från
RECEIVED.amountCentsmåste vara strikt lägre änoffer_cents, annars400 counter_not_lower;reasonobligatoriskt (1–500 tecken). Det är sedan privatpersonen som accepterar eller avvisar via sin spårningssida. - pay: från
RECEIVED.payoutRefobligatoriskt (överföringsreferens, 1–120 tecken). - reject: endast från
SUBMITTED— ingen kropp krävs.
13. Webhooks för återköp (trade_in.*)
Samma webhooks (§10, identisk signatur X-ZZbuy-Signature) täcker den hanterade återköpen. Prenumerera på alla eller vissa av händelserna trade_in.* när du skapar en endpoint:
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"]
}'| Händelse | Utlösare |
|---|---|
| trade_in.created | Ny förfrågan inskickad av en privatperson (status SUBMITTED). |
| trade_in.shipped | Privatpersonen har angett sitt frakt-spårningsnummer. |
| trade_in.counter_accepted | Privatpersonen har accepterat ditt motbud. |
| trade_in.counter_declined | Privatpersonen har avvisat ditt motbud (enheten returneras). |
| trade_in.cancelled | Återköp avbrutet. |
Leveransens innehåll (privatpersonens kontaktuppgifter finns inte med — hämta dem via 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. Skicka in din återköpstabell
Ett "push"-alternativ till det CSV-flöde vi hämtar: skicka din återköpsprislista direkt. Varje rad har 4 belopp beroende på enhetens skick. Priserna matar samma tabell som den automatiska synkroniseringen — de visas alltså omedelbart i jämförelseverktyget och fungerar som låst pris för den hanterade återköpen (§12). Åtgärden är en upsert per (märke, kategori, modell, kapacitet).
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 till 2000 rader per förfrågan.category: SMARTPHONE, TABLET, LAPTOP, SMARTWATCH, AUDIO eller GAMING.priceNewCents(ny),priceGoodCents(bra),priceFairCents(märkt),priceBrokenCents(trasig) — i cent, ≥ 0.storageochurlvalfria; kapaciteten normaliseras automatiskt (t.ex. « 256go » → « 256 GB »).