L’API resellflip
Vous envoyez le nom et l’état d’un article. L’API renvoie un prix de revente, sa fourchette, et le nombre de ventes conclues retrouvées pour cet article. Deux routes, des crédits prépayés, pas d’abonnement.
Premier appel en deux minutes
1. Créez une clé
Connectez-vous (ou créez un compte), puis ouvrez l’espace développeur et cliquez sur « Créer une clé ». Copiez-la tout de suite : elle ne s’affiche qu’une fois. Votre première clé vous donne 1 000 crédits offerts, soit 100 estimations, sans carte bancaire.
2. Collez cet appel dans un terminal
Remplacez la clé de la première ligne par la vôtre. Le reste marche tel quel.
export RESELLFLIP_API_KEY="rf_live_collez_votre_cle_ici"
curl https://resellflip.com/api/v1/estimate \
-H "Authorization: Bearer $RESELLFLIP_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Doudoune Uniqlo", "condition": "Bon", "size": "M"}'
3. Lisez la réponse
{
"price": 35,
"price_low": 28,
"price_high": 42,
"confidence": "moyenne",
"category": "Mode",
"comps_count": 0,
"sales_count": 0,
"rotation_days": null,
"rotation_samples": null,
"credits_remaining": 990
}
Les valeurs ci-dessus sont un exemple. Regardez d’abord comps_count : le nombre
d’articles comparables trouvés dans le corpus. sales_count dit combien sont des
ventes conclues ; à 0, aucune vente n’a pesé sur le prix. Notre corpus est jeune : ces
chiffres valent souvent 0 aujourd’hui, et le prix est alors estimé sans comparables.
confidence est l’avis du modèle sur l’article, pas sur le corpus : ce sont ces
deux compteurs qu’il faut tester. L’appel vous a coûté 10 crédits ; votre solde est dans
credits_remaining.
Appelez l’API depuis votre serveur. Dans un navigateur ou une appli installée chez vos utilisateurs, la clé serait lisible par n’importe qui.
Les champs de la réponse
| Champ | Ce qu’il contient |
|---|---|
price |
Le prix de revente conseillé |
price_low, price_high |
La fourchette. Un prix juste est un intervalle. |
confidence |
haute, moyenne ou basse. L’avis du modèle sur
l’article, pas sur le nombre de ventes.
|
category |
La catégorie reconnue |
comps_count |
Le nombre d’articles comparables trouvés : les ventes conclues, ou à défaut les estimations d’articles encore en stock. Peut valoir 0. |
sales_count |
Les ventes conclues trouvées. À 0, aucune vente n’a pesé sur le prix, même quand
comps_count est positif.
|
rotation_days |
Le délai médian entre la mise en stock et la vente, en jours. null tant
qu’il n’y a pas cinq ventes de trois vendeurs distincts : nous préférons ne rien dire
qu’inventer un délai.
|
rotation_samples |
Le nombre de ventes derrière ce délai |
credits_remaining |
Votre solde après l’appel |
Pour un article que le corpus connaît bien, la réponse ressemble plutôt à ceci : sept ventes derrière le prix, et un délai de revente.
{
"price": 50,
"price_low": 40,
"price_high": 60,
"confidence": "haute",
"category": "Mode",
"comps_count": 7,
"sales_count": 7,
"rotation_days": 21,
"rotation_samples": 7,
"credits_remaining": 90
}
Le corpus est filtré avant usage : les dix-huit derniers mois, une seule ligne par vendeur, et jamais de chiffre bâti sur un seul vendeur.
Dans la version 1, nous pouvons ajouter des champs, jamais en retirer ni en renommer. Ignorez ceux que vous ne connaissez pas et votre code ne cassera pas.
Les deux routes
Toutes deux prennent un POST, un corps JSON, et votre clé dans l’en-tête
Authorization: Bearer. Pas de SDK, pas de webhooks, pas de bac à sable :
l’essai se fait sur le vrai corpus.
POST /api/v1/estimate · 10 crédits
Une estimation complète. Le corps JSON :
| Champ | Type | Obligatoire | Contrainte |
|---|---|---|---|
name |
texte | oui, sauf si images |
200 caractères ; la marque en est déduite |
condition |
texte | oui | une valeur de la liste ci-dessous |
size |
texte | non | 30 caractères |
notes |
texte | non | 500 caractères : défauts, détails |
images |
liste d’objets | oui, sauf si name |
3 au plus, format ci-dessous |
gradingService |
texte | non | PSA, BGS, CGC ou SFG |
gradingGrade |
nombre | oui si gradingService |
de 1 à 10, au demi-point |
Un texte trop long est tronqué, pas refusé. Il n’y a pas de champ brand sur
cette route.
condition n’accepte que ces valeurs, écrites exactement ainsi,
accents et majuscule compris. Textile et objets : Neuf, Très bon,
Bon ou Satisfaisant. Cartes à collectionner (échelle Cardmarket) :
Mint, Near Mint, Excellent, Good,
Light Played, Played ou Poor. « Très bon état » ou
« neuf » rendent un 400, sans rien débiter.
images : jusqu’à 3 objets
{ "mime_type", "data" }. data est l’image en base64, sans préfixe
data:. Types acceptés : image/jpeg, image/png ou
image/webp. Chaque data fait au plus 2 800 000 caractères, environ
2 Mo décodé. Une seule image invalide et tout l’appel rend un 400, sans rien
débiter.
{
"condition": "Bon",
"images": [
{ "mime_type": "image/jpeg", "data": "/9j/4AAQSkZJRgABAQ…" }
]
}
POST /api/v1/comps · 1 crédit, 0 si la liste est vide
Les articles comparables bruts, sans estimation, cinq au plus. Chaque ligne porte
kind : sale pour une vente conclue, estimate pour un
article encore en stock. Pour une vente, net_price est le prix
net vendeur : ce que le vendeur a encaissé, frais de la plateforme déduits.
Pour une estimation, c’est le prix que vise son propriétaire.
Le corps porte name, obligatoire (200 caractères), et brand,
facultative (80 caractères). Sans brand, la marque est déduite du nom. Pas de
photo sur cette route : pour reconnaître un article sur une image, utilisez
/estimate. Ajoutez "sold_only": true pour ne recevoir que les
ventes ; par défaut, il vaut false. comps_count et
sales_count ont le même sens que sur /estimate, et peuvent
dépasser cinq.
curl https://resellflip.com/api/v1/comps \
-H "Authorization: Bearer $RESELLFLIP_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Doudoune Uniqlo", "brand": "Uniqlo"}'
Exemple de réponse :
{
"comps": [
{
"name": "Doudoune Uniqlo",
"brand": "Uniqlo",
"condition": "Bon",
"size": "M",
"net_price": 32.5,
"days_ago": 12,
"kind": "sale"
},
{
"name": "Doudoune ultra légère Uniqlo",
"brand": "Uniqlo",
"condition": "Très bon",
"size": "L",
"net_price": 40,
"days_ago": 5,
"kind": "estimate"
}
],
"comps_count": 9,
"sales_count": 9,
"rotation_days": 18,
"rotation_samples": 9,
"credits_remaining": 90
}
Aujourd’hui, vous recevrez souvent une liste vide. C’est un 200, et rien n’est
débité :
{
"comps": [],
"comps_count": 0,
"sales_count": 0,
"rotation_days": null,
"rotation_samples": null,
"credits_remaining": 1000
}
Si le corpus met plus de 2,5 secondes à répondre, vous recevez aussi cette liste vide. Vous ne pouvez donc pas distinguer « aucun article » d’une base lente. Dans les deux cas, rien n’est débité.
Les erreurs
Chaque erreur porte un code stable et un message error lisible.
Testez le code : le message peut changer.
| Statut | code |
Signification | Débité ? |
|---|---|---|---|
400 |
invalid_request |
Corps invalide : champ manquant, état hors liste, photo refusée | Non |
401 |
unauthorized |
Clé absente, inconnue ou révoquée | Non |
402 |
insufficient_credits |
Solde insuffisant pour cet appel | Non |
403 |
account_suspended |
Accès API du compte suspendu : aucune clé ne fonctionne | Non |
404 |
— | Route inconnue de la version 1 | Non |
405 |
— | Méthode autre que POST |
Non |
429 |
rate_limited |
Plus de 60 appels par minute pour cette clé | Non |
500 |
internal_error |
Erreur interne | Remboursé |
502 |
upstream_error |
Le service d’estimation n’a pas répondu | Remboursé |
503 |
unavailable |
Service indisponible | Non |
504 |
upstream_error |
L’estimation a dépassé son délai. Réessayez. | Remboursé |
Un 429 rate_limited porte un en-tête Retry-After, en
secondes. Un 429 upstream_error, plus rare, veut dire que notre
service d’estimation sature : l’appel est remboursé. Le 401 rend le même
message pour une clé absente et une clé inconnue, exprès. « Remboursé » veut dire que les
crédits sont prélevés au début de l’appel puis rendus aussitôt : votre solde ne bouge pas.
Les tarifs
Des crédits prépayés, payés une fois, sans abonnement. Une estimation coûte 10 crédits. Un
appel à /comps en coûte 1, et rien quand il ne trouve rien.
| Formule | Crédits | Estimations | Prix | Par estimation |
|---|---|---|---|---|
| Essai | 1 000 | 100 | Offert | Une fois par compte |
| Pack S | 10 000 | 1 000 | 49 € | 0,049 € |
| Pack M | 100 000 | 10 000 | 390 € | 0,039 € (−20 %) |
| Pack L | 1 000 000 | 100 000 | 2 900 € | 0,029 € (−40 %) |
| Au-delà | — | — | Sur devis | — |
Les crédits n’expirent pas dans la version actuelle de l’offre. Ceux d’un pack que vous n’avez pas utilisés sont remboursables sur demande. Une erreur de notre côté (5xx) ne vous coûte rien. TVA non applicable, article 293 B du CGI : le prix affiché est le prix payé.
Au-delà du pack L, écrivez à contact@resellflip.com. Envoyez-nous aussi vos catégories : nous vous dirons ce que le corpus couvre vraiment chez vous.
Questions fréquentes
Que se passe-t-il quand le corpus ne connaît pas l’article ?
Vous recevez quand même un prix, mais sans article comparable : comps_count et
sales_count valent 0. Le corpus est jeune, donc ça arrive souvent. Lisez ce
champ avant d’afficher le prix à vos utilisateurs.
Un appel qui échoue est-il facturé ?
Non. Une erreur de votre côté (400, 401, 402, 429) ne débite rien. Une erreur du nôtre (500, 502, 504) est remboursée aussitôt. Une indisponibilité (503) n’est pas débitée.
Les crédits expirent-ils ?
Non, pas dans la version actuelle de l’offre. Les crédits d’un pack acheté que vous n’avez pas utilisés sont remboursables sur demande. Les crédits d’essai ne le sont pas.
Puis-je stocker les articles comparables renvoyés ?
Vous pouvez les afficher à vos utilisateurs et les garder le temps de les servir. Vous ne pouvez pas les accumuler pour reconstituer le corpus, les revendre comme base de données, ni interroger l’API en boucle pour l’aspirer, ni vous en servir pour monter un service concurrent d’estimation. Les conditions générales le détaillent.
Que faire si ma clé a fuité ?
Révoquez-la et créez-en une autre. Nous ne gardons que son empreinte, donc nous ne pouvons pas vous la renvoyer. Tout appel signé avec elle débite vos crédits : ne la mettez jamais dans du code qui tourne chez vos utilisateurs.
Conditions
L’usage de l’API est encadré par la section « API pour les professionnels » des
conditions générales : crédits prépayés, usage acceptable, sécurité de la
clé, révocation en cas d’abus. Aucune donnée personnelle de vendeur ne sort par l’API : un
article comparable, c’est un nom d’article, une marque, un état, une taille, un prix, une
ancienneté et sa nature (kind) : vente ou estimation.
Trois usages sont interdits : vous servir de l’API pour proposer un service concurrent
d’estimation de prix de revente, aspirer ou revendre le corpus (en interrogeant
/comps en boucle, par exemple), et contourner les limites avec plusieurs
comptes ou plusieurs clés. Dans ces cas, toutes les clés du compte sont suspendues
sur-le-champ et répondent 403 account_suspended. Les crédits consommés ainsi ne
sont pas remboursés. Ceux d’un pack acheté qui restent sont remboursables comme d’habitude,
moins les crédits consommés en violation.
Déjà un compte ? Connectez-vous, puis ouvrez l’espace développeur.
À lire ensuite : Le label « estimé par resellflip » · Comment on calcule