Objets (Livre de police)
L'API Objets permet de gérer les entrées du livre de police numérique : enregistrement d'objets mobiliers, suivi du stock et des ventes, gestion des photos et documents vendeur.
Chaque objet reçoit automatiquement un numéro d'ordre séquentiel, conforme aux exigences réglementaires. La numérotation est propre à chaque établissement : si vous gérez plusieurs établissements, chacun a sa séquence indépendante (1, 2, 3... ou 2026-1, 2026-2... en mode annuel). Les informations du vendeur sont intégrées directement dans l'objet.
Scope — La clé API utilisée détermine l'établissement ciblé. Toutes les opérations (création, lecture, audit) sont scopées au livre de police de cet établissement.
Régimes juridiques
Chaque objet porte un ou plusieurs régimes juridiques qui déterminent les règles applicables (mentions obligatoires, seuils de paiement, obligations déclaratives, etc.). Les régimes disponibles dépendent de l'activité configurée sur l'établissement de la clé API utilisée.
| Valeur | Régime correspondant |
|---|---|
OBJETS_OCCASION | Livre de police — art. 321-7 du Code pénal |
METAUX_PRECIEUX | Régime de garantie — art. L834-6 du Code de commerce (douanes) |
METAUX_FERREUX_ET_NON_FERREUX | Interdiction espèces L112-6 CMF + déclaration annuelle 2093 (art. 1649 bis CGI) |
Règles métier :
- Le champ
regimesest obligatoire via l'API (400 REGIMES_REQUISs'il manque). Vous décidez ce qui entre au livre de police : nous ne le devinons pas à votre place. regimes: []— tableau explicitement vide — signifie « aucun régime » : l'objet est tenu en stock et ne figure pas au livre de police. Il est absent de la consultation du registre et de l'extrait imprimé, mais il se relit parGET /api/objets/{id}et figure dans l'export du stock — il existe bel et bien.- L'option se règle depuis votre compte, dans la gestion du stock. Si elle est fermée :
400 HORS_REGISTRE_NON_AUTORISE. - Un objet hors registre ne consomme pas de numéro d'ordre : il relève d'une séquence d'inventaire distincte, préfixée
INV-. La numérotation du livre de police reste continue. - Une valeur qui ne figure pas dans les
regimesActifsde l'établissement est refusée :400 REGIME_NON_ACTIF, avec la liste des régimes actifs dans le champregimesActifsde la réponse. Un régime détermine des obligations propres (prix d'achat obligatoire, plafonds de paiement en espèces, déclaration annuelle) : l'ignorer silencieusement laisserait croire que l'entrée y est soumise alors qu'elle ne le sera jamais. - Les régimes disponibles dépendent de l'activité — un professionnel de l'automobile ne peut pas déclarer
METAUX_PRECIEUX. Voir la page Modèles pour la correspondance activité / régimes. - En modification (
PUT), les régimes déjà portés par l'entrée restent acceptés, même s'ils ont été désactivés sur l'établissement depuis — sans quoi les entrées anciennes deviendraient inéditables. - Le régime détermine la validation du prix (voir ci-dessous) et les warnings affichés dans l'UI.
Lire un objet
GET /api/objets/{id}
GET /api/objets/ref:{votre référence}
Rend une entrée, avec toutes ses mentions, ses mouvements, ses pièces jointes et son historique. Voir le type ObjetMobilier pour la structure complète. Une entrée supprimée se relit par son {id}, pas par sa référence.
L'API ne liste pas le registre : un connecteur relit une entrée à la fois, celle qu'il vient d'écrire ou celle qu'il doit resynchroniser. L'extraction du registre complet se fait depuis l'interface Registeo, par l'administrateur (PDF ou CSV).
Chaque lecture est inscrite au journal des consultations, comme l'ouverture d'une fiche à l'écran (voir Audit).
Réponse 200
L'objet. 404 Objet introuvable si l'identifiant ou la référence ne désigne aucune entrée de l'établissement.
Créer un objet
Enregistre un nouvel objet dans le livre de police. Le numero est attribué automatiquement.
POST /api/objets
Champ obligatoire : agent
{ "agent": "Marie Dupont", "designation": "…" }
L'arrêté du 15 mai 2020 impose que toute mutation du livre de police (création, modification, suppression, mouvement) soit attribuée à une personne physique identifiable. Comme votre clé API est partagée entre toutes les opérations de votre établissement, vous devez transmettre l'identité de l'agent, dans le corps de la requête, sur chaque appel d'écriture :
POST /api/objets(création d'entrée)PUT /api/objets/:id(modification)DELETE /api/objets/:id(suppression motivée)DELETE /api/objets/:id/photos(retrait d'une photo)POST /api/objets/:id/mouvements(sortie, vente, mise en réparation, etc.)PUT /api/objets/:id/mouvements/:id/resolve(annulation d'un mouvement)
Indiquez le prénom et le nom de la personne qui a procédé à l'opération (ex. Marie Dupont). Elle n'a pas besoin d'avoir un compte Registeo : un vendeur en boutique, un opérateur d'entrepôt conviennent. En revanche, ni identifiant interne, ni pseudo, ni valeur générique du type API ou système : un humain identifiable et joignable en cas de contrôle par les forces de l'ordre.
La valeur est inscrite au registre telle que vous l'envoyez. Transmettez donc toujours la même graphie pour une même personne.
| Situation | Réponse |
|---|---|
Champ agent absent ou vide | 400 MISSING_AGENT |
Ce contrôle est délibéré : votre intégration ne peut pas s'en exonérer. La traçabilité légale repose dessus, et chaque entrée du journal d'audit porte le nom de l'agent ayant effectué la modification.
Champs principaux
| Champ | Type | Requis | Description |
|---|---|---|---|
typeOperation | string | Non | achat (défaut), dépôt, reprise, échange, don (acquisition à titre gratuit, au sens de R. 321-5). Certaines activités n'en admettent qu'une partie — un récupérateur de métaux achète, il ne prend pas en dépôt. Une opération hors périmètre est refusée en 400 OPERATION_NON_AUTORISEE, avec la liste des opérations admises. |
agent | string | Oui | Prénom et nom de la personne ayant procédé à l'opération. Voir ci-dessus. |
designation | string | Oui | Description de l'objet |
marques | string | Non | Marques, signes distinctifs, état |
provenanceDeclaree | string | Non | Provenance déclarée par le vendeur |
protectionPatrimoine | string | Non | Mesure de protection au titre du code du patrimoine, si le vendeur en a fait connaître une (R. 321-5, 2°) |
quantite | number | Non | Quantité (défaut : 1) |
prixAchat | number | Oui | Prix d'achat en euros — ou, quand l'opération ne se règle pas (dépôt, échange, don), l'estimation de la valeur vénale que R. 321-5 met à sa place. Une entrée porte toujours l'un ou l'autre. |
modePaiement | string | Oui* | virement, chèque, espèces, carte, autre. Les espèces sont contrôlées — voir ci-dessous. *Sauf dépôt, échange et don : R. 321-5 y remplace prix et règlement par une estimation de la valeur vénale, portée par prixAchat. |
dateAchat | string | Oui | Date d'achat (ISO 8601) |
regimes | string[] | Oui | Régimes juridiques applicables à cette entrée. Voir Régimes juridiques. [] : hors livre de police. |
champsActivite | object | Non | Champs spécifiques à l'activité (ex : IMEI, VIN, poinçon, poids/titre métaux…). Clés restreintes — voir ci-dessous. |
stockMetadata | object | Non | Valeurs de vos champs personnalisés d'inventaire, à la création. Hors livre de police — voir ci-dessous. |
Règlement en espèces
L'article L112-6 du Code monétaire et financier encadre le paiement en espèces, et l'API applique ces limites à l'écriture :
| Régime de l'entrée | Règle |
|---|---|
| Métaux ferreux et non ferreux | Espèces interdites, sans seuil → 400 PAIEMENT_ESPECES_INTERDIT |
| Autres régimes | Plafond légal face à un vendeur particulier → 400 PAIEMENT_ESPECES_PLAFONNE |
Le montant retenu est le total de l'entrée (prixAchat × quantite), pas le prix unitaire. Le plafond ne s'applique pas à un vendeur professionnel.
Ce contrôle est volontairement bloquant : un registre qui enregistre un règlement illégal en constitue la preuve, scellée et horodatée. Mieux vaut refuser l'écriture que produire cette pièce.
Cohérence des dates
dateAchatne peut pas être postérieure à aujourd'hui →400 DATE_ACHAT_FUTURE.- La date d'un mouvement ne peut ni précéder la date d'entrée de l'objet (
400 DATE_MOUVEMENT_ANTERIEURE), ni être dans le futur (400 DATE_MOUVEMENT_FUTURE).
La comparaison se fait à la journée près, pour rester tolérante aux fuseaux horaires.
Pièces jointes
Les clés transmises dans photoKeys, vendeurDocumentKeys, signatureKey ou documentKeys doivent correspondre à des fichiers réellement envoyés par votre établissement via upload-photo. Une clé inconnue est refusée en 400 FICHIER_INTROUVABLE — sans quoi le registre citerait une pièce justificative introuvable, ce qui ne se découvrirait qu'au contrôle.
Clés autorisées dans champsActivite
Les clés acceptées dépendent de l'activité de votre établissement et de ses régimes actifs : poincon pour un bijoutier, vin pour un professionnel de l'automobile, poidsMetaux et titreMetaux dès que le régime métaux précieux est actif. La liste exhaustive par activité est publiée sur la page Modèles.
Une clé qui n'appartient ni à votre activité ni à vos régimes est refusée : l'API renvoie 400 CHAMPS_ACTIVITE_INVALIDES en nommant le champ fautif et les champs acceptés.
{
"success": false,
"code": "CHAMPS_ACTIVITE_INVALIDES",
"message": "Champ inconnu pour l'activité « automobile » : epoque. Champs acceptés : vin, immatriculation, carteGrise, controleTechnique."
}
Ce refus est volontaire : une clé inconnue serait enregistrée sans jamais apparaître ni dans le registre, ni dans le PDF remis lors d'un contrôle. Mieux vaut une erreur à l'intégration qu'une donnée perdue en silence.
En modification (PUT), les clés déjà portées par l'entrée restent acceptées même si l'activité de l'établissement a changé depuis — sans quoi les entrées anciennes deviendraient inéditables.
Champs personnalisés (stockMetadata)
Les champs que vous avez définis dans la gestion du stock (emplacement, prix conseillé, mise en vitrine…) se renseignent à la création : "stockMetadata": { "<clé>": valeur }, avec les clés de vos champs.
Ce sont des données d'inventaire : elles ne figurent pas au livre de police et ne sont pas scellées dans le journal d'audit. Elles se modifient ensuite librement depuis votre espace.
| Type du champ | Valeur attendue |
|---|---|
| Texte | chaîne |
| Nombre | nombre, ou chaîne numérique ("12,50" accepté) |
| Date | YYYY-MM-DD |
| Oui / non | true / false ("oui", "non", 1, 0 acceptés) |
Une clé inconnue, une valeur du mauvais type, ou des champs personnalisés envoyés alors que la gestion du stock n'est pas activée sont refusés avant l'écriture (400 STOCK_METADATA_INVALIDE, 400 STOCK_DESACTIVE), sans consommer de numéro d'ordre — pour la même raison qu'avec champsActivite : une valeur perdue en silence est pire qu'une erreur à l'intégration.
Vendeur particulier
| Champ | Type | Requis | Description |
|---|---|---|---|
vendeurType | string | Oui | particulier |
vendeurNom | string | Oui | Prénom et nom |
vendeurQualite | string | Oui | Qualité au sens de R. 321-3 : profession du vendeur |
vendeurDateNaissance | string | Non | Date de naissance (ISO 8601) |
vendeurLieuNaissance | string | Non | Lieu de naissance |
vendeurNationalite | string | — | Ignoré. Plus collecté (voir l'encadré ci-dessous) |
vendeurAdresse | string | Oui | Domicile |
vendeurIdentiteType | string | Oui | CNI, Passeport, Titre de séjour, Permis de conduire, Autre |
vendeurIdentiteNumero | string | Oui | Numéro de la pièce d'identité |
vendeurIdentiteDateDelivrance | string | Oui | Date de délivrance de la pièce (ISO 8601), jamais dans le futur |
vendeurIdentiteDelivrance | string | Oui | Autorité qui a délivré la pièce |
L'article R. 321-3 du code pénal énumère les mentions du registre : nom, domicile, puis la nature, le numéro et la date de délivrance de la pièce d'identité produite, avec l'indication de l'autorité qui l'a établie. Ces quatre éléments sont donc exigés.
La date de naissance, le lieu de naissance et la nationalité ne figurent ni à cet article, ni au modèle de registre de l'annexe I de l'arrêté du 15 mai 2020.
La nationalité n'est plus collectée du tout : aucun texte ne la réclame, et la recueillir
sans base légale contrevient au principe de minimisation (art. 5.1.c RGPD). Une valeur
envoyée dans vendeurNationalite est ignorée, sans erreur.
La date et le lieu de naissance restent acceptés et deviennent obligatoires au-delà
du seuil LCB-FT applicable au régime de l'entrée : au-dessus, l'identification du vendeur
relève du code monétaire et financier. En deçà, ils sont facultatifs. Le refus porte le code
IDENTIFICATION_RENFORCEE_REQUISE.
Vendeur professionnel
| Champ | Type | Requis | Description |
|---|---|---|---|
vendeurType | string | Oui | professionnel |
vendeurRaisonSociale | string | Oui | Raison sociale |
vendeurSiret | string | Oui | Identifiant d'entreprise : SIRET, ou son équivalent à l'étranger |
vendeurAdresse | string | Oui | Adresse du siège |
vendeurNom | string | Oui | Nom et prénoms du représentant qui a effectué l'opération |
vendeurQualite | string | Oui | Sa fonction (gérant, directeur…) |
vendeurRepresentantDomicile | string | Oui | Son domicile personnel, distinct du siège social |
vendeurIdentiteType | string | Oui | Pièce présentée par le représentant |
vendeurIdentiteNumero | string | Oui | Numéro de cette pièce |
vendeurIdentiteDateDelivrance | string | Oui | Sa date de délivrance (ISO 8601) |
vendeurIdentiteDelivrance | string | Oui | L'autorité qui l'a délivrée |
Une société ne remet pas un objet elle-même. R. 321-3 du code pénal impose donc, en plus de la dénomination et du siège, « le nom, les prénoms, la qualité et le domicile du représentant de la personne morale qui a effectué l'opération pour son compte, avec les références de la pièce d'identité produite ».
Les deux adresses sont donc distinctes et toutes deux attendues : vendeurAdresse porte
le siège social de la société, vendeurRepresentantDomicile le domicile personnel
de la personne physique qui a effectué l'opération.
L'annexe I de l'arrêté du 15 mai 2020 fusionne les deux en une colonne « domicile ou siège social », mais ce modèle est un minimum : R. 321-6-1 renvoie aux articles R. 321-3 à R. 321-5 pour le contenu d'un registre informatisé.
Ces mentions du représentant — vendeurNom, vendeurQualite,
vendeurRepresentantDomicile et les quatre champs de pièce d'identité — sont bloquantes
par défaut : une écriture professionnelle incomplète est refusée en 400MENTION_MANQUANTE, le champ fautif étant nommé dans champ.
Registeo peut lever cette exigence pour un établissement qui ne peut pas les obtenir de ses apporteurs (un dépôt-vente, typiquement). Ne présumez donc pas du comportement : traitez le refus, ne codez pas en dur l'inverse. L'identification de la société — raison sociale, identifiant d'entreprise, siège — n'est jamais dispensée.
Photos et documents
| Champ | Type | Requis | Description |
|---|---|---|---|
photoKeys | string[] | Non | Clés de photos uploadées via /api/objets/upload-photo?context=objets (max 5) |
vendeurDocumentKeys | string[] | Non | Clés de documents vendeur uploadés — pièce d'identité, Kbis, justificatif… (max 3). Accepté pour un vendeur particulier comme professionnel. |
signatureKey | string | Non | Clé de la signature numérique du vendeur (uploadée comme une photo) |
Au-delà de ces plafonds, l'écriture est refusée en 400 PIECES_JOINTES_TROP_NOMBREUSES. Une clé présente deux fois ne compte qu'une fois.
Exemple — vendeur particulier
{
"agent": "Marie Dupont",
"typeOperation": "achat",
"designation": "Montre ancienne en or",
"marques": "Marque visible au dos",
"provenanceDeclaree": "Succession familiale",
"quantite": 1,
"prixAchat": 150.00,
"modePaiement": "espèces",
"dateAchat": "2025-03-01",
"regimes": ["OBJETS_OCCASION", "METAUX_PRECIEUX"],
"champsActivite": {
"poincon": "Tête d'aigle 750",
"poidsMetaux": "Or 18k : 12 g",
"titreMetaux": "750‰"
},
"vendeurType": "particulier",
"vendeurNom": "Jean Dupont",
"vendeurDateNaissance": "1985-06-15",
"vendeurLieuNaissance": "Paris (75)",
"vendeurNationalite": "Française",
"vendeurAdresse": "12 rue de la Paix, 75002 Paris",
"vendeurIdentiteType": "CNI",
"vendeurIdentiteNumero": "AB123456",
"vendeurIdentiteDateDelivrance": "2019-03-12",
"vendeurIdentiteDelivrance": "Préfecture de Paris"
}
Exemple — vendeur professionnel avec documents
{
"typeOperation": "achat",
"designation": "Lampe art déco",
"quantite": 1,
"prixAchat": 80.00,
"modePaiement": "carte",
"dateAchat": "2025-04-10",
"vendeurType": "professionnel",
"vendeurRaisonSociale": "Emmaüs Armentières",
"vendeurSiret": "39765682800035",
"vendeurAdresse": "3 Place du 19 Mars 1962, 59280 Armentières",
"vendeurNom": "Claire Bernard",
"vendeurQualite": "Responsable de site",
"vendeurIdentiteType": "CNI",
"vendeurIdentiteNumero": "CB998877",
"vendeurIdentiteDateDelivrance": "2020-06-08",
"vendeurIdentiteDelivrance": "Préfecture du Nord",
"vendeurDocumentKeys": ["key-du-kbis-uploadé"]
}
Réponse 201
Retourne l'objet créé avec son id, son numero attribué, et tous les champs du type ObjetMobilier.
Rejouer sans créer de doublon
Envoyez referenceExterne : votre propre identifiant pour cette opération — numéro
de ticket, de vente, de commande.
| Champ | Type | Requis | Description |
|---|---|---|---|
referenceExterne | string | Non | Votre identifiant. Unique par établissement, 200 caractères maximum |
Un second appel portant la même référence ne crée rien : il retourne l'objet déjà
enregistré, en 200 au lieu de 201, avec "rejeu": true en tête de réponse. Le corps
est identique à celui d'une création.
Sans cette référence, un appel rejoué après un timeout grave un doublon définitif : le numéro d'ordre est consommé, et la suppression d'une écriture n'est que logique — la ligne reste au registre, marquée supprimée. Renseignez-la systématiquement.
Une référence ne se libère pas
Supprimer une entrée ne rend pas sa référence disponible. Un appel qui réemploie la
référence d'une entrée supprimée est refusé en 409 REFERENCE_DEJA_UTILISEE : la
suppression d'une écriture est logique, la ligne reste au registre et garde ce qui
l'identifie. La réponse désigne l'entrée qui tient la référence.
{
"success": false,
"code": "REFERENCE_DEJA_UTILISEE",
"message": "La référence « TICKET-4712 » a déjà été portée par l'entrée n° 312, depuis supprimée du registre. Une suppression n'efface pas l'écriture, elle la marque : la référence reste prise. Employez-en une autre pour cette nouvelle entrée.",
"numero": "312",
"supprimeeLe": "2026-09-15T20:54:19.666Z"
}
Reprenez une référence distincte pour la nouvelle entrée. En bac à sable, cela veut dire qu'un scénario de test rejoué après nettoyage demande des références neuves à chaque passage : préfixez-les par la date ou par un identifiant d'exécution.
Adresser un objet par votre référence
Partout où une route attend un {id}, vous pouvez écrire ref:<votre référence> :
POST /api/objets/ref:TICKET-4712/mouvements
PUT /api/objets/ref:TICKET-4712
Vous n'avez donc pas à conserver nos identifiants dans votre système. 404OBJET_INTROUVABLE si aucune entrée ne porte cette référence.
Pour relire une entrée par sa référence : GET /api/objets/ref:TICKET-4712.
Modifier un objet
PUT /api/objets/{id}
Mêmes champs que la création. Tous les champs doivent être fournis (pas de patch partiel). Les photos et documents passés dans photoKeys / vendeurDocumentKeys remplacent les listes existantes : une clé absente du tableau sera retirée de l'objet.
Motif de la rectification : motif
Une entrée validée ne se réécrit pas : elle se rectifie. La correction s'ajoute à l'entrée d'origine, qui reste visible, et son motif est scellé avec elle dans le journal d'audit. Il apparaît dans l'historique de la fiche et dans l'export PDF.
{ "agent": "Marie Dupont", "motif": "Erreur de saisie du numéro IMEI", "designation": "…" }
| Champ | Type | Requis | Description |
|---|---|---|---|
motif | string | Oui | Raison de la correction, 3 à 500 caractères. |
| Cas | Réponse |
|---|---|
| La requête modifie au moins un champ du registre, sans motif ou avec un motif de moins de 3 caractères | 400 MOTIF_REQUIS |
| La requête ne modifie aucun champ du registre (champs d'inventaire seuls, ou valeurs inchangées) | Acceptée, le motif n'est pas exigé |
Le motif est exigé par l'API comme par l'interface Registeo. Un refus n'écrit rien.
Réponse 200
{
"success": true,
"changes": 2
}
changes indique le nombre de champs modifiés enregistrés dans le journal d'audit.
Supprimer un objet
La suppression est logique (soft delete) : l'objet reste dans le registre avec une date deletedAt pour assurer la traçabilité réglementaire.
DELETE /api/objets/{id}
Corps de la requête
| Champ | Type | Requis | Description |
|---|---|---|---|
reason | string | Oui | Motif de suppression (enregistré dans le journal d'audit) |
Réponse 200
{
"success": true
}
Créer un mouvement de stock
Crée un mouvement de stock sur un objet : vente, mise en casse, réparation, exposition, expertise, etc. Le mouvement est enregistré dans le journal d'audit (crypto-chaîné) et le statut de l'objet est recalculé automatiquement.
Tout changement de statut passe par un mouvement. Un mouvement peut être annulé (résolu) pour remettre l'objet en stock.
POST /api/objets/{id}/mouvements
Champ obligatoire : agent
Comme pour la création d'objet, le champ agent (prénom et nom de la personne ayant effectué le mouvement) est requis dans le corps. 400 MISSING_AGENT sans lui.
Corps de la requête
| Champ | Type | Requis | Description |
|---|---|---|---|
agent | string | Oui | Prénom et nom de la personne ayant effectué le mouvement |
statut | string | Oui | Statut cible de catégorie sorti ou en_cours. Les statuts disponibles dépendent de l'activité — en_exposition existe chez un galeriste, pas chez un professionnel de l'automobile. Voir Statuts. Un statut inconnu est refusé en 400 STATUT_INVALIDE, avec la liste des statuts valides dans validStatuts ; un statut de catégorie disponible (ex. en_stock) en 400 STATUT_NON_MOUVEMENT. |
quantite | number | Non | Quantité à sortir (par défaut : tout le stock disponible) |
date | string | Non | Date du mouvement (ISO 8601, par défaut : maintenant) |
prixVente | number | Si vente | Prix de vente en euros |
acheteurType | string | Non | particulier (défaut) ou professionnel |
acheteurNom | string | Non | Nom de l'acheteur (particulier) ou du représentant (professionnel) |
acheteurAdresse | string | Non | Adresse de l'acheteur |
acheteurRaisonSociale | string | Non | Raison sociale si acheteurType = professionnel |
acheteurSiret | string | Non | SIRET si acheteurType = professionnel |
notes | string | Non | Informations complémentaires sur le mouvement |
documentKeys | string[] | Non | Documents justificatifs, 5 au plus. Clés obtenues via upload-photo?context=mouvements. Un autre format, ou plus de 5 clés, est refusé en 400 DOCUMENTS_INVALIDES. |
Réponse 201
{
"success": true,
"statut": "vendu",
"quantite": 5,
"dateVente": "2025-06-15T00:00:00.000Z",
"prixVente": 280.00,
"mouvements": [
{
"id": "mouvement-uuid",
"quantite": 5,
"statut": "vendu",
"date": "2025-06-15T00:00:00.000Z",
"prixVente": 280.00,
"acheteurType": "particulier",
"acheteurNom": null,
"acheteurAdresse": null,
"acheteurRaisonSociale": null,
"acheteurSiret": null,
"resolvedAt": null
}
]
}
Exemple — vente à un particulier
{
"statut": "vendu",
"quantite": 2,
"date": "2025-06-15",
"prixVente": 120.00,
"acheteurType": "particulier",
"acheteurNom": "Marie Martin",
"acheteurAdresse": "5 Rue des Lilas, 75011 Paris"
}
Exemple — vente à un professionnel
{
"statut": "vendu",
"quantite": 1,
"date": "2025-06-20",
"prixVente": 850.00,
"acheteurType": "professionnel",
"acheteurRaisonSociale": "Affinerie du Nord",
"acheteurSiret": "39765682800035",
"acheteurAdresse": "12 Zone Industrielle, 59800 Lille"
}
Exemple — mise en réparation
{
"statut": "en_reparation"
}
Annuler un mouvement de stock
Si un mouvement de stock a été créé par erreur, il peut être résolu (annulé). Le mouvement reste dans l'historique avec un timestamp resolvedAt, et le stock disponible est recalculé.
PUT /api/objets/{id}/mouvements/{mouvementId}/resolve
Aucun corps de requête requis.
Réponse 200
{
"success": true,
"statut": "en_stock",
"quantite": 5,
"mouvements": [
{
"id": "mouvement-uuid",
"quantite": 2,
"statut": "vendu",
"date": "2025-06-15T00:00:00.000Z",
"prixVente": 120.00,
"acheteurNom": "Marie Martin",
"acheteurAdresse": "5 Rue des Lilas, 75011 Paris",
"resolvedAt": "2025-06-16T09:00:00.000Z"
}
]
}
Upload de photo ou document
Endpoint unique pour uploader des photos d'objet, des documents vendeur, des documents de mouvement ou des signatures.
POST /api/objets/upload-photo?context=objets
Content-Type : multipart/form-data
Paramètre d'URL obligatoire : context
Le contexte détermine où le fichier est rangé et comment il sera relu ensuite. Il est obligatoire : sans lui, l'API renvoie 400.
| Valeur | Usage | Champ de destination |
|---|---|---|
objets | Photo ou document de la transaction | photoKeys |
vendeurs | Document du vendeur (pièce d'identité, Kbis…) | vendeurDocumentKeys |
mouvements | Document d'une sortie (facture, attestation…) | documentKeys du mouvement |
signatures | Signature du vendeur | signatureKey |
| Champ | Type | Description |
|---|---|---|
photo | File | Fichier image (JPEG, PNG, max 10 Mo). Redimensionné puis converti automatiquement en WebP. |
Réponse 201
{
"key": "c-7dec0cf719a87d79170be95266c6f35101ae4e6b93a3a2387d53aabe0c84f149.webp",
"url": "https://api.registeo.fr/objets/photo?key=c-7dec0cf7…webp&context=objets"
}
Utilisez la key retournée dans photoKeys, vendeurDocumentKeys, documentKeys ou signatureKey. Traitez-la comme un identifiant opaque : sa forme peut évoluer. Envoyer deux fois la même image renvoie la même clé.
Supprimer une photo d'objet
DELETE /api/objets/{id}/photos
Corps de la requête
| Champ | Type | Requis | Description |
|---|---|---|---|
key | string | Oui | Clé de la photo à supprimer |
motif | string | Non | Raison du retrait, 500 caractères au plus. Scellé avec l'écriture, comme pour une modification. |
Réponse 200
{
"success": true
}
La photo n'est supprimée physiquement que si elle n'est plus référencée par aucun autre objet.