Kumppanidokumentaatio
Kaikki tarvittava myynti- ja lunastusilmoitustesi julkaisemiseen QuizzBuylla sekä liikenteellemme kohdistettujen tilausten ilmoittamiseen.
1. Hanki API-avain
Ota yhteyttä QuizzBuy-yhteyshenkilöösi (tai yhteydenottolomakkeeseen). Luomme sinulle avaimen muodossa zzb_live_… — se annetaan sinulle vain kerran, säilytä se turvallisessa paikassa. Lähetä se jokaisessa pyynnössä HTTP-otsikossa:
Authorization: Bearer zzb_live_VOTRE_CLE2. Tarkista avaimesi
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. Julkaise ilmoituksesi
Ilmoitus on joko lunastustarjous (BUYBACK — otat laitteen vastaan tiettyyn hintaan) tai myyntitarjous (SALE — kunnostettu tuote, jota myyt). Lähetys on upsert-toiminto: saman externalId:n uudelleenlähetys päivittää ilmoituksen.
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 tai GAMING.condition: LIKE_NEW, EXCELLENT, GOOD, FAIR tai BROKEN.priceCents: hinta senteissä (52000 = 520 €).- Jokainen uusi ilmoitus (tai muutos) käy läpi moderoinnin ennen julkaisua.
Päivittäminen, listaaminen tai poistaminen käytöstä:
# 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. Klikkausten seuranta
Kun QuizzBuy-kävijä klikkaa sivustollesi, saapumis-URL sisältää klikkaustunnisteen:
https://votre-site.fr/vendre?zzb_click=6f1e0c9a-3b2d-4e8f-9a10-abcdef123456Tallenna tämä arvo (eväste tai istunto sivustollasi, suositeltu kesto: 45 päivää). Se mahdollistaa tilauksen kohdistamisen. Parametrin nimi (zzb_click oletuksena) on muokattavissa pyynnöstä.
5. Ilmoita tilauksesta (postback S2S)
Heti kun asiakas tekee tilauksen (ostos tai vahvistettu lunastuspyyntö) ja sinulla on zzb_click, kutsu postbackiamme palvelimeltasi:
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 }- Kohdistusikkuna: 45 päivää klikkauksen jälkeen; sen jälkeen vastaus
422 attribution_window_expired. order_refon oltava yksilöllinen: kaksoiskappale palauttaa409 duplicate_order_ref(idempotenssi — voit yrittää uudelleen ilman riskiä).type:SALEostokselle,BUYBACKlunastukselle.currency: vain EUR — mikä tahansa muu valuutta hylätään (422 unsupported_currency).
6. Testaa sandbox-ympäristössä
Lisää "test": true postbackiin: pyyntö validoidaan kokonaan (avain, click_id, 45 päivän ikkuna), mutta mitään konversiota ei tallenneta eikä laskuteta.
{ "click_id": "…", "type": "SALE", "amount_cents": 10000, "order_ref": "TEST-1", "test": true }
# → 200 { "test": true, "valid": true, "commission_cents": 500 }7. Virhekoodit
| Koodi | Virhe | Selitys |
|---|---|---|
| 400 | invalid_input | Virheellinen pyynnön runko (yksityiskohdat vastauksessa). |
| 401 | unauthorized | API-avain puuttuu, on kumottu tai virheellinen. |
| 404 | click_not_found / not_found | click_id tai ilmoitus tuntematon (tai ei sinun). |
| 409 | duplicate_order_ref | Tilaus jo ilmoitettu. |
| 422 | attribution_window_expired | Klikkaus yli 45 päivän ikäinen. |
| 429 | rate_limited | Liikaa pyyntöjä — yritä uudelleen minuutin kuluttua. |
8. Laskutus
Jokainen kohdistettu konversio tuottaa komission (sopimusperusteinen korko, näkyy osoitteessa /api/v1/me). QuizzBuy lähettää sinulle säännöllisen yhteenvetolaskun vahvistetuista konversioista. Kysymyksissä: ota yhteyttä.
9. Marketplace — myynti QuizzBuylla
SALE-ilmoitukset, joissa quantity > 0, myydään suoraan QuizzBuyn kautta (asiakas maksaa meille, komission netto tilitetään sinulle). Lisäkentät: quantity (varasto), color, grade (A/B/C), batteryHealth (%), warrantyMonths. Ilmoitus liitetään automaattisesti vastaavaan tuotesivuun (merkki + malli + kapasiteetti + väri).
# 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. Webhookit — saa ilmoitus myynneistä
Rekisteröi HTTPS-päätepiste; ilmoitamme sinulle jokaisesta tuotteitasi sisältävän tilauksen vaiheesta (order.created, order.paid, order.cancelled). Salaisuus palautetaan vain luonnin yhteydessä — tallenna se.
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"Jokainen toimitus on allekirjoitettu. Tarkista otsikko 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 minEpäonnistumisen tapauksessa (≠ 2xx) yritämme uudelleen viiveellä: 1 min, 5 min, 30 min, 2 h, 12 h. Saat myös myynti-ilmoituksen sähköpostitse.
11. Käsittele tilauksesi
Listaa tilausrivisi, kuittaa vastaanotto ja lähetä sitten seurantanumerolla (asiakkaalle ilmoitetaan automaattisesti). Toimitusosoite näkyy vasta maksun jälkeen.
# 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. Hallinnoitu lunastus (trade-in)
Hallinnoitu lunastus menee pidemmälle kuin yksinkertainen ohjauksella tehtävä lunastus: yksityishenkilö lähettää laitteensa QuizzBuyn kautta, ja sinä hallinnoit koko prosessia API:n avulla (hyväksyntä, vastaanotto, vastatarjous, maksu). Asiakkaalle näytetty hinta lukitaan lähetyshetkellä lunastushinnastostasi (katso §14); voit alentaa sitä vasta vastaanoton jälkeen perustellulla vastatarjouksella.
Kaikki päätepisteet tunnistautuvat API-avaimellasi (Authorization: Bearer zzb_live_…) ja palauttavat vain sinun tapauksesi.
Elinkaari
SUBMITTED → ACCEPTED → SHIPPED → RECEIVED → PAID. Kaksi haaraa: REJECTED (kieltäytyminen ennen lähetystä) ja COUNTER_OFFER (vastatarjous tarkastuksen jälkeen, jonka yksityishenkilö joko hyväksyy — sitten PAID — tai hylkää — laite palautetaan, CANCELLED).
| Tila | Merkitys |
|---|---|
| SUBMITTED | Yksityishenkilön luoma pyyntö, odottaa päätöstäsi. |
| ACCEPTED | Olet vahvistanut lunastuksen; asiakkaan tulee lähettää laite. |
| SHIPPED | Yksityishenkilö on ilmoittanut seurantanumeronsa. |
| RECEIVED | Olet vastaanottanut laitteen; tarkastus käynnissä. |
| COUNTER_OFFER | Tarkastuksen jälkeen ehdotat tarkistettua (alempaa) summaa. |
| PAID | Maksu suoritettu yksityishenkilölle — tapaus suljettu. |
| REJECTED | Pyyntö hylätty ennen lähetystä (ei kelpaa, petos…). |
| CANCELLED | Peruutettu (vastatarjouksen hylkääminen, laitteen palautus). |
Listaa & tarkastele
# 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(valinnainen suodatin): jokin yllä olevan taulukon arvo — muuten400 invalid_status.limit: enintään 200 (oletus 50);offsetsivutukseen.customer(yksityishenkilön yhteystiedot) näkyy vain tässä kumppani-API:ssa, ei koskaan webhookeissa.
Siirtymät
Jokainen toiminto on POST ja palauttaa { "ok": true, "trade_in": { … } }. Siirtymä yhteensopimattomasta tilasta palauttaa 409 invalid_status (todellisen current-arvon kanssa). Yksityishenkilölle ilmoitetaan sähköpostitse jokaisessa vaiheessa.
# 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: vain tilasta
SUBMITTED.shippingLabelUrlvalinnainen (URL, ≤ 500 merkkiä). - receive: tilasta
SHIPPEDtaiACCEPTED(asiakkaan ilmoittamaton lähetys/toimitus). - counter: tilasta
RECEIVED.amountCentson oltava ehdottomasti pienempi kuinoffer_cents, muuten400 counter_not_lower;reasonpakollinen (1–500 merkkiä). Tämän jälkeen yksityishenkilö hyväksyy tai hylkää sen seurantasivultaan. - pay: tilasta
RECEIVED.payoutRefpakollinen (tilisiirron viite, 1–120 merkkiä). - reject: vain tilasta
SUBMITTED— ei vaadittua runkoa.
13. Lunastuksen webhookit (trade_in.*)
Samat webhookit (§10, sama X-ZZbuy-Signature-allekirjoitus) kattavat hallinnoidun lunastuksen. Tilaa kaikki tai osa trade_in.*-tapahtumista päätepisteen luonnin yhteydessä:
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"]
}'| Tapahtuma | Laukaisin |
|---|---|
| trade_in.created | Yksityishenkilön lähettämä uusi pyyntö (tila SUBMITTED). |
| trade_in.shipped | Yksityishenkilö on ilmoittanut lähetyksen seurantatiedot. |
| trade_in.counter_accepted | Yksityishenkilö on hyväksynyt vastatarjouksesi. |
| trade_in.counter_declined | Yksityishenkilö on hylännyt vastatarjouksesi (laite palautetaan). |
| trade_in.cancelled | Lunastus peruutettu. |
Toimituksen runko (yksityishenkilön yhteystieto ei sisälly siihen — hae se osoitteesta 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. Lähetä lunastushinnastosi
Vaihtoehtoinen "push"-tapa CSV-vetoiselle prosessillemme: lähetä lunastushinnastosi suoraan. Jokaisella rivillä on 4 summaa laitteen kunnon mukaan. Hinnat syötetään samaan tauluun kuin automaattinen synkronointi — ne näkyvät siis heti vertailussa ja toimivat lukittuna hintana hallinnoidulle lunastukselle (§12). Toiminto on upsert (merkki, kategoria, malli, kapasiteetti) -yhdistelmän perusteella.
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–2000 riviä per pyyntö.category: SMARTPHONE, TABLET, LAPTOP, SMARTWATCH, AUDIO tai GAMING.priceNewCents(uusi),priceGoodCents(hyvä),priceFairCents(merkkejä),priceBrokenCents(rikki) — senteissä, ≥ 0.storagejaurlvalinnaisia; kapasiteetti normalisoidaan automaattisesti (esim. « 256go » → « 256 GB »).