{ "openapi": "3.1.0", "info": { "title": "MARKO External Partner API", "version": "v1", "description": "Stable external API contract for the live environment.\n\nAuthentication flow for partner integrations:\n1. Generate an API key from the MARKO entity admin API section.\n2. Keep the raw API secret server-side and use it only to sign `POST /v1/auth/token`.\n3. Build the canonical message `MARKO-EXTERNAL-API-TOKEN-V1\\n{key_id}\\n{timestamp}\\n{nonce}`.\n4. Sign that message with HMAC-SHA256 and send the hex signature with `key_id`, `timestamp` and `nonce`.\n5. Use the returned short-lived bearer on business endpoints as `Authorization: Bearer `.\nThe raw API secret must never be sent on business endpoints.\n\nThis public contract intentionally excludes beta endpoints.\n\nRéférence enrichie pour les développeurs et les assistants IA. Exemples synthétiques; les champs sont extraits des modèles et sérialiseurs de la version indiquée dans x-documentation-provenance." }, "servers": [ { "url": "https://partner-api.marko.fr/v1" } ], "security": [ { "BearerAuth": [] } ], "externalDocs": { "description": "Download the matching Postman collection.", "url": "/v1/postman.json" }, "x-marko-authentication": { "token_endpoint": "/v1/auth/token", "signature_algorithm": "HMAC-SHA256", "canonical_message": "MARKO-EXTERNAL-API-TOKEN-V1\\n{key_id}\\n{timestamp}\\n{nonce}", "business_authorization_header": "Authorization: Bearer ", "raw_secret_usage": "server-side-token-exchange-only" }, "components": { "securitySchemes": { "BearerAuth": { "type": "http", "scheme": "bearer", "bearerFormat": "MARKO short-lived bearer", "description": "Use the `access_token` returned by `POST /v1/auth/token`. Do not send the raw API secret on business endpoints." } }, "schemas": { "AIExtractionJobResponse": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "status": { "$ref": "#/components/schemas/JobStatus", "description": "État du job de traitement. Sa fin ne prouve pas que toutes les suggestions ont été appliquées; lire les compteurs et le résultat." }, "document_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Document Id", "description": "UUID MARKO du document." }, "operation_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operation Id", "description": "UUID MARKO de l'opération." }, "provider": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Provider", "description": "Fournisseur utilisé par le job d'extraction IA." }, "narrative": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Narrative", "description": "Résumé textuel produit par l'extraction IA." }, "suggestions_created": { "type": "integer", "title": "Suggestions Created", "default": 0, "description": "Nombre de suggestions créées par l'extraction; leur création ne prouve pas leur validation ou leur application." }, "auto_applied": { "type": "integer", "title": "Auto Applied", "default": 0, "description": "Nombre de suggestions appliquées automatiquement par le job; distinct du nombre de suggestions créées." }, "operation_resolution": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Operation Resolution", "description": "Résultat du rattachement du job d'extraction à une opération." }, "error_message": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Error Message", "description": "Détail de l'échec, lorsqu'il est disponible." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." }, "started_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Started At", "description": "Date de début du traitement." }, "completed_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Completed At", "description": "Date de fin, lorsqu'une exécution ou un traitement est terminé." }, "raw_result": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Raw Result", "description": "Résultat brut public du job IA. Sa structure dépend du traitement et ne garantit pas une application des suggestions." } }, "type": "object", "required": [ "id", "status", "created_at" ], "title": "AIExtractionJobResponse", "description": "ProcessingJob payload tailored for the AI Wizard UI." }, "AiExtractionJobCreateRequest": { "properties": { "document_id": { "type": "string", "format": "uuid", "title": "Document Id", "description": "UUID MARKO du document." }, "operation_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operation Id", "description": "UUID MARKO de l'opération." } }, "type": "object", "required": [ "document_id" ], "title": "AiExtractionJobCreateRequest" }, "AlertResponse": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "user_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "User Id", "description": "Identifiant utilisateur MARKO; il n'est pas nécessairement un UUID." }, "type": { "type": "string", "title": "Type", "description": "Type de l'alerte ou de la notification." }, "severity": { "type": "string", "title": "Severity", "description": "Niveau de gravité de l'événement, distinct de son statut de traitement." }, "title": { "type": "string", "title": "Title", "description": "Titre affiché pour l'événement ou le problème." }, "message": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Message", "description": "Message destiné à l'affichage ou au diagnostic." }, "target_url": { "type": "string", "title": "Target Url", "description": "Lien vers la ressource concernée dans l'interface MARKO." }, "target_tab": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Target Tab", "description": "Onglet à ouvrir sur la cible dans MARKO." }, "target_filter": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Target Filter", "description": "Filtre à appliquer lors de l'ouverture de la cible dans MARKO." }, "highlight_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Highlight Id", "description": "Identifiant de l'élément à mettre en évidence dans l'interface." }, "read": { "type": "boolean", "title": "Read", "description": "Indique si la notification ou l'alerte a été lue." }, "alert_status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Alert Status", "description": "État de traitement de l'alerte, distinct de son niveau de gravité." }, "snoozed_until": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Snoozed Until", "description": "Date jusqu'à laquelle l'alerte ou la recommandation est reportée." }, "escalation_level": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Escalation Level", "description": "Niveau d'escalade de l'alerte ou de la notification." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." }, "operation_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Operation Id", "description": "UUID MARKO de l'opération." }, "operateur_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Operateur Id", "description": "UUID MARKO de l'opérateur." }, "is_active": { "type": "boolean", "title": "Is Active", "default": false, "description": "Indique si l'élément est actif." } }, "type": "object", "required": [ "id", "type", "severity", "title", "target_url", "read", "created_at" ], "title": "AlertResponse" }, "AlertSnoozeRequest": { "properties": { "days": { "type": "integer", "maximum": 30.0, "minimum": 1.0, "title": "Days", "description": "Nombre de jours de snooze (1-30)", "default": 7 } }, "type": "object", "title": "AlertSnoozeRequest" }, "AlertSourceType": { "type": "string", "enum": [ "interne", "externe" ], "title": "AlertSourceType", "description": "Type de source d'alerte." }, "Body_upload_document_public_documents_external__external_id__upload_put": { "properties": { "file": { "type": "string", "contentMediaType": "application/octet-stream", "title": "File", "format": "binary", "description": "Fichier binaire envoyé dans multipart/form-data; ne pas encoder en Base64." }, "type": { "type": "string", "title": "Type", "description": "Catégorie métier du document, distincte de son type MIME; par exemple autre pour un document non spécialisé." }, "operation_external_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Operation External Id", "description": "Identifiant externe de l'opération, appartenant à la même intégration." }, "operation_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operation Id", "description": "UUID MARKO de l'opération." }, "partner_metadata": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Partner Metadata", "description": "Chaîne contenant un objet JSON valide. Au niveau multipart, ce champ est du texte; il est ensuite décodé en objet." } }, "type": "object", "required": [ "file", "type" ], "title": "Body_upload_document_public_documents_external__external_id__upload_put", "anyOf": [ { "required": [ "operation_id" ], "properties": { "operation_id": { "type": "string", "format": "uuid", "description": "UUID MARKO de l'opération." } } }, { "required": [ "operation_external_id" ], "properties": { "operation_external_id": { "type": "string", "minLength": 1, "description": "Identifiant externe de l'opération, appartenant à la même intégration." } } } ], "description": "Une opération est requise: fournir operation_id ou operation_external_id. Lorsque les deux sont fournis, operation_id est utilisé. Pour un upload de fichier, appeler directement /upload avec un nouvel external_id; une déclaration metadata préalable peut être renvoyée sans ajout de fichier." }, "CalendarEventCreate": { "properties": { "title": { "type": "string", "maxLength": 300, "title": "Title", "description": "Titre de l'evenement" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Description", "description": "Description detaillee" }, "event_date": { "type": "string", "format": "date", "title": "Event Date", "description": "Date de l'evenement" }, "event_type": { "type": "string", "maxLength": 50, "title": "Event Type", "description": "Type: covenant_deadline, reporting_due, ag_date, echeance, custom, etc." }, "operation_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operation Id", "description": "Lie a une operation (optionnel)" }, "operateur_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operateur Id", "description": "Lie a un operateur (optionnel)" }, "fond_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Fond Id", "description": "Lie a un fonds (optionnel)" }, "spv_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Spv Id", "description": "Lie a un SPV (optionnel)" }, "client_request_id": { "anyOf": [ { "type": "string", "pattern": "^[A-Za-z0-9._-]{1,80}$" }, { "type": "null" } ], "title": "Client Request Id", "description": "Optional durable request id scoped to (entity, author): retrying the same create replays the already-created event instead of duplicating it." } }, "additionalProperties": false, "type": "object", "required": [ "title", "event_date", "event_type" ], "title": "CalendarEventCreate", "description": "Schema for a human-created event; AI provenance is server-owned." }, "CalendarEventListResponse": { "properties": { "items": { "items": { "$ref": "#/components/schemas/CalendarEventResponse" }, "type": "array", "title": "Items", "description": "Résultats de la page courante." }, "total": { "type": "integer", "title": "Total", "description": "Nombre total de résultats correspondant aux filtres." } }, "type": "object", "required": [ "items", "total" ], "title": "CalendarEventListResponse", "description": "Paginated list of calendar events." }, "CalendarEventResponse": { "properties": { "title": { "type": "string", "maxLength": 300, "title": "Title", "description": "Titre de l'evenement" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Description", "description": "Description detaillee" }, "event_date": { "type": "string", "format": "date", "title": "Event Date", "description": "Date de l'evenement" }, "event_type": { "type": "string", "maxLength": 50, "title": "Event Type", "description": "Type: covenant_deadline, reporting_due, ag_date, echeance, custom, etc." }, "operation_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operation Id", "description": "Lie a une operation (optionnel)" }, "operateur_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operateur Id", "description": "Lie a un operateur (optionnel)" }, "fond_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Fond Id", "description": "Lie a un fonds (optionnel)" }, "spv_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Spv Id", "description": "Lie a un SPV (optionnel)" }, "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "entity_id": { "type": "string", "format": "uuid", "title": "Entity Id", "description": "Identifiant de l'entité MARKO à laquelle cette ressource appartient." }, "source": { "type": "string", "title": "Source", "description": "Origine de l'événement de calendrier." }, "source_alert_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Source Alert Id", "description": "Identifiant de l'alerte à l'origine de l'événement de calendrier." }, "confidence": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Confidence", "description": "Indice de confiance associé au résultat; il ne remplace pas une validation humaine." }, "accepted": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Accepted", "description": "Indique si la proposition d'événement a été acceptée." }, "idempotency_receipt": { "anyOf": [ { "$ref": "#/components/schemas/ManualCreationIdempotencyReceipt" }, { "type": "null" } ], "description": "Reçu de création manuelle indiquant notamment si une création précédente a été rejouée." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "title": "Updated At", "description": "Date de dernière modification au format ISO 8601." } }, "type": "object", "required": [ "title", "event_date", "event_type", "id", "entity_id", "source", "created_at", "updated_at" ], "title": "CalendarEventResponse", "description": "Schema for calendar event API response." }, "CalendarEventUpdate": { "properties": { "title": { "anyOf": [ { "type": "string", "maxLength": 300 }, { "type": "null" } ], "title": "Title", "description": "Titre affiché pour l'événement ou le problème." }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Description", "description": "Description libre de la ressource." }, "event_date": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Event Date", "description": "Date et heure de l'événement de calendrier." }, "event_type": { "anyOf": [ { "type": "string", "maxLength": 50 }, { "type": "null" } ], "title": "Event Type", "description": "Type de l'événement." }, "operation_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operation Id", "description": "UUID MARKO de l'opération." }, "operateur_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operateur Id", "description": "UUID MARKO de l'opérateur." }, "fond_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Fond Id", "description": "UUID MARKO du fonds." }, "spv_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Spv Id", "description": "UUID MARKO de la SPV." }, "accepted": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Accepted", "description": "Indique si la proposition d'événement a été acceptée." } }, "additionalProperties": false, "type": "object", "title": "CalendarEventUpdate", "description": "Schema for updating a calendar event (all fields optional)." }, "ChronicleEntry": { "properties": { "id": { "type": "string", "title": "Id", "description": "Prefixed ID: 'st-{uuid}', 'el-{uuid}', 'al-{id}'" }, "entry_type": { "$ref": "#/components/schemas/ChronicleEntryType", "description": "Catégorie de l'événement dans l'historique technique." }, "timestamp": { "type": "string", "format": "date-time", "title": "Timestamp", "description": "Heure Unix en secondes de l'échange signé." }, "title": { "type": "string", "title": "Title", "description": "Human-readable summary" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Description", "description": "Description libre de la ressource." }, "field_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Field Name", "description": "Nom du champ modifié dans l'événement d'historique." }, "old_value": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Old Value", "description": "Valeur du champ avant la modification enregistrée." }, "new_value": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "New Value", "description": "Valeur du champ après la modification enregistrée." }, "actor_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Actor Id", "description": "Identifiant de l'auteur de l'événement." }, "actor_email": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Actor Email", "description": "Adresse e-mail de l'auteur de l'événement, si elle est disponible." }, "actor_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Actor Type", "description": "Nature de l'auteur: utilisateur, système ou intégration selon l'événement." }, "source_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Source Type", "description": "Type de source de l'événement ou de la propriété métier." }, "confidence": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Confidence", "description": "Indice de confiance associé au résultat; il ne remplace pas une validation humaine." }, "metadata": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Metadata", "description": "Informations complémentaires de l'événement; leurs clés dépendent de son type." } }, "type": "object", "required": [ "id", "entry_type", "timestamp", "title" ], "title": "ChronicleEntry", "description": "Single entry in the operation chronicle timeline." }, "ChronicleEntryType": { "type": "string", "enum": [ "state_transition", "field_change", "audit_change" ], "title": "ChronicleEntryType", "description": "Type of chronicle entry." }, "ChronicleResponse": { "properties": { "items": { "items": { "$ref": "#/components/schemas/ChronicleEntry" }, "type": "array", "title": "Items", "description": "Résultats de la page courante." }, "total": { "type": "integer", "title": "Total", "description": "Nombre total de résultats correspondant aux filtres." }, "page": { "type": "integer", "title": "Page", "description": "Numéro de la page courante, à partir de 1.", "default": 1 }, "pages": { "type": "integer", "title": "Pages", "description": "Nombre total de pages pour cette taille de page.", "default": 0 }, "limit": { "type": "integer", "title": "Limit", "description": "Items per page", "default": 50 } }, "type": "object", "required": [ "items", "total" ], "title": "ChronicleResponse", "description": "Paginated chronicle response." }, "CommentCreate": { "properties": { "content": { "anyOf": [ { "type": "string", "maxLength": 10000, "minLength": 1 }, { "type": "null" } ], "title": "Content", "description": "Contenu du commentaire ou de la note." }, "note_type": { "anyOf": [ { "type": "string", "pattern": "^(reporting|call|comite|risque|libre)$" }, { "type": "null" } ], "title": "Note Type", "description": "Type de note ou de commentaire." }, "date": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Date", "description": "Date métier; le type et le format ci-dessous font autorité pour cette route." }, "text": { "anyOf": [ { "type": "string", "maxLength": 10000, "minLength": 1 }, { "type": "null" } ], "title": "Text", "description": "Texte de la note ou du commentaire." }, "category": { "anyOf": [ { "type": "string", "maxLength": 80, "minLength": 1 }, { "type": "null" } ], "title": "Category", "description": "Catégorie de la note; les règles exactes dépendent de la route. Pour l'import externe: chaîne de 1 à 80 caractères, libre par défaut." } }, "type": "object", "title": "CommentCreate", "description": "Payload pour créer une note de suivi." }, "CommentResponse": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "operation_id": { "type": "string", "format": "uuid", "title": "Operation Id", "description": "UUID MARKO de l'opération." }, "user_id": { "type": "string", "title": "User Id", "description": "Identifiant utilisateur MARKO; il n'est pas nécessairement un UUID." }, "author_name": { "type": "string", "title": "Author Name", "description": "Nom de l'auteur de la note ou du commentaire." }, "content": { "type": "string", "title": "Content", "description": "Contenu du commentaire ou de la note." }, "note_type": { "type": "string", "title": "Note Type", "description": "Type de note ou de commentaire." }, "date": { "type": "string", "format": "date-time", "title": "Date", "description": "Date métier; le type et le format ci-dessous font autorité pour cette route." }, "text": { "type": "string", "title": "Text", "description": "Texte de la note ou du commentaire." }, "category": { "type": "string", "title": "Category", "description": "Catégorie de la note; les règles exactes dépendent de la route. Pour l'import externe: chaîne de 1 à 80 caractères, libre par défaut." }, "description_i18n": { "additionalProperties": { "type": "string" }, "type": "object", "title": "Description I18N", "description": "Textes par locale normalisée (fr, en, fr-fr…); contraintes complémentaires dans le guide Imports et notes." }, "source_created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Source Created At", "description": "Date de création dans le système source, avec fuseau horaire." }, "source_updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Source Updated At", "description": "Date de dernière mise à jour dans le système source, avec fuseau horaire. Pour une note déjà versionnée, un changement exige une date strictement plus récente." }, "is_resolved": { "type": "boolean", "title": "Is Resolved", "default": false, "description": "Indique si le commentaire ou l'événement de risque est résolu." }, "resolved_by": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Resolved By", "description": "Identifiant de l'utilisateur qui a résolu le commentaire." }, "resolved_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Resolved At", "description": "Date de résolution de l'événement, du commentaire ou du conflit." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "title": "Updated At", "description": "Date de dernière modification au format ISO 8601." } }, "type": "object", "required": [ "id", "operation_id", "user_id", "author_name", "content", "note_type", "date", "text", "category", "created_at", "updated_at" ], "title": "CommentResponse", "description": "Réponse API pour une note de suivi." }, "CommentUpdate": { "properties": { "content": { "anyOf": [ { "type": "string", "maxLength": 10000, "minLength": 1 }, { "type": "null" } ], "title": "Content", "description": "Contenu du commentaire ou de la note." }, "date": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Date", "description": "Date métier; le type et le format ci-dessous font autorité pour cette route." }, "text": { "anyOf": [ { "type": "string", "maxLength": 10000, "minLength": 1 }, { "type": "null" } ], "title": "Text", "description": "Texte de la note ou du commentaire." }, "category": { "anyOf": [ { "type": "string", "maxLength": 80, "minLength": 1 }, { "type": "null" } ], "title": "Category", "description": "Catégorie de la note; les règles exactes dépendent de la route. Pour l'import externe: chaîne de 1 à 80 caractères, libre par défaut." } }, "type": "object", "title": "CommentUpdate", "description": "Payload pour mettre à jour une note de suivi." }, "ContentSearchResponse": { "properties": { "request_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Request Id", "description": "Identifiant de corrélation pour le diagnostic de la requête." }, "query": { "type": "string", "title": "Query", "description": "Texte de recherche reçu par le service." }, "results": { "items": { "$ref": "#/components/schemas/ContentSearchResult" }, "type": "array", "title": "Results", "description": "Résultats de recherche accessibles dans ce périmètre." }, "total": { "type": "integer", "title": "Total", "description": "Nombre total de résultats correspondant aux filtres." }, "mode": { "type": "string", "title": "Mode", "default": "search", "description": "Mode de traitement accepté par cette route." }, "decision": { "type": "string", "title": "Decision", "default": "allow", "description": "Décision d'accès appliquée à la recherche documentaire." }, "role_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Role Id", "description": "Identifiant du rôle appliqué à la recherche documentaire." }, "denied_reason": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Denied Reason", "description": "Motif du refus d'accès aux résultats documentaires." }, "blocked_reason_codes": { "items": { "type": "string" }, "type": "array", "title": "Blocked Reason Codes", "description": "Codes des motifs qui limitent ou bloquent l'accès aux résultats documentaires." }, "authority_mode": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Authority Mode", "description": "Mode d'autorité appliqué à la recherche documentaire." }, "memory_policy": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Memory Policy", "description": "Politique appliquée aux données de mémoire dans cette recherche." }, "policy_decision": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Policy Decision", "description": "Détails de la décision de politique appliquée à la recherche documentaire." }, "notes": { "items": { "type": "string" }, "type": "array", "title": "Notes", "description": "Notes historiques de l'opération. Le lot complet accepte au maximum 10 000 notes." } }, "type": "object", "required": [ "query", "results", "total" ], "title": "ContentSearchResponse", "description": "Response for document content search." }, "ContentSearchResult": { "properties": { "document_id": { "type": "string", "format": "uuid", "title": "Document Id", "description": "UUID MARKO du document." }, "filename": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Filename", "description": "Nom du fichier." }, "document_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Document Type", "description": "Type métier du document; distinct de son type MIME." }, "snippet": { "type": "string", "title": "Snippet", "description": "Highlighted snippet from ts_headline" }, "rank": { "type": "number", "title": "Rank", "description": "ts_rank relevance score" }, "page_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Page Count", "description": "Nombre de pages connu pour le document trouvé." } }, "type": "object", "required": [ "document_id", "snippet", "rank" ], "title": "ContentSearchResult", "description": "A single document content search hit." }, "CustomDashboardCreate": { "properties": { "name": { "type": "string", "maxLength": 200, "minLength": 1, "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "description": { "anyOf": [ { "type": "string", "maxLength": 2000 }, { "type": "null" } ], "title": "Description", "description": "Description libre de la ressource." }, "layout": { "items": { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, "type": "array", "maxItems": 50, "title": "Layout", "description": "Disposition des widgets du dashboard." }, "filters": { "additionalProperties": true, "type": "object", "title": "Filters", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, "default_scope": { "$ref": "#/components/schemas/DashboardScope", "description": "Périmètre métier initial du dashboard." } }, "additionalProperties": false, "type": "object", "required": [ "name" ], "title": "CustomDashboardCreate" }, "CustomDashboardListResponse": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "name": { "type": "string", "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Description", "description": "Description libre de la ressource." }, "user_id": { "type": "string", "title": "User Id", "default": "", "description": "Identifiant utilisateur MARKO; il n'est pas nécessairement un UUID." }, "is_shared": { "type": "boolean", "title": "Is Shared", "description": "Indique si le dashboard est partagé." }, "default_scope": { "$ref": "#/components/schemas/DashboardScope", "description": "Périmètre métier initial du dashboard." }, "sharing": { "$ref": "#/components/schemas/DashboardSharing", "description": "Visibilité, permissions et membres du partage du dashboard." }, "can_edit": { "type": "boolean", "title": "Can Edit", "default": false, "description": "Indique si l'utilisateur délégué peut modifier ce dashboard." }, "can_manage": { "type": "boolean", "title": "Can Manage", "default": false, "description": "Indique si l'utilisateur délégué peut gérer le partage de ce dashboard." }, "widget_count": { "type": "integer", "title": "Widget Count", "default": 0, "description": "Nombre de widgets configurés dans le dashboard." }, "scope_unavailable": { "type": "boolean", "title": "Scope Unavailable", "default": false, "description": "Indique que le périmètre enregistré du dashboard n'est pas disponible pour cet utilisateur." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "title": "Updated At", "description": "Date de dernière modification au format ISO 8601." } }, "type": "object", "required": [ "id", "name", "description", "is_shared", "created_at", "updated_at" ], "title": "CustomDashboardListResponse" }, "CustomDashboardResponse": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "name": { "type": "string", "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Description", "description": "Description libre de la ressource." }, "user_id": { "type": "string", "title": "User Id", "description": "Identifiant utilisateur MARKO; il n'est pas nécessairement un UUID." }, "layout": { "items": { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, "type": "array", "title": "Layout", "description": "Disposition des widgets du dashboard." }, "filters": { "additionalProperties": true, "type": "object", "title": "Filters", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, "default_scope": { "$ref": "#/components/schemas/DashboardScope", "description": "Périmètre métier initial du dashboard." }, "sharing": { "$ref": "#/components/schemas/DashboardSharing", "description": "Visibilité, permissions et membres du partage du dashboard." }, "can_edit": { "type": "boolean", "title": "Can Edit", "default": false, "description": "Indique si l'utilisateur délégué peut modifier ce dashboard." }, "can_manage": { "type": "boolean", "title": "Can Manage", "default": false, "description": "Indique si l'utilisateur délégué peut gérer le partage de ce dashboard." }, "is_shared": { "type": "boolean", "title": "Is Shared", "description": "Indique si le dashboard est partagé." }, "share_token": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Share Token", "description": "Jeton associé au partage du dashboard, lorsqu'il existe; ne pas le publier." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "title": "Updated At", "description": "Date de dernière modification au format ISO 8601." } }, "type": "object", "required": [ "id", "name", "description", "user_id", "layout", "filters", "is_shared", "share_token", "created_at", "updated_at" ], "title": "CustomDashboardResponse" }, "CustomDashboardUpdate": { "properties": { "name": { "anyOf": [ { "type": "string", "maxLength": 200, "minLength": 1 }, { "type": "null" } ], "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "description": { "anyOf": [ { "type": "string", "maxLength": 2000 }, { "type": "null" } ], "title": "Description", "description": "Description libre de la ressource." }, "layout": { "anyOf": [ { "items": { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, "type": "array", "maxItems": 50 }, { "type": "null" } ], "title": "Layout", "description": "Disposition des widgets du dashboard." }, "filters": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Filters", "description": "Filtres enregistrés pour la vue, le dashboard ou le template." }, "default_scope": { "anyOf": [ { "$ref": "#/components/schemas/DashboardScope" }, { "type": "null" } ], "description": "Périmètre métier initial du dashboard." }, "is_shared": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Is Shared", "description": "Indique si le dashboard est partagé." }, "expected_updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Expected Updated At", "description": "Valeur updated_at lue avant la modification. Une version concurrente exige une nouvelle lecture et une réévaluation." } }, "additionalProperties": false, "type": "object", "title": "CustomDashboardUpdate" }, "DashboardScope": { "properties": { "level": { "type": "string", "enum": [ "entity", "fund", "operation" ], "title": "Level", "default": "entity", "description": "Niveau du périmètre métier du dashboard." }, "ids": { "items": { "type": "string", "format": "uuid" }, "type": "array", "maxItems": 500, "title": "Ids", "description": "Identifiants des ressources incluses dans le périmètre sélectionné." } }, "additionalProperties": false, "type": "object", "title": "DashboardScope" }, "DashboardSharing": { "properties": { "visibility": { "type": "string", "enum": [ "private", "team", "entity" ], "title": "Visibility", "default": "private", "description": "Périmètre de visibilité du partage du dashboard." }, "permission": { "type": "string", "enum": [ "read", "edit" ], "title": "Permission", "default": "read", "description": "Niveau de permission accordé par le partage du dashboard." }, "member_ids": { "items": { "type": "string" }, "type": "array", "maxItems": 64, "title": "Member Ids", "description": "Identifiants des membres concernés par le partage du dashboard." } }, "additionalProperties": false, "type": "object", "title": "DashboardSharing" }, "DealCreate": { "properties": { "name": { "type": "string", "maxLength": 300, "minLength": 1, "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "status": { "$ref": "#/components/schemas/DealStatus", "default": "sourcing", "description": "Statut du deal dans le pipeline avant closing; distinct du statut d'une opération." }, "description": { "anyOf": [ { "type": "string", "maxLength": 5000 }, { "type": "null" } ], "title": "Description", "description": "Description libre de la ressource." }, "montant_estime": { "anyOf": [ { "type": "number", "minimum": 0.0 }, { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d{0,2}0*$" }, { "type": "null" } ], "title": "Montant Estime", "description": "Montant prévisionnel du deal." }, "classe_actif": { "anyOf": [ { "type": "string", "maxLength": 100 }, { "type": "null" } ], "title": "Classe Actif", "description": "Classe d'actif de l'opération. Pour une écriture externe, consulter la dimension asset_class de GET /taxonomies." }, "operateur_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operateur Id", "description": "UUID MARKO de l'opérateur." }, "operation_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operation Id", "description": "UUID MARKO de l'opération." }, "responsable": { "anyOf": [ { "type": "string", "maxLength": 200 }, { "type": "null" } ], "title": "Responsable", "description": "Responsable déclaré du deal." }, "date_sourcing": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date Sourcing", "description": "Date d'entrée du deal dans le pipeline." }, "date_closing_prevue": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date Closing Prevue", "description": "Date prévisionnelle du closing du deal." } }, "type": "object", "required": [ "name" ], "title": "DealCreate", "description": "Payload pour creer un deal." }, "DealNoteCreate": { "properties": { "content": { "type": "string", "maxLength": 10000, "minLength": 1, "title": "Content", "description": "Contenu du commentaire ou de la note." } }, "type": "object", "required": [ "content" ], "title": "DealNoteCreate", "description": "Payload pour creer une note de deal." }, "DealNoteResponse": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "deal_id": { "type": "string", "format": "uuid", "title": "Deal Id", "description": "UUID du deal auquel la note est rattachée." }, "author_name": { "type": "string", "title": "Author Name", "description": "Nom de l'auteur de la note ou du commentaire." }, "content": { "type": "string", "title": "Content", "description": "Contenu du commentaire ou de la note." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "title": "Updated At", "description": "Date de dernière modification au format ISO 8601." } }, "type": "object", "required": [ "id", "deal_id", "author_name", "content", "created_at", "updated_at" ], "title": "DealNoteResponse", "description": "Reponse API pour une note de deal." }, "DealResponse": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "name": { "type": "string", "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "status": { "$ref": "#/components/schemas/DealStatus", "description": "Statut du deal dans le pipeline avant closing; distinct du statut d'une opération." }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Description", "description": "Description libre de la ressource." }, "montant_estime": { "anyOf": [ { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Montant Estime", "description": "Montant prévisionnel du deal." }, "classe_actif": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Classe Actif", "description": "Classe d'actif de l'opération. Pour une écriture externe, consulter la dimension asset_class de GET /taxonomies." }, "operateur_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operateur Id", "description": "UUID MARKO de l'opérateur." }, "operation_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operation Id", "description": "UUID MARKO de l'opération." }, "responsable": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Responsable", "description": "Responsable déclaré du deal." }, "date_sourcing": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date Sourcing", "description": "Date d'entrée du deal dans le pipeline." }, "date_closing_prevue": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date Closing Prevue", "description": "Date prévisionnelle du closing du deal." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "title": "Updated At", "description": "Date de dernière modification au format ISO 8601." } }, "type": "object", "required": [ "id", "name", "status", "created_at", "updated_at" ], "title": "DealResponse", "description": "Reponse API pour un deal." }, "DealStatus": { "type": "string", "enum": [ "sourcing", "analyse", "due_diligence", "comite", "closing", "abandonne" ], "title": "DealStatus", "description": "Statut du deal dans le pipeline CRM." }, "DealUpdate": { "properties": { "name": { "anyOf": [ { "type": "string", "maxLength": 300, "minLength": 1 }, { "type": "null" } ], "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "status": { "anyOf": [ { "$ref": "#/components/schemas/DealStatus" }, { "type": "null" } ], "description": "Statut du deal dans le pipeline avant closing; distinct du statut d'une opération." }, "description": { "anyOf": [ { "type": "string", "maxLength": 5000 }, { "type": "null" } ], "title": "Description", "description": "Description libre de la ressource." }, "montant_estime": { "anyOf": [ { "type": "number", "minimum": 0.0 }, { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d{0,2}0*$" }, { "type": "null" } ], "title": "Montant Estime", "description": "Montant prévisionnel du deal." }, "classe_actif": { "anyOf": [ { "type": "string", "maxLength": 100 }, { "type": "null" } ], "title": "Classe Actif", "description": "Classe d'actif de l'opération. Pour une écriture externe, consulter la dimension asset_class de GET /taxonomies." }, "operateur_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operateur Id", "description": "UUID MARKO de l'opérateur." }, "operation_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operation Id", "description": "UUID MARKO de l'opération." }, "responsable": { "anyOf": [ { "type": "string", "maxLength": 200 }, { "type": "null" } ], "title": "Responsable", "description": "Responsable déclaré du deal." }, "date_sourcing": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date Sourcing", "description": "Date d'entrée du deal dans le pipeline." }, "date_closing_prevue": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date Closing Prevue", "description": "Date prévisionnelle du closing du deal." } }, "type": "object", "title": "DealUpdate", "description": "Payload pour mettre a jour un deal." }, "DelegatedDataInventory": { "type": "object", "properties": { "user_id": { "type": "string", "description": "Identifiant utilisateur MARKO; il n'est pas nécessairement un UUID." }, "auth_database": { "type": "object", "additionalProperties": { "type": "object", "properties": { "table": { "type": "string", "description": "Nom de la source de données personnelles inventoriée." }, "fields": { "type": "array", "items": { "type": "string" }, "description": "Champs configurables proposés par le preset." }, "pii_fields": { "type": "array", "items": { "type": "string" }, "description": "Champs de la source qui peuvent contenir des données personnelles." }, "has_data": { "type": "boolean", "description": "Indique si la source contient des données pour le sujet concerné." }, "pseudonymous_fields": { "type": "array", "items": { "type": "string" }, "description": "Champs de la source qui contiennent des références pseudonymes au sujet." }, "excluded_from_export": { "type": "array", "items": { "type": "string" }, "description": "Champs ou données exclus de l'export pour cette source." }, "retention": { "type": "string", "description": "Informations sur la conservation des données de cette source." } }, "required": [ "table", "fields", "pii_fields", "has_data" ] }, "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, "entity_databases": { "type": "object", "properties": { "scope": { "type": "string", "description": "Périmètre métier ou droit concerné; le modèle de cette réponse précise son type." }, "entity_slugs": { "type": "array", "items": { "type": "string" }, "description": "Entités incluses dans la collecte des données personnelles du sujet." }, "warnings": { "type": "array", "items": { "type": "string" }, "description": "Avertissements relevés pendant la collecte des données du sujet." }, "tables_with_user_references": { "type": "array", "items": { "type": "string" }, "description": "Sources de l'entité contenant des références à l'utilisateur concerné." }, "note": { "type": "string", "description": "Commentaire associé à la décision sur la recommandation." }, "entities": { "type": "array", "items": { "type": "object", "properties": { "entity_slug": { "type": "string", "description": "Entité à laquelle l'intégration est rattachée." }, "data_environment": { "type": "string", "description": "Environnement de données auquel ces informations se rapportent." }, "status": { "type": "string", "description": "État de collecte ou de traitement de cette source de données personnelles." }, "warnings": { "type": "array", "items": { "type": "string" }, "description": "Avertissements relevés pendant la collecte des données du sujet." }, "tables": { "type": "object", "additionalProperties": { "type": "object", "properties": { "has_data": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "description": "Indique si la source contient des données pour le sujet concerné." }, "count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Nombre de notifications non lues." }, "warning": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Limitation ou avertissement de collecte pour cette source." } }, "required": [ "has_data", "count", "warning" ] }, "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." } }, "required": [ "entity_slug", "data_environment", "status", "warnings", "tables" ] }, "description": "Résultats de la collecte par entité et environnement." } }, "required": [ "scope", "entity_slugs", "warnings", "tables_with_user_references", "note", "entities" ], "description": "Résultats des sources de données de l'entité incluses dans l'inventaire ou l'export RGPD." } }, "required": [ "user_id", "auth_database", "entity_databases" ] }, "DelegatedErasureResult": { "type": "object", "properties": { "privacy_case_id": { "type": "string", "format": "uuid", "description": "UUID du dossier durable de traitement RGPD." }, "status": { "type": "string", "enum": [ "intake", "verifying", "in_progress", "waiting_customer", "completed", "blocked", "cancelled" ], "description": "État du dossier d'effacement; une réponse accepted n'est pas une confirmation d'effacement terminé." }, "result_mode": { "type": "string", "const": "metadata_only", "description": "Mode de restitution du résultat d'effacement; la réponse expose les métadonnées du dossier." }, "reconciliation_required": { "type": "boolean", "description": "Indique que le résultat doit encore être rapproché de l'état réel du dossier." }, "manual_review_required": { "type": "boolean", "description": "Indique qu'une revue humaine reste nécessaire pour ce dossier ou cette action." }, "certificate_reference": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Référence du certificat d'effacement, si elle existe; null ne constitue pas une preuve d'effacement." }, "completed_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de fin, lorsqu'une exécution ou un traitement est terminé." }, "actions": { "type": "array", "items": { "type": "string", "enum": [ "delegated_erasure_completed", "delegated_erasure_blocked", "delegated_erasure_reconciliation_pending" ] }, "description": "Actions d'effacement enregistrées dans le dossier; leur présence ne signifie pas que toutes sont terminées." }, "replayed": { "type": "boolean", "description": "Indique qu'une réponse liée à la même intention a été retrouvée et rejouée." } }, "required": [ "privacy_case_id", "status", "result_mode", "reconciliation_required", "manual_review_required", "certificate_reference", "completed_at", "actions", "replayed" ] }, "DelegatedPrivacyExport": { "type": "object", "properties": { "schema_version": { "type": "string", "const": "marko_privacy_export/v2", "description": "Version du format de l'export RGPD." }, "scope_version": { "type": "string", "description": "Version du périmètre d'export RGPD." }, "personal_source_registry_version": { "type": "string", "description": "Version du registre des sources de données personnelles." }, "export_id": { "type": "string", "format": "uuid", "description": "Identifiant de l'export RGPD." }, "export_date": { "type": "string", "format": "date-time", "description": "Date de génération de l'export RGPD." }, "user_id": { "type": "string", "description": "Identifiant utilisateur MARKO; il n'est pas nécessairement un UUID." }, "data_environment": { "type": "string", "description": "Environnement de données auquel ces informations se rapportent." }, "profile": { "anyOf": [ { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "email": { "type": "string", "description": "Adresse e-mail du compte utilisateur." }, "name": { "type": "string", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "first_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Prénom de l'utilisateur." }, "last_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Nom de famille de l'utilisateur." }, "role": { "type": "string", "description": "Rôle du compte utilisateur dans l'entité." }, "status": { "type": "string" }, "entity_slug": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Entité à laquelle l'intégration est rattachée." }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." }, "updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "id", "email", "name", "first_name", "last_name", "role", "status", "entity_slug", "created_at", "updated_at" ] }, { "type": "object", "maxProperties": 0 } ], "description": "Profil du sujet concerné par l'export RGPD." }, "preferences": { "type": "object", "additionalProperties": true, "description": "Objet JSON métier; les clés dépendent de la source ou du preset." }, "notifications": { "type": "array", "maxItems": 0, "items": { "description": "Valeur JSON variable selon la source ou le preset; aucun schéma fixe n'est imposé par cette route." }, "description": "Notifications exportables de cet utilisateur." }, "audit_entries": { "type": "array", "maxItems": 0, "items": { "description": "Valeur JSON variable selon la source ou le preset; aucun schéma fixe n'est imposé par cette route." }, "description": "Événements d'audit exportables pour cet utilisateur; consulter le manifeste pour les sources non exportées." }, "demo_state": { "type": "array", "items": { "type": "object", "properties": { "namespace": { "type": "string" }, "state": { "description": "Valeur JSON métier dont la structure dépend de la source." }, "updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "namespace", "state", "updated_at" ] }, "description": "État de démonstration associé au profil dans l'export RGPD." }, "privacy_cases": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "case_type": { "type": "string", "enum": [ "dsar_export", "erasure", "offboarding", "incident_assistance" ] }, "status": { "type": "string", "enum": [ "intake", "verifying", "in_progress", "waiting_customer", "completed", "blocked", "cancelled" ] }, "source": { "type": "string", "enum": [ "self_service", "admin", "support", "incident" ], "description": "Origine déclarée de l'événement ou du remboursement." }, "requester_user_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "requester_email": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "entity_slug": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Entité à laquelle l'intégration est rattachée." }, "data_environment": { "type": "string", "description": "Environnement de données auquel ces informations se rapportent." }, "subject": { "type": "string" }, "due_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "acknowledged_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "completed_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de fin, lorsqu'une exécution ou un traitement est terminé." }, "certificate_reference": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Référence du certificat d'effacement, si elle existe; null ne constitue pas une preuve d'effacement." }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." }, "updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "id", "case_type", "status", "source", "requester_user_id", "requester_email", "entity_slug", "data_environment", "subject", "due_at", "acknowledged_at", "completed_at", "certificate_reference", "created_at", "updated_at" ] }, "description": "Dossiers RGPD exportables associés au sujet." }, "pappers_request_metadata": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "entity_slug": { "type": "string", "description": "Entité à laquelle l'intégration est rattachée." }, "data_environment": { "type": "string", "description": "Environnement de données auquel ces informations se rapportent." }, "request_kind": { "type": "string" }, "source": { "type": "string", "description": "Origine déclarée de l'événement ou du remboursement." }, "state": { "type": "string", "description": "État de traitement ou de validation du document." }, "relationship_roles": { "type": "array", "items": { "description": "Valeur JSON métier dont la structure dépend de la source." } }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." }, "completed_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de fin, lorsqu'une exécution ou un traitement est terminé." }, "reconciled_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "reconciliation_action": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "id", "entity_slug", "data_environment", "request_kind", "source", "state", "relationship_roles", "created_at", "completed_at", "reconciled_at", "reconciliation_action" ] }, "description": "Métadonnées exportables des requêtes fournisseur associées au sujet RGPD." }, "entity_databases": { "type": "object", "properties": { "scope": { "type": "string", "description": "Périmètre métier ou droit concerné; le modèle de cette réponse précise son type." }, "entity_slugs": { "type": "array", "items": { "type": "string" }, "description": "Entités incluses dans la collecte des données personnelles du sujet." }, "data_environment": { "type": "string", "description": "Environnement de données auquel ces informations se rapportent." }, "entities": { "type": "array", "items": { "type": "object", "properties": { "entity_slug": { "type": "string", "description": "Entité à laquelle l'intégration est rattachée." }, "tables": { "type": "object", "properties": { "notification": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "scope": { "description": "Valeur JSON métier dont la structure dépend de la source." }, "type": { "type": "string" }, "title": { "type": "string", "description": "Titre affiché pour l'événement ou le problème." }, "message": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Message destiné à l'affichage ou au diagnostic." }, "severity": { "type": "string", "enum": [ "critical", "warning", "info" ], "description": "Niveau de gravité de l'événement, distinct de son statut de traitement." }, "read": { "type": "boolean", "description": "Indique si la notification ou l'alerte a été lue." }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." } }, "required": [ "id", "scope", "type", "title", "message", "severity", "read", "created_at" ], "description": "Projection exportée pour notification; couverture: records. Champs exclus: aucun champ supplémentaire déclaré." } }, "comment": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "operation_id": { "type": "string", "description": "UUID MARKO de l'opération." }, "user_id": { "type": "string", "description": "Identifiant utilisateur MARKO; il n'est pas nécessairement un UUID." }, "author_name": { "type": "string", "description": "Nom de l'auteur de la note ou du commentaire." }, "content": { "type": "string", "description": "Contenu du commentaire ou de la note." }, "note_type": { "type": "string", "enum": [ "reporting", "call", "comite", "risque", "libre" ], "description": "Type de note ou de commentaire." }, "is_resolved": { "type": "boolean", "description": "Indique si le commentaire ou l'événement de risque est résolu." }, "resolved_by": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Identifiant de l'utilisateur qui a résolu le commentaire." }, "resolved_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de résolution de l'événement, du commentaire ou du conflit." }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." }, "updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "id", "operation_id", "user_id", "author_name", "content", "note_type", "is_resolved", "resolved_by", "resolved_at", "created_at", "updated_at" ], "description": "Projection exportée pour comment; couverture: records. Champs exclus: aucun champ supplémentaire déclaré." } }, "saved_view": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "entity_type": { "type": "string", "description": "Type de ressource auquel se rapporte la vue ou le traitement." }, "name": { "type": "string", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "filters": { "description": "Valeur JSON métier dont la structure dépend de la source." }, "columns": { "description": "Valeur JSON métier dont la structure dépend de la source." }, "sort": { "description": "Valeur JSON métier dont la structure dépend de la source." }, "is_default": { "type": "boolean", "description": "Indique si cette vue ou ce template est défini par défaut." }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." }, "updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "id", "entity_type", "name", "filters", "columns", "sort", "is_default", "created_at", "updated_at" ], "description": "Projection exportée pour saved_view; couverture: records. Champs exclus: aucun champ supplémentaire déclaré." } }, "report_document_saved_scope": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "name": { "type": "string", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "selection": { "description": "Valeur JSON métier dont la structure dépend de la source." }, "resolved_scope": { "description": "Valeur JSON métier dont la structure dépend de la source." }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." }, "updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "id", "name", "selection", "resolved_scope", "created_at", "updated_at" ], "description": "Projection exportée pour report_document_saved_scope; couverture: records. Champs exclus: aucun champ supplémentaire déclaré." } }, "report_document_import": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "created_by": { "type": "string", "description": "Identifiant de l'utilisateur qui a créé le template." }, "version": { "type": "integer", "description": "Version de la ressource MARKO." }, "status": { "type": "string" }, "definition": { "description": "Valeur JSON métier dont la structure dépend de la source." }, "fields": { "description": "Valeur JSON métier dont la structure dépend de la source." }, "files": { "type": "array", "items": { "description": "Valeur JSON métier dont la structure dépend de la source." } }, "history": { "type": "array", "items": { "description": "Valeur JSON métier dont la structure dépend de la source." } }, "template_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." }, "updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de dernière modification au format ISO 8601." }, "confirmed_at": { "anyOf": [ { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, { "type": "null" } ] }, "excluded_fields": { "type": "array", "items": { "description": "Valeur JSON métier dont la structure dépend de la source." }, "description": "Champs volontairement exclus de cette projection d'export." } }, "required": [ "id", "created_by", "version", "status", "definition", "fields", "files", "history", "template_id", "created_at", "updated_at", "confirmed_at", "excluded_fields" ], "description": "Projection exportée pour report_document_import; couverture: records. Champs exclus: files.storage_key, files.storage_provider, files.binary_content, comparison, history.comparison_statistics." } }, "report_document_recipient_batch": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "owner_id": { "type": "string" }, "template_revision_id": { "type": "string", "format": "uuid" }, "cutoff_date": { "type": "string", "format": "date" }, "idempotency_key": { "type": "string", "format": "uuid", "description": "Clé utilisée pour cette intention; la conserver avec le job ou la ressource." }, "status": { "type": "string" }, "created_at": { "type": "string", "format": "date-time", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "id", "owner_id", "template_revision_id", "cutoff_date", "idempotency_key", "status", "created_at", "updated_at" ], "description": "Projection exportée pour report_document_recipient_batch; couverture: records. Champs exclus: template_name, scope_selection, resolved_scope, request_hash." } }, "report_document_recipient_batch_item": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "batch_id": { "type": "string", "format": "uuid" }, "instance_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ] }, "status": { "type": "string" }, "attempt_count": { "type": "integer" }, "completed_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de fin, lorsqu'une exécution ou un traitement est terminé." }, "created_at": { "type": "string", "format": "date-time", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "id", "batch_id", "instance_id", "status", "attempt_count", "completed_at", "created_at", "updated_at" ], "description": "Projection exportée pour report_document_recipient_batch_item; couverture: records. Champs exclus: recipient_id, recipient_name, error." } }, "report_document_recipient_batch_event": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "batch_id": { "type": "string", "format": "uuid" }, "item_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ] }, "action": { "type": "string", "description": "Action effectuée sur le compte utilisateur." }, "actor": { "type": "string" }, "created_at": { "type": "string", "format": "date-time", "description": "Date de création au format ISO 8601." } }, "required": [ "id", "batch_id", "item_id", "action", "actor", "created_at" ], "description": "Projection exportée pour report_document_recipient_batch_event; couverture: records. Champs exclus: aucun champ supplémentaire déclaré." } }, "report_document_esg_consumption": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "created_by": { "type": "string", "description": "Identifiant de l'utilisateur qui a créé le template." }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." } }, "required": [ "id", "created_by", "created_at" ], "description": "Projection exportée pour report_document_esg_consumption; couverture: records. Champs exclus: operation_id, year, metric, value, collected_at, source_document_id, supersedes_id." } }, "report_document_recurrence": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "owner_id": { "type": "string" }, "source_instance_id": { "type": "string", "format": "uuid" }, "template_revision_id": { "type": "string", "format": "uuid" }, "version": { "type": "integer", "description": "Version de la ressource MARKO." }, "enabled": { "type": "boolean", "description": "Indique si cette définition est activée." }, "periodicity": { "type": "string" }, "first_cutoff_date": { "type": "string", "format": "date" }, "delay_days": { "type": "integer" }, "local_time": { "type": "string" }, "timezone": { "type": "string" }, "next_cutoff_date": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ] }, "next_run_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de la prochaine exécution planifiée, si elle existe." }, "last_instance_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ] }, "last_completed_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "last_status": { "type": "string" }, "last_error": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Dernière erreur enregistrée pour cette définition de workflow." }, "attempt_count": { "type": "integer" }, "created_at": { "type": "string", "format": "date-time", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "id", "owner_id", "source_instance_id", "template_revision_id", "version", "enabled", "periodicity", "first_cutoff_date", "delay_days", "local_time", "timezone", "next_cutoff_date", "next_run_at", "last_instance_id", "last_completed_at", "last_status", "last_error", "attempt_count", "created_at", "updated_at" ], "description": "Projection exportée pour report_document_recurrence; couverture: records. Champs exclus: name, resolved_scope, scope_selection, event_id." } }, "report_document_recurrence_occurrence": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "recurrence_id": { "type": "string", "format": "uuid" }, "cutoff_date": { "type": "string", "format": "date" }, "status": { "type": "string" }, "instance_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ] }, "attempt_count": { "type": "integer" }, "error": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Message d'échec de l'enrichissement SIREN, lorsqu'il existe." }, "completed_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de fin, lorsqu'une exécution ou un traitement est terminé." }, "created_at": { "type": "string", "format": "date-time", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "id", "recurrence_id", "cutoff_date", "status", "instance_id", "attempt_count", "error", "completed_at", "created_at", "updated_at" ], "description": "Projection exportée pour report_document_recurrence_occurrence; couverture: records. Champs exclus: aucun champ supplémentaire déclaré." } }, "custom_dashboard_ritual": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "dashboard_id": { "type": "string" }, "version": { "type": "integer", "description": "Version de la ressource MARKO." }, "enabled": { "type": "boolean", "description": "Indique si cette définition est activée." }, "weekday": { "type": "integer" }, "local_time": { "type": "string" }, "timezone": { "type": "string" }, "advance_minutes": { "type": "integer" }, "next_meeting_at": { "anyOf": [ { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, { "type": "null" } ] }, "next_freeze_at": { "anyOf": [ { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, { "type": "null" } ] }, "last_status": { "type": "string" }, "last_error": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Dernière erreur enregistrée pour cette définition de workflow." }, "last_completed_at": { "anyOf": [ { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, { "type": "null" } ] }, "last_snapshot_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." }, "updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "id", "dashboard_id", "version", "enabled", "weekday", "local_time", "timezone", "advance_minutes", "next_meeting_at", "next_freeze_at", "last_status", "last_error", "last_completed_at", "last_snapshot_id", "created_at", "updated_at" ], "description": "Projection exportée pour custom_dashboard_ritual; couverture: records. Champs exclus: aucun champ supplémentaire déclaré." } }, "custom_dashboard_ritual_occurrence": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "ritual_id": { "type": "string" }, "version": { "type": "integer", "description": "Version de la ressource MARKO." }, "meeting_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "status": { "type": "string" }, "snapshot_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "completed_at": { "anyOf": [ { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, { "type": "null" } ], "description": "Date de fin, lorsqu'une exécution ou un traitement est terminé." } }, "required": [ "id", "ritual_id", "version", "meeting_at", "status", "snapshot_id", "completed_at" ], "description": "Projection exportée pour custom_dashboard_ritual_occurrence; couverture: records. Champs exclus: aucun champ supplémentaire déclaré." } }, "custom_dashboard_snapshot": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "dashboard_id": { "type": "string" }, "label": { "type": "string", "description": "Libellé à afficher pour cette option, ce groupe ou ce preset." }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." }, "content_hash": { "type": "string" }, "contains_alerts": { "type": "boolean" }, "operation_count": { "type": "integer" }, "widget_count": { "type": "integer", "description": "Nombre de widgets configurés dans le dashboard." }, "name": { "type": "string", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." } }, "required": [ "id", "dashboard_id", "label", "created_at", "content_hash", "contains_alerts", "operation_count", "widget_count", "name" ], "description": "Projection exportée pour custom_dashboard_snapshot; couverture: records. Champs exclus: payload, request_hash, request_id." } }, "custom_dashboard": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "relationship": { "type": "string" }, "sharing": { "type": "object", "properties": { "visibility": { "description": "Valeur JSON métier dont la structure dépend de la source." }, "permission": { "description": "Valeur JSON métier dont la structure dépend de la source." }, "member_ids": { "type": "array", "items": { "description": "Valeur JSON métier dont la structure dépend de la source." }, "description": "Identifiants des membres concernés par le partage du dashboard." } }, "required": [ "visibility", "permission", "member_ids" ], "description": "Visibilité, permissions et membres du partage du dashboard." } }, "required": [ "id", "relationship", "sharing" ], "description": "Projection exportée pour custom_dashboard; couverture: records. Champs exclus: share_token." } }, "kanban_task": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "operation_id": { "type": "string", "description": "UUID MARKO de l'opération." }, "titre": { "type": "string", "description": "Titre de la tâche Kanban." }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Description libre de la ressource." }, "statut": { "type": "string", "enum": [ "prep", "todo", "in_progress", "done" ], "description": "Statut de la tâche Kanban." }, "categorie": { "type": "string", "enum": [ "dossier", "covenant", "reporting", "mandats", "contrats", "custom" ], "description": "Catégorie de la tâche Kanban, distincte de sa priorité et de son statut." }, "assignee_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Identifiant utilisateur du responsable de la tâche; ce champ n'est pas nécessairement un UUID." }, "due_date": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date d'échéance de la tâche, au format YYYY-MM-DD." }, "completed_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de fin, lorsqu'une exécution ou un traitement est terminé." }, "phase_key": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Clé de phase métier à laquelle la tâche est rattachée." }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." }, "updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "id", "operation_id", "titre", "description", "statut", "categorie", "assignee_id", "due_date", "completed_at", "phase_key", "created_at", "updated_at" ], "description": "Projection exportée pour kanban_task; couverture: records. Champs exclus: aucun champ supplémentaire déclaré." } }, "support_ticket": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "user_id": { "type": "string", "description": "Identifiant utilisateur MARKO; il n'est pas nécessairement un UUID." }, "subject": { "type": "string" }, "description": { "type": "string", "description": "Description libre de la ressource." }, "request_type": { "type": "string", "enum": [ "incident", "question", "feature_request", "security_rgpd", "billing_contract" ] }, "impact": { "type": "string", "enum": [ "minor", "moderate", "major", "critical" ], "description": "Indication de l'effet métier attendu du preset." }, "urgency": { "type": "string", "enum": [ "low", "normal", "high", "immediate" ] }, "derived_priority": { "type": "string", "enum": [ "low", "medium", "high", "critical" ] }, "status": { "type": "string", "enum": [ "open", "in_progress", "resolved", "closed" ] }, "public_status_label": { "type": "string" }, "next_action": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "waiting_on": { "type": "string", "enum": [ "marko", "customer", "third_party", "none" ] }, "page_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "resource_ref": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "reproduction_steps": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "diagnostic_context": { "description": "Valeur JSON métier dont la structure dépend de la source." }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." }, "updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "id", "user_id", "subject", "description", "request_type", "impact", "urgency", "derived_priority", "status", "public_status_label", "next_action", "waiting_on", "page_url", "resource_ref", "reproduction_steps", "diagnostic_context", "created_at", "updated_at" ], "description": "Projection exportée pour support_ticket; couverture: records. Champs exclus: aucun champ supplémentaire déclaré." } }, "support_ticket_draft": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "user_id": { "type": "string", "description": "Identifiant utilisateur MARKO; il n'est pas nécessairement un UUID." }, "entity_slug": { "type": "string", "description": "Entité à laquelle l'intégration est rattachée." }, "source_kind": { "type": "string", "description": "Nature de l'origine de l'option: catalogue MARKO ou source propre à l'entité." }, "subject": { "type": "string" }, "description": { "type": "string", "description": "Description libre de la ressource." }, "page_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "resource_ref": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "source_context": { "description": "Valeur JSON métier dont la structure dépend de la source." }, "activated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "expires_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date d'expiration du bearer." }, "consumed_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." }, "updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "id", "user_id", "entity_slug", "source_kind", "subject", "description", "page_url", "resource_ref", "source_context", "activated_at", "expires_at", "consumed_at", "created_at", "updated_at" ], "description": "Projection exportée pour support_ticket_draft; couverture: records. Champs exclus: aucun champ supplémentaire déclaré." } }, "ticket_comment": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "ticket_id": { "type": "string" }, "user_id": { "type": "string", "description": "Identifiant utilisateur MARKO; il n'est pas nécessairement un UUID." }, "author_name": { "type": "string", "description": "Nom de l'auteur de la note ou du commentaire." }, "content": { "type": "string", "description": "Contenu du commentaire ou de la note." }, "visibility": { "type": "string", "enum": [ "public", "internal" ], "description": "Périmètre de visibilité du partage du dashboard." }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." }, "updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "id", "ticket_id", "user_id", "author_name", "content", "visibility", "created_at", "updated_at" ], "description": "Projection exportée pour ticket_comment; couverture: records. Champs exclus: aucun champ supplémentaire déclaré." } }, "ticket_attachment": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "ticket_id": { "type": "string" }, "uploaded_by_user_id": { "type": "string" }, "filename": { "type": "string", "description": "Nom du fichier." }, "content_type": { "type": "string" }, "size_bytes": { "type": "integer" }, "sha256": { "type": "string" }, "is_internal": { "type": "boolean" }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." }, "updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "id", "ticket_id", "uploaded_by_user_id", "filename", "content_type", "size_bytes", "sha256", "is_internal", "created_at", "updated_at" ], "description": "Projection exportée pour ticket_attachment; couverture: metadata_only. Champs exclus: storage_object, storage_path." } }, "ai_audit_log": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "entity_slug": { "type": "string", "description": "Entité à laquelle l'intégration est rattachée." }, "user_id": { "type": "string", "description": "Identifiant utilisateur MARKO; il n'est pas nécessairement un UUID." }, "document_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "UUID MARKO du document." }, "operation_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "UUID MARKO de l'opération." }, "provider": { "type": "string", "enum": [ "gemini", "stub", "heuristic" ], "description": "Fournisseur utilisé par le job d'extraction IA." }, "model_name": { "type": "string" }, "prompt_text": { "type": "string" }, "prompt_hash": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "legal_hold": { "type": "boolean" }, "erased_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "response_hash": { "type": "string" }, "input_tokens": { "type": "integer" }, "output_tokens": { "type": "integer" }, "latency_ms": { "type": "number" }, "success": { "type": "boolean", "description": "Indique si l'enrichissement SIREN a produit un résultat exploitable." }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." } }, "required": [ "id", "entity_slug", "user_id", "document_id", "operation_id", "provider", "model_name", "prompt_text", "prompt_hash", "legal_hold", "erased_at", "response_hash", "input_tokens", "output_tokens", "latency_ms", "success", "created_at" ], "description": "Projection exportée pour ai_audit_log; couverture: metadata_only. Champs exclus: prompt_ciphertext, prompt_encryption_key_version, error_message." } }, "kb_article_feedback": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "article_id": { "type": "string" }, "helpful": { "type": "boolean" }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." }, "updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "id", "article_id", "helpful", "created_at", "updated_at" ], "description": "Projection exportée pour kb_article_feedback; couverture: records. Champs exclus: aucun champ supplémentaire déclaré." } }, "feature_request": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "title": { "type": "string", "description": "Titre affiché pour l'événement ou le problème." }, "description": { "type": "string", "description": "Description libre de la ressource." }, "category": { "type": "string", "description": "Catégorie de la note; les règles exactes dépendent de la route. Pour l'import externe: chaîne de 1 à 80 caractères, libre par défaut." }, "status": { "type": "string", "enum": [ "under_review", "planned", "delivered", "declined" ] }, "planned_quarter": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "delivered_version": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "votes_count": { "type": "integer" }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." }, "updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "id", "title", "description", "category", "status", "planned_quarter", "delivered_version", "votes_count", "created_at", "updated_at" ], "description": "Projection exportée pour feature_request; couverture: records. Champs exclus: aucun champ supplémentaire déclaré." } }, "feature_request_vote": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "request_id": { "type": "string", "description": "Identifiant de corrélation pour le diagnostic de la requête." }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." }, "updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "id", "request_id", "created_at", "updated_at" ], "description": "Projection exportée pour feature_request_vote; couverture: records. Champs exclus: aucun champ supplémentaire déclaré." } }, "support_ticket_csat": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "ticket_id": { "type": "string" }, "score": { "type": "integer", "description": "Score de classement de la recommandation." }, "comment": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." }, "updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "id", "ticket_id", "score", "comment", "created_at", "updated_at" ], "description": "Projection exportée pour support_ticket_csat; couverture: records. Champs exclus: aucun champ supplémentaire déclaré." } }, "briefing_series": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "entity_slug": { "type": "string", "description": "Entité à laquelle l'intégration est rattachée." }, "series_type": { "type": "string" }, "schedule_cron": { "type": "string" }, "is_active": { "type": "boolean", "description": "Indique si l'élément est actif." }, "config": { "description": "Valeur JSON métier dont la structure dépend de la source." }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." }, "updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "id", "entity_slug", "series_type", "schedule_cron", "is_active", "config", "created_at", "updated_at" ], "description": "Projection exportée pour briefing_series; couverture: records. Champs exclus: aucun champ supplémentaire déclaré." } }, "briefing_response": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "step_id": { "type": "string" }, "response_type": { "type": "string" }, "value": { "description": "Valeur JSON métier dont la structure dépend de la source." }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." }, "updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "id", "step_id", "response_type", "value", "created_at", "updated_at" ], "description": "Projection exportée pour briefing_response; couverture: records. Champs exclus: aucun champ supplémentaire déclaré." } }, "comment_activity": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "operation_id": { "type": "string", "description": "UUID MARKO de l'opération." }, "comment_id": { "type": "string" }, "actor_user_id": { "type": "string" }, "actor_name": { "type": "string", "description": "Nom de l'auteur affiché dans la chronologie." }, "note_type": { "type": "string", "enum": [ "reporting", "call", "comite", "risque", "libre" ], "description": "Type de note ou de commentaire." }, "action": { "type": "string", "enum": [ "created", "updated", "resolved", "deleted" ], "description": "Action effectuée sur le compte utilisateur." }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." } }, "required": [ "id", "operation_id", "comment_id", "actor_user_id", "actor_name", "note_type", "action", "created_at" ], "description": "Projection exportée pour comment_activity; couverture: actor_relationship_metadata_only. Champs exclus: content_snapshot, previous_content." } }, "workflow_config_relationships": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "description": "Identifiant MARKO de la ressource." }, "workflow_key": { "type": "string", "description": "Clé du workflow proposé dans le groupe de recommandations." }, "relationship_roles": { "type": "array", "items": { "description": "Valeur JSON métier dont la structure dépend de la source." } }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." }, "updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "id", "workflow_key", "relationship_roles", "created_at", "updated_at" ], "description": "Projection exportée pour workflow_config_relationships; couverture: relationship_metadata_only. Champs exclus: schedule_config, config." } }, "drive_oauth_state": { "type": "array", "items": { "type": "object", "properties": { "source_id": { "type": "string" }, "registry_version": { "type": "string" }, "relationship_fields": { "type": "array", "items": { "type": "string" } }, "embedded_subject_reference": { "type": "boolean" }, "derived_relationship": { "type": "boolean" }, "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "operation_type": { "type": "string" }, "ttl_expires_at": { "type": "string", "format": "date-time" }, "created_at": { "type": "string", "format": "date-time", "description": "Date de création au format ISO 8601." } }, "required": [ "source_id", "registry_version", "relationship_fields", "embedded_subject_reference", "derived_relationship", "id", "operation_type", "ttl_expires_at", "created_at" ], "description": "Projection exportée pour drive_oauth_state; couverture: relationship_metadata_only. Champs exclus: key_hash, result_cached." } }, "drive_connection": { "type": "array", "items": { "type": "object", "properties": { "source_id": { "type": "string" }, "registry_version": { "type": "string" }, "relationship_fields": { "type": "array", "items": { "type": "string" } }, "embedded_subject_reference": { "type": "boolean" }, "derived_relationship": { "type": "boolean" }, "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "provider_kind": { "type": "string", "enum": [ "google_drive" ] }, "auth_mode": { "type": "string", "enum": [ "delegated" ] }, "status": { "type": "string", "enum": [ "connected", "revoked", "error" ] }, "connected_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "revoked_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "error_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "token_expires_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "token_refreshed_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "provider_session_invalidated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "last_change_sync_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "created_at": { "type": "string", "format": "date-time", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "source_id", "registry_version", "relationship_fields", "embedded_subject_reference", "derived_relationship", "id", "provider_kind", "auth_mode", "status", "connected_at", "revoked_at", "error_at", "token_expires_at", "token_refreshed_at", "provider_session_invalidated_at", "last_change_sync_at", "created_at", "updated_at" ], "description": "Projection exportée pour drive_connection; couverture: relationship_metadata_only. Champs exclus: entity_slug, owner_user_id, owner_email, credential_ref, encrypted_token_payload, encrypted_token_key_version, refresh_token_stored, scopes, metadata, last_error, connected_by_user_id, revoked_by_user_id, change_cursor_ciphertext, change_cursor_ref." } }, "drive_action_audit": { "type": "array", "items": { "type": "object", "properties": { "source_id": { "type": "string" }, "registry_version": { "type": "string" }, "relationship_fields": { "type": "array", "items": { "type": "string" } }, "embedded_subject_reference": { "type": "boolean" }, "derived_relationship": { "type": "boolean" }, "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "connection_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ] }, "provider_kind": { "type": "string" }, "auth_mode": { "type": "string" }, "action": { "type": "string", "description": "Action effectuée sur le compte utilisateur." }, "result": { "type": "string", "description": "Résultat public de l'exécution; structure variable selon le preset ou le type de job." }, "created_at": { "type": "string", "format": "date-time", "description": "Date de création au format ISO 8601." } }, "required": [ "source_id", "registry_version", "relationship_fields", "embedded_subject_reference", "derived_relationship", "id", "connection_id", "provider_kind", "auth_mode", "action", "result", "created_at" ], "description": "Projection exportée pour drive_action_audit; couverture: relationship_metadata_only. Champs exclus: entity_slug, owner_user_id, actor_user_id, actor_email, reason, details_json." } }, "drive_import": { "type": "array", "items": { "type": "object", "properties": { "source_id": { "type": "string" }, "registry_version": { "type": "string" }, "relationship_fields": { "type": "array", "items": { "type": "string" } }, "embedded_subject_reference": { "type": "boolean" }, "derived_relationship": { "type": "boolean" }, "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "connection_id": { "type": "string", "format": "uuid" }, "provider_kind": { "type": "string", "enum": [ "google_drive" ] }, "status": { "type": "string", "enum": [ "in_progress", "imported", "quarantined", "failed_retryable", "failed_permanent" ] }, "document_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "description": "UUID MARKO du document." }, "last_error_code": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "created_at": { "type": "string", "format": "date-time", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "source_id", "registry_version", "relationship_fields", "embedded_subject_reference", "derived_relationship", "id", "connection_id", "provider_kind", "status", "document_id", "last_error_code", "created_at", "updated_at" ], "description": "Projection exportée pour drive_import; couverture: relationship_metadata_only. Champs exclus: entity_slug, owner_user_id, remote_object_id, remote_container_ref, version_ref, export_mime_type, import_fingerprint, source_object_ref_id, permission_snapshot_ref_id, source_metadata, result_metadata." } }, "drive_change": { "type": "array", "items": { "type": "object", "properties": { "source_id": { "type": "string" }, "registry_version": { "type": "string" }, "relationship_fields": { "type": "array", "items": { "type": "string" } }, "embedded_subject_reference": { "type": "boolean" }, "derived_relationship": { "type": "boolean" }, "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "connection_id": { "type": "string", "format": "uuid" }, "import_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ] }, "document_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "description": "UUID MARKO du document." }, "change_kind": { "type": "string" }, "source_state": { "type": "string" }, "reason_code": { "type": "string", "description": "Code structuré du motif de refus; préférable au texte du message pour le diagnostic." }, "provider_occurred_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "observed_at": { "type": "string", "format": "date-time" } }, "required": [ "source_id", "registry_version", "relationship_fields", "embedded_subject_reference", "derived_relationship", "id", "connection_id", "import_id", "document_id", "change_kind", "source_state", "reason_code", "provider_occurred_at", "observed_at" ], "description": "Projection exportée pour drive_change; couverture: relationship_metadata_only. Champs exclus: entity_slug, owner_user_id, change_ref, cursor_ref, details_json." } }, "drive_privacy_receipt": { "type": "array", "items": { "type": "object", "properties": { "source_id": { "type": "string" }, "registry_version": { "type": "string" }, "relationship_fields": { "type": "array", "items": { "type": "string" } }, "embedded_subject_reference": { "type": "boolean" }, "derived_relationship": { "type": "boolean" }, "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "writer_id": { "type": "string" }, "subject_count": { "type": "integer" }, "phase": { "type": "string", "description": "Phase métier de l'opération; distincte de son statut." }, "status": { "type": "string" }, "terminal_reason": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "completed_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de fin, lorsqu'une exécution ou un traitement est terminé." }, "created_at": { "type": "string", "format": "date-time", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "source_id", "registry_version", "relationship_fields", "embedded_subject_reference", "derived_relationship", "id", "writer_id", "subject_count", "phase", "status", "terminal_reason", "completed_at", "created_at", "updated_at" ], "description": "Projection exportée pour drive_privacy_receipt; couverture: relationship_metadata_only. Champs exclus: entity_slug, data_environment, connection_id, operation_ref, candidate_fingerprint, connection_ref, connection_incarnation." } }, "ai_extract_upload_reservation": { "type": "array", "items": { "type": "object", "properties": { "source_id": { "type": "string" }, "registry_version": { "type": "string" }, "relationship_fields": { "type": "array", "items": { "type": "string" } }, "embedded_subject_reference": { "type": "boolean" }, "derived_relationship": { "type": "boolean" }, "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "content_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "declared_size_bytes": { "type": "integer" }, "status": { "type": "string" }, "expires_at": { "type": "string", "format": "date-time", "description": "Date d'expiration du bearer." }, "finalized_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "created_at": { "type": "string", "format": "date-time", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "source_id", "registry_version", "relationship_fields", "embedded_subject_reference", "derived_relationship", "id", "content_type", "declared_size_bytes", "status", "expires_at", "finalized_at", "created_at", "updated_at" ], "description": "Projection exportée pour ai_extract_upload_reservation; couverture: relationship_metadata_only. Champs exclus: requested_by_user_id, storage_key, filename, checksum_sha256, resolved_document_id, finalize_fingerprint." } }, "ai_extract_batch": { "type": "array", "items": { "type": "object", "properties": { "source_id": { "type": "string" }, "registry_version": { "type": "string" }, "relationship_fields": { "type": "array", "items": { "type": "string" } }, "embedded_subject_reference": { "type": "boolean" }, "derived_relationship": { "type": "boolean" }, "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "batch_id": { "type": "string" }, "source": { "type": "string", "description": "Origine déclarée de l'événement ou du remboursement." }, "status": { "type": "string" }, "runtime_mode": { "type": "string" }, "operation_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "description": "UUID MARKO de l'opération." }, "documents_total": { "type": "integer" }, "documents_done": { "type": "integer" }, "documents_active": { "type": "integer" }, "documents_error": { "type": "integer" }, "pending_runs": { "type": "integer" }, "review_ready_count": { "type": "integer" }, "history_window_size": { "type": "integer" }, "current_stage": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "dominant_stage": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "created_at": { "type": "string", "format": "date-time", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "source_id", "registry_version", "relationship_fields", "embedded_subject_reference", "derived_relationship", "id", "batch_id", "source", "status", "runtime_mode", "operation_id", "documents_total", "documents_done", "documents_active", "documents_error", "pending_runs", "review_ready_count", "history_window_size", "current_stage", "dominant_stage", "created_at", "updated_at" ], "description": "Projection exportée pour ai_extract_batch; couverture: relationship_metadata_only. Champs exclus: requested_by_user_id, document_ids, latest_job_id, dominant_issue, dominant_issue_kind, dominant_issue_document_id, foreground_url, resume_url, latest_workbench_url, batch_metadata." } }, "ai_extract_batch_member": { "type": "array", "items": { "type": "object", "properties": { "source_id": { "type": "string" }, "registry_version": { "type": "string" }, "relationship_fields": { "type": "array", "items": { "type": "string" } }, "embedded_subject_reference": { "type": "boolean" }, "derived_relationship": { "type": "boolean" }, "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "batch_id": { "type": "string" }, "batch_generation_id": { "type": "string", "format": "uuid" }, "document_id": { "type": "string", "format": "uuid", "description": "UUID MARKO du document." }, "source": { "type": "string", "description": "Origine déclarée de l'événement ou du remboursement." }, "operation_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "description": "UUID MARKO de l'opération." }, "registered_at": { "type": "string", "format": "date-time" } }, "required": [ "source_id", "registry_version", "relationship_fields", "embedded_subject_reference", "derived_relationship", "id", "batch_id", "batch_generation_id", "document_id", "source", "operation_id", "registered_at" ], "description": "Projection exportée pour ai_extract_batch_member; couverture: relationship_metadata_only. Champs exclus: requested_by_user_id." } }, "ai_extract_dispatch_intent": { "type": "array", "items": { "type": "object", "properties": { "source_id": { "type": "string" }, "registry_version": { "type": "string" }, "relationship_fields": { "type": "array", "items": { "type": "string" } }, "embedded_subject_reference": { "type": "boolean" }, "derived_relationship": { "type": "boolean" }, "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "member_id": { "type": "string", "format": "uuid" }, "batch_id": { "type": "string" }, "batch_generation_id": { "type": "string", "format": "uuid" }, "document_id": { "type": "string", "format": "uuid", "description": "UUID MARKO du document." }, "sequence": { "type": "integer" }, "state": { "type": "string", "description": "État de traitement ou de validation du document." }, "job_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "description": "UUID du job durable à suivre." }, "reason": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Motif donné pour la décision sur la recommandation." }, "source": { "type": "string", "description": "Origine déclarée de l'événement ou du remboursement." }, "recorded_at": { "type": "string", "format": "date-time" } }, "required": [ "source_id", "registry_version", "relationship_fields", "embedded_subject_reference", "derived_relationship", "id", "member_id", "batch_id", "batch_generation_id", "document_id", "sequence", "state", "job_id", "reason", "source", "recorded_at" ], "description": "Projection exportée pour ai_extract_dispatch_intent; couverture: relationship_metadata_only. Champs exclus: intent_key." } }, "ai_extract_processing_job": { "type": "array", "items": { "type": "object", "properties": { "source_id": { "type": "string" }, "registry_version": { "type": "string" }, "relationship_fields": { "type": "array", "items": { "type": "string" } }, "embedded_subject_reference": { "type": "boolean" }, "derived_relationship": { "type": "boolean" }, "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "job_type": { "type": "string", "enum": [ "ai_extraction", "ai_categorization", "kpi_calculation", "echeancier_generation" ], "description": "Type de traitement exécuté par le job." }, "status": { "type": "string", "enum": [ "pending", "running", "completed", "failed", "dead_letter", "cancelled" ] }, "entity_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Type de ressource auquel se rapporte la vue ou le traitement." }, "entity_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "description": "Identifiant de l'entité MARKO à laquelle cette ressource appartient." }, "parent_job_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ] }, "retry_count": { "type": "integer", "description": "Nombre de reprises enregistrées pour ce traitement." }, "max_retries": { "type": "integer" }, "claim_epoch": { "type": "integer" }, "next_retry_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "started_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de début du traitement." }, "completed_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de fin, lorsqu'une exécution ou un traitement est terminé." }, "created_at": { "type": "string", "format": "date-time", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "source_id", "registry_version", "relationship_fields", "embedded_subject_reference", "derived_relationship", "id", "job_type", "status", "entity_type", "entity_id", "parent_job_id", "retry_count", "max_retries", "claim_epoch", "next_retry_at", "started_at", "completed_at", "created_at", "updated_at" ], "description": "Projection exportée pour ai_extract_processing_job; couverture: relationship_metadata_only. Champs exclus: requested_by_user_id, privacy_origin_receipt_id, locked_by, locked_at, idempotency_key, error_message, result." } }, "ai_extract_classification_review": { "type": "array", "items": { "type": "object", "properties": { "source_id": { "type": "string" }, "registry_version": { "type": "string" }, "relationship_fields": { "type": "array", "items": { "type": "string" } }, "embedded_subject_reference": { "type": "boolean" }, "derived_relationship": { "type": "boolean" }, "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "document_id": { "type": "string", "format": "uuid", "description": "UUID MARKO du document." }, "job_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "description": "UUID du job durable à suivre." }, "queue_name": { "type": "string" }, "queue_status": { "type": "string" }, "assigned_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "divergence_status": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "provider_document_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "registry_top_score": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "similarity_score": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "resolved_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de résolution de l'événement, du commentaire ou du conflit." }, "created_at": { "type": "string", "format": "date-time", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "source_id", "registry_version", "relationship_fields", "embedded_subject_reference", "derived_relationship", "id", "document_id", "job_id", "queue_name", "queue_status", "assigned_at", "divergence_status", "provider_document_type", "registry_top_score", "similarity_score", "resolved_at", "created_at", "updated_at" ], "description": "Projection exportée pour ai_extract_classification_review; couverture: relationship_metadata_only. Champs exclus: requested_by_user_id, assigned_to_user_id, registry_top_source_document_ref_id, registry_top_title, reason, review_payload." } }, "ai_extract_prepared_mutation": { "type": "array", "items": { "type": "object", "properties": { "source_id": { "type": "string" }, "registry_version": { "type": "string" }, "relationship_fields": { "type": "array", "items": { "type": "string" } }, "embedded_subject_reference": { "type": "boolean" }, "derived_relationship": { "type": "boolean" }, "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "state": { "type": "string", "description": "État de traitement ou de validation du document." }, "batch_id": { "type": "string" }, "plan_version": { "type": "string" }, "prepared_at": { "type": "string", "format": "date-time" }, "expires_at": { "type": "string", "format": "date-time", "description": "Date d'expiration du bearer." }, "confirmation_claimed_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "confirmation_lease_expires_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "completed_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de fin, lorsqu'une exécution ou un traitement est terminé." }, "created_at": { "type": "string", "format": "date-time", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "source_id", "registry_version", "relationship_fields", "embedded_subject_reference", "derived_relationship", "id", "state", "batch_id", "plan_version", "prepared_at", "expires_at", "confirmation_claimed_at", "confirmation_lease_expires_at", "completed_at", "created_at", "updated_at" ], "description": "Projection exportée pour ai_extract_prepared_mutation; couverture: relationship_metadata_only. Champs exclus: actor_id, tenant_scope, plan_fingerprint, plan, preview_snapshot, confirmation_idempotency_hash, receipt_ids, result_payload." } }, "ai_extract_field_suggestion": { "type": "array", "items": { "type": "object", "properties": { "source_id": { "type": "string" }, "registry_version": { "type": "string" }, "relationship_fields": { "type": "array", "items": { "type": "string" } }, "embedded_subject_reference": { "type": "boolean" }, "derived_relationship": { "type": "boolean" }, "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "document_id": { "type": "string", "format": "uuid", "description": "UUID MARKO du document." }, "operation_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "description": "UUID MARKO de l'opération." }, "target_table": { "type": "string" }, "target_column": { "type": "string" }, "target_record_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ] }, "confidence": { "type": "string", "description": "Valeur décimale sérialisée en chaîne dans cet export JSON." }, "field_type": { "type": "string" }, "requires_manual_review": { "type": "boolean" }, "provider_status": { "type": "string" }, "status": { "type": "string" }, "reviewed_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "created_at": { "type": "string", "format": "date-time", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "source_id", "registry_version", "relationship_fields", "embedded_subject_reference", "derived_relationship", "id", "document_id", "operation_id", "target_table", "target_column", "target_record_id", "confidence", "field_type", "requires_manual_review", "provider_status", "status", "reviewed_at", "created_at", "updated_at" ], "description": "Projection exportée pour ai_extract_field_suggestion; couverture: relationship_metadata_only. Champs exclus: current_value, suggested_value, applied_value, review_history, guard_flags, auto_apply_threshold, source_field, extraction_context, evidence_page, evidence_bbox, evidence_snippet, reviewed_by, review_note." } }, "ai_extract_feedback": { "type": "array", "items": { "type": "object", "properties": { "source_id": { "type": "string" }, "registry_version": { "type": "string" }, "relationship_fields": { "type": "array", "items": { "type": "string" } }, "embedded_subject_reference": { "type": "boolean" }, "derived_relationship": { "type": "boolean" }, "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "suggestion_id": { "type": "string", "format": "uuid" }, "document_type": { "type": "string", "description": "Type métier du document; distinct de son type MIME." }, "field_name": { "type": "string", "description": "Nom du champ modifié dans l'événement d'historique." }, "action": { "type": "string", "description": "Action effectuée sur le compte utilisateur." }, "confidence_at_extraction": { "anyOf": [ { "type": "number" }, { "type": "null" } ] }, "created_at": { "type": "string", "format": "date-time", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "source_id", "registry_version", "relationship_fields", "embedded_subject_reference", "derived_relationship", "id", "suggestion_id", "document_type", "field_name", "action", "confidence_at_extraction", "created_at", "updated_at" ], "description": "Projection exportée pour ai_extract_feedback; couverture: relationship_metadata_only. Champs exclus: extracted_value, corrected_value, user_id, prompt_version_id, metadata_extra, deterministic_key." } }, "ai_extract_apply_receipt": { "type": "array", "items": { "type": "object", "properties": { "source_id": { "type": "string" }, "registry_version": { "type": "string" }, "relationship_fields": { "type": "array", "items": { "type": "string" } }, "embedded_subject_reference": { "type": "boolean" }, "derived_relationship": { "type": "boolean" }, "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "document_id": { "type": "string", "format": "uuid", "description": "UUID MARKO du document." }, "operation_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "description": "UUID MARKO de l'opération." }, "analysis_batch_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "target_version": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "commit_status": { "type": "string" }, "projection_status": { "type": "string" }, "repair_state": { "type": "string" }, "rollback_status": { "type": "string" }, "rollback_receipt_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ] }, "rolled_back_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "completed_at": { "type": "string", "format": "date-time", "description": "Date de fin, lorsqu'une exécution ou un traitement est terminé." } }, "required": [ "source_id", "registry_version", "relationship_fields", "embedded_subject_reference", "derived_relationship", "id", "document_id", "operation_id", "analysis_batch_id", "target_version", "commit_status", "projection_status", "repair_state", "rollback_status", "rollback_receipt_id", "rolled_back_at", "completed_at" ], "description": "Projection exportée pour ai_extract_apply_receipt; couverture: relationship_metadata_only. Champs exclus: canonical_diff_id, idempotency_key_hash, document_filename, target_ref, rolled_back_by_user_id, rollback_payload, payload." } }, "ai_extract_domain_event": { "type": "array", "items": { "type": "object", "properties": { "source_id": { "type": "string" }, "registry_version": { "type": "string" }, "relationship_fields": { "type": "array", "items": { "type": "string" } }, "embedded_subject_reference": { "type": "boolean" }, "derived_relationship": { "type": "boolean" }, "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "sequence_number": { "type": "integer" }, "event_type": { "type": "string", "description": "Type de l'événement." }, "aggregate_type": { "type": "string" }, "aggregate_id": { "type": "string", "format": "uuid" }, "status": { "type": "string", "enum": [ "pending", "processing", "completed", "failed", "dead_letter", "superseded" ] }, "retry_count": { "type": "integer", "description": "Nombre de reprises enregistrées pour ce traitement." }, "max_retries": { "type": "integer" }, "next_retry_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "caused_by_event_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ] }, "correlation_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ] }, "created_at": { "type": "string", "format": "date-time", "description": "Date de création au format ISO 8601." }, "processed_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] } }, "required": [ "source_id", "registry_version", "relationship_fields", "embedded_subject_reference", "derived_relationship", "id", "sequence_number", "event_type", "aggregate_type", "aggregate_id", "status", "retry_count", "max_retries", "next_retry_at", "caused_by_event_id", "correlation_id", "created_at", "processed_at" ], "description": "Projection exportée pour ai_extract_domain_event; couverture: relationship_metadata_only. Champs exclus: payload, idempotency_key, kpi_snapshot_at, invite_support_reported_at, invite_support_reference, invite_support_created, invite_support_attempts, invite_support_last_attempt_at, invite_support_last_error." } }, "ai_extract_asset_import_receipt": { "type": "array", "items": { "type": "object", "properties": { "source_id": { "type": "string" }, "registry_version": { "type": "string" }, "relationship_fields": { "type": "array", "items": { "type": "string" } }, "embedded_subject_reference": { "type": "boolean" }, "derived_relationship": { "type": "boolean" }, "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "receipt_contract_version": { "type": "string" }, "operation_id": { "type": "string", "format": "uuid", "description": "UUID MARKO de l'opération." }, "action": { "type": "string", "description": "Action effectuée sur le compte utilisateur." }, "commit_status": { "type": "string" }, "rollback_status": { "type": "string" }, "source_format": { "type": "string" }, "replace_existing": { "type": "boolean" }, "target_version_before": { "type": "integer" }, "target_version_after": { "type": "integer" }, "rollback_of_receipt_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ] }, "rollback_receipt_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ] }, "rolled_back_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "created_at": { "type": "string", "format": "date-time", "description": "Date de création au format ISO 8601." } }, "required": [ "source_id", "registry_version", "relationship_fields", "embedded_subject_reference", "derived_relationship", "id", "receipt_contract_version", "operation_id", "action", "commit_status", "rollback_status", "source_format", "replace_existing", "target_version_before", "target_version_after", "rollback_of_receipt_id", "rollback_receipt_id", "rolled_back_at", "created_at" ], "description": "Projection exportée pour ai_extract_asset_import_receipt; couverture: relationship_metadata_only. Champs exclus: entity_slug, idempotency_key_hash, actor_user_id, source_sha256, selected_sheet_hash, before_state, before_state_hash, intended_state_hash, readback_hash, rolled_back_by_user_id." } }, "ai_extract_object_graph_receipt": { "type": "array", "items": { "type": "object", "properties": { "source_id": { "type": "string" }, "registry_version": { "type": "string" }, "relationship_fields": { "type": "array", "items": { "type": "string" } }, "embedded_subject_reference": { "type": "boolean" }, "derived_relationship": { "type": "boolean" }, "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "analysis_batch_id": { "type": "string" }, "status": { "type": "string" }, "writer_version_ref": { "type": "string" }, "failure_reason_code": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "rollback_of_receipt_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ] }, "rollback_receipt_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ] }, "started_at": { "type": "string", "format": "date-time", "description": "Date de début du traitement." }, "committed_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "completed_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de fin, lorsqu'une exécution ou un traitement est terminé." }, "rolled_back_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "created_at": { "type": "string", "format": "date-time", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "source_id", "registry_version", "relationship_fields", "embedded_subject_reference", "derived_relationship", "id", "analysis_batch_id", "status", "writer_version_ref", "failure_reason_code", "rollback_of_receipt_id", "rollback_receipt_id", "started_at", "committed_at", "completed_at", "rolled_back_at", "created_at", "updated_at" ], "description": "Projection exportée pour ai_extract_object_graph_receipt; couverture: relationship_metadata_only. Champs exclus: entity_slug, artifact_fingerprint, plan_hash, idempotency_key_hash, requested_by_user_ref, blocker_codes, rolled_back_by_user_ref." } }, "ai_extract_dataroom_receipt": { "type": "array", "items": { "type": "object", "properties": { "source_id": { "type": "string" }, "registry_version": { "type": "string" }, "relationship_fields": { "type": "array", "items": { "type": "string" } }, "embedded_subject_reference": { "type": "boolean" }, "derived_relationship": { "type": "boolean" }, "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "entity_id": { "type": "string", "format": "uuid", "description": "Identifiant de l'entité MARKO à laquelle cette ressource appartient." }, "document_id": { "type": "string", "format": "uuid", "description": "UUID MARKO du document." }, "action": { "type": "string", "description": "Action effectuée sur le compte utilisateur." }, "status": { "type": "string" }, "rollback_of_receipt_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ] }, "rollback_receipt_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ] }, "rolled_back_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "created_at": { "type": "string", "format": "date-time", "description": "Date de création au format ISO 8601." } }, "required": [ "source_id", "registry_version", "relationship_fields", "embedded_subject_reference", "derived_relationship", "id", "entity_id", "document_id", "action", "status", "rollback_of_receipt_id", "rollback_receipt_id", "rolled_back_at", "created_at" ], "description": "Projection exportée pour ai_extract_dataroom_receipt; couverture: relationship_metadata_only. Champs exclus: proposal_id, idempotency_key_hash, actor_user_id, before_folder_ids, after_folder_ids, before_membership_hash, after_membership_hash, rolled_back_by_user_id." } }, "ai_extract_spreadsheet_stage_run": { "type": "array", "items": { "type": "object", "properties": { "source_id": { "type": "string" }, "registry_version": { "type": "string" }, "relationship_fields": { "type": "array", "items": { "type": "string" } }, "embedded_subject_reference": { "type": "boolean" }, "derived_relationship": { "type": "boolean" }, "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "processing_job_id": { "type": "string", "format": "uuid" }, "document_id": { "type": "string", "format": "uuid", "description": "UUID MARKO du document." }, "document_version": { "type": "integer" }, "operation_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "description": "UUID MARKO de l'opération." }, "protocol_version": { "type": "string" }, "state": { "type": "string", "description": "État de traitement ou de validation du document." }, "total_units": { "type": "integer" }, "source_suggestion_count": { "type": "integer" }, "provider_suggestion_count": { "type": "integer" }, "staged_item_count": { "type": "integer" }, "completed_batch_count": { "type": "integer" }, "created_suggestion_count": { "type": "integer" }, "historical_confirmation_count": { "type": "integer" }, "published_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "staging_purged_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "publication_rollback_status": { "type": "string" }, "publication_rolled_back_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "expires_at": { "type": "string", "format": "date-time", "description": "Date d'expiration du bearer." }, "legal_hold": { "type": "boolean" }, "legal_hold_event_count": { "type": "integer" }, "legal_hold_set_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "created_at": { "type": "string", "format": "date-time", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "source_id", "registry_version", "relationship_fields", "embedded_subject_reference", "derived_relationship", "id", "processing_job_id", "document_id", "document_version", "operation_id", "protocol_version", "state", "total_units", "source_suggestion_count", "provider_suggestion_count", "staged_item_count", "completed_batch_count", "created_suggestion_count", "historical_confirmation_count", "published_at", "staging_purged_at", "publication_rollback_status", "publication_rolled_back_at", "expires_at", "legal_hold", "legal_hold_event_count", "legal_hold_set_at", "created_at", "updated_at" ], "description": "Projection exportée pour ai_extract_spreadsheet_stage_run; couverture: relationship_metadata_only. Champs exclus: document_operation_id_at_stage, source_sha256, manifest_sha256, source_manifest, matrix_plan_sha256, target_specs_sha256, target_specs_snapshot, route_policy_sha256, route_payload, staged_payload_bytes, closure_batch_id, publication_generation_key, final_set_sha256, publication_receipt, publication_receipt_sha256, publication_rolled_back_by_user_id, legal_hold_last_event_sha256, legal_hold_reason, legal_hold_set_by_user_id." } }, "ai_extract_spreadsheet_hold_ledger": { "type": "array", "items": { "type": "object", "properties": { "source_id": { "type": "string" }, "registry_version": { "type": "string" }, "relationship_fields": { "type": "array", "items": { "type": "string" } }, "embedded_subject_reference": { "type": "boolean" }, "derived_relationship": { "type": "boolean" }, "stage_run_id": { "type": "string", "format": "uuid" }, "document_id": { "type": "string", "format": "uuid", "description": "UUID MARKO du document." }, "event_count": { "type": "integer" }, "last_event_at": { "type": "string", "format": "date-time" }, "current_hold_active": { "type": "boolean" }, "current_hold_set_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "retention_class": { "type": "string" }, "created_at": { "type": "string", "format": "date-time", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "source_id", "registry_version", "relationship_fields", "embedded_subject_reference", "derived_relationship", "stage_run_id", "document_id", "event_count", "last_event_at", "current_hold_active", "current_hold_set_at", "retention_class", "created_at", "updated_at" ], "description": "Projection exportée pour ai_extract_spreadsheet_hold_ledger; couverture: relationship_metadata_only. Champs exclus: tenant_entity_slug, last_event_sha256, current_hold_reason, current_hold_set_by_user_id." } }, "ai_extract_spreadsheet_hold_event": { "type": "array", "items": { "type": "object", "properties": { "source_id": { "type": "string" }, "registry_version": { "type": "string" }, "relationship_fields": { "type": "array", "items": { "type": "string" } }, "embedded_subject_reference": { "type": "boolean" }, "derived_relationship": { "type": "boolean" }, "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "stage_run_id": { "type": "string", "format": "uuid" }, "document_id": { "type": "string", "format": "uuid", "description": "UUID MARKO du document." }, "event_index": { "type": "integer" }, "action": { "type": "string", "description": "Action effectuée sur le compte utilisateur." }, "occurred_at": { "type": "string", "format": "date-time" } }, "required": [ "source_id", "registry_version", "relationship_fields", "embedded_subject_reference", "derived_relationship", "id", "stage_run_id", "document_id", "event_index", "action", "occurred_at" ], "description": "Projection exportée pour ai_extract_spreadsheet_hold_event; couverture: relationship_metadata_only. Champs exclus: reason, prior_hold_reason, actor_user_id, actor_email, tenant_entity_slug, previous_event_sha256, event_sha256." } }, "ai_extract_spreadsheet_publication_effect": { "type": "array", "items": { "type": "object", "properties": { "source_id": { "type": "string" }, "registry_version": { "type": "string" }, "relationship_fields": { "type": "array", "items": { "type": "string" } }, "embedded_subject_reference": { "type": "boolean" }, "derived_relationship": { "type": "boolean" }, "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "stage_run_id": { "type": "string", "format": "uuid" }, "effect_index": { "type": "integer" }, "effect_kind": { "type": "string" }, "target_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "description": "Identifiant de la ressource MARKO créée ou retrouvée par cet élément d'import." }, "rollback_state": { "type": "string" }, "rolled_back_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ] }, "created_at": { "type": "string", "format": "date-time", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "description": "Date de dernière modification au format ISO 8601." } }, "required": [ "source_id", "registry_version", "relationship_fields", "embedded_subject_reference", "derived_relationship", "id", "stage_run_id", "effect_index", "effect_kind", "target_id", "rollback_state", "rolled_back_at", "created_at", "updated_at" ], "description": "Projection exportée pour ai_extract_spreadsheet_publication_effect; couverture: relationship_metadata_only. Champs exclus: preimage, postimage, preimage_sha256, postimage_sha256, rolled_back_by_user_id." } } }, "required": [ "notification", "comment", "saved_view", "report_document_saved_scope", "report_document_import", "report_document_recipient_batch", "report_document_recipient_batch_item", "report_document_recipient_batch_event", "report_document_esg_consumption", "report_document_recurrence", "report_document_recurrence_occurrence", "custom_dashboard_ritual", "custom_dashboard_ritual_occurrence", "custom_dashboard_snapshot", "custom_dashboard", "kanban_task", "support_ticket", "support_ticket_draft", "ticket_comment", "ticket_attachment", "ai_audit_log", "kb_article_feedback", "feature_request", "feature_request_vote", "support_ticket_csat", "briefing_series", "briefing_response", "comment_activity", "workflow_config_relationships", "drive_oauth_state", "drive_connection", "drive_action_audit", "drive_import", "drive_change", "drive_privacy_receipt", "ai_extract_upload_reservation", "ai_extract_batch", "ai_extract_batch_member", "ai_extract_dispatch_intent", "ai_extract_processing_job", "ai_extract_classification_review", "ai_extract_prepared_mutation", "ai_extract_field_suggestion", "ai_extract_feedback", "ai_extract_apply_receipt", "ai_extract_domain_event", "ai_extract_asset_import_receipt", "ai_extract_object_graph_receipt", "ai_extract_dataroom_receipt", "ai_extract_spreadsheet_stage_run", "ai_extract_spreadsheet_hold_ledger", "ai_extract_spreadsheet_hold_event", "ai_extract_spreadsheet_publication_effect" ], "description": "Données personnelles regroupées par source. Les clés suivent le registre du format d'export." }, "status": { "type": "string", "description": "État de collecte ou de traitement de cette source de données personnelles." } }, "required": [ "entity_slug", "tables", "status" ] }, "description": "Résultats de la collecte par entité et environnement." } }, "required": [ "scope", "entity_slugs", "data_environment", "entities" ], "description": "Résultats des sources de données de l'entité incluses dans l'inventaire ou l'export RGPD." }, "manifest": { "type": "object", "properties": { "schema_version": { "type": "string", "description": "Version du format de l'export RGPD." }, "scope_version": { "type": "string", "description": "Version du périmètre d'export RGPD." }, "requested_entity_slug": { "type": "string", "description": "Entité demandée lors de la génération de l'export." }, "requested_data_environment": { "type": "string", "description": "Environnement de données demandé lors de l'export." }, "data_scopes": { "type": "array", "items": { "type": "string" }, "description": "Périmètres de données examinés pour cet export." }, "generated_at": { "type": "string", "format": "date-time", "description": "Date de génération des recommandations." }, "complete": { "type": "boolean", "description": "Indique si toutes les sources requises de cet export ont été collectées; consulter les limitations même lorsque la valeur est true." }, "required_source_count": { "type": "integer", "description": "Nombre de sources requises pour compléter cet export." }, "completed_required_source_count": { "type": "integer", "description": "Nombre de sources requises collectées avec succès." }, "failed_required_sources": { "type": "array", "items": { "type": "string" }, "description": "Sources requises dont la collecte a échoué." }, "sources": { "type": "array", "items": { "type": "object", "properties": { "source": { "type": "string", "description": "Origine déclarée de l'événement ou du remboursement." }, "required": { "type": "boolean", "description": "Indique si cette source est requise pour compléter l'export." }, "status": { "type": "string", "description": "État de collecte ou de traitement de cette source de données personnelles." }, "record_count": { "type": "integer", "description": "Nombre d'enregistrements exportés depuis cette source." }, "page_count": { "type": "integer", "description": "Nombre de pages connu pour le document trouvé." }, "page_size": { "type": "integer", "description": "Taille de page utilisée pour collecter cette source." }, "data_scope": { "type": "string", "description": "Périmètre de données lu pour cette source." }, "coverage": { "type": "string", "description": "Étendue de la collecte déclarée pour cette source." }, "excluded_fields": { "type": "array", "items": { "type": "string" }, "description": "Champs volontairement exclus de cette projection d'export." }, "error_code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Code exploitable pour diagnostiquer un échec; consulter aussi error_message." }, "detected_record_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Nombre d'enregistrements détectés dans cette source." } }, "required": [ "source", "required", "status", "record_count", "page_count", "page_size", "data_scope", "coverage", "excluded_fields", "error_code", "detected_record_count" ] }, "description": "Sources des événements de risque inclus dans la synthèse." }, "limitations": { "type": "array", "items": { "type": "string" }, "description": "Limites et exclusions déclarées pour cet export." }, "manifest_sha256": { "type": "string", "description": "Empreinte SHA-256 du manifeste de collecte." }, "privacy_case_status": { "type": "string", "description": "État du dossier RGPD au moment de la génération." }, "final_status_after_delivery": { "type": "string", "description": "État attendu après livraison et finalisation de l'export." }, "case_finalization_pending": { "type": "boolean", "description": "Indique si la finalisation du dossier après livraison reste à effectuer." }, "certificate_reference": { "type": "null", "description": "Référence du certificat d'effacement, si elle existe; null ne constitue pas une preuve d'effacement." }, "temporary_download_url": { "type": "null", "description": "Lien temporaire de récupération, lorsqu'il est fourni; peut être null." } }, "required": [ "schema_version", "scope_version", "requested_entity_slug", "requested_data_environment", "data_scopes", "generated_at", "complete", "required_source_count", "completed_required_source_count", "failed_required_sources", "sources", "limitations", "manifest_sha256", "privacy_case_status", "final_status_after_delivery", "case_finalization_pending", "certificate_reference", "temporary_download_url" ], "description": "Manifeste de l'export: sources lues, indisponibles ou exclues. Le vérifier avant de considérer l'export comme complet." } }, "required": [ "schema_version", "scope_version", "personal_source_registry_version", "export_id", "export_date", "user_id", "data_environment", "profile", "preferences", "notifications", "audit_entries", "demo_state", "privacy_cases", "pappers_request_metadata", "entity_databases", "manifest" ] }, "DelegatedUserErasureRequest": { "properties": { "confirm": { "type": "boolean", "title": "Confirm", "default": false, "description": "Confirmation explicite exigée pour cette action; le scope seul ne remplace pas cette confirmation." } }, "type": "object", "title": "DelegatedUserErasureRequest" }, "DocumentAttachOperationRequest": { "properties": { "operation_id": { "type": "string", "format": "uuid", "title": "Operation Id", "description": "UUID MARKO de l'opération." } }, "type": "object", "required": [ "operation_id" ], "title": "DocumentAttachOperationRequest", "description": "Atomic orphan-to-operation attachment request." }, "DocumentStatus": { "type": "string", "enum": [ "uploaded", "ai_processing", "analyzed", "pending_review", "active", "ai_failed", "rejected", "archived" ], "title": "DocumentStatus", "description": "État du document dans le pipeline AI.\n\nSee PHASE1_DYNAMISATION.md §14.6.2 for the full state diagram.\nSLA: AI_PROCESSING < 60s, PENDING_REVIEW < 48h." }, "DocumentUpdate": { "properties": { "type": { "anyOf": [ { "type": "string", "maxLength": 100, "minLength": 1 }, { "type": "null" } ], "title": "Type", "description": "Catégorie métier du document, distincte de son type MIME; par exemple autre pour un document non spécialisé." }, "filename": { "anyOf": [ { "type": "string", "maxLength": 255 }, { "type": "null" } ], "title": "Filename", "description": "Nom du fichier." }, "state": { "anyOf": [ { "$ref": "#/components/schemas/DocumentStatus" }, { "type": "null" } ], "description": "État de traitement ou de validation du document." }, "reject_reason": { "anyOf": [ { "type": "string", "maxLength": 500 }, { "type": "null" } ], "title": "Reject Reason", "description": "Motif du rejet du document." } }, "additionalProperties": false, "type": "object", "title": "DocumentUpdate" }, "EntityAdminSettingsResponse": { "properties": { "id": { "type": "string", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "name": { "type": "string", "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "type": { "type": "string", "title": "Type", "description": "Type de l'entité MARKO." }, "siren": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Siren", "description": "SIREN français sur 9 chiffres; le service vérifie aussi le checksum lorsque la route le prévoit." }, "mode_reporting": { "type": "string", "title": "Mode Reporting", "description": "Mode de reporting configuré pour l'entité." }, "frequence_reporting": { "type": "integer", "title": "Frequence Reporting", "description": "Fréquence de reporting configurée pour l'entité." }, "date_reference_reporting": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date Reference Reporting", "description": "Date de référence utilisée par le reporting de l'entité." }, "risk_threshold": { "type": "integer", "title": "Risk Threshold", "default": 60, "description": "Seuil de risque configuré pour l'entité." }, "zone_vacances": { "type": "string", "title": "Zone Vacances", "default": "C", "description": "Zone de vacances configurée pour la planification de l'entité." }, "portfolio_goals": { "additionalProperties": true, "type": "object", "title": "Portfolio Goals", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, "report_external_neutrality": { "type": "boolean", "title": "Report External Neutrality", "default": true, "description": "Paramètre de neutralité du reporting externe de l'entité." }, "logo_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Logo Url", "description": "URL du logo de l'entité." }, "primary_color": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Primary Color", "description": "Couleur principale de la marque de l'entité." }, "secondary_color": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Secondary Color", "description": "Couleur secondaire de la marque de l'entité." }, "brand_baseline": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Brand Baseline", "description": "Texte de signature associé à la marque de l'entité." }, "email_brand_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Email Brand Name", "description": "Nom de marque utilisé dans les e-mails de l'entité." }, "email_from_address": { "anyOf": [ { "type": "string", "format": "email" }, { "type": "null" } ], "title": "Email From Address", "description": "Adresse d'expédition configurée pour les e-mails." }, "email_reply_to": { "anyOf": [ { "type": "string", "format": "email" }, { "type": "null" } ], "title": "Email Reply To", "description": "Adresse proposée pour répondre aux e-mails." }, "email_branding_mode": { "type": "string", "enum": [ "marko", "co_branded", "white_label" ], "title": "Email Branding Mode", "default": "marko", "description": "Mode de personnalisation des e-mails." }, "email_branding_version": { "type": "integer", "title": "Email Branding Version", "default": 1, "description": "Version de la configuration de marque des e-mails." }, "email_sending_domain_status": { "type": "string", "title": "Email Sending Domain Status", "default": "not_configured", "description": "État de validation du domaine d'expédition." }, "email_sending_domain": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Email Sending Domain", "description": "Domaine d'expédition configuré pour l'entité." }, "ai_enabled": { "type": "boolean", "title": "Ai Enabled", "default": true, "description": "Indique si les fonctions IA sont activées pour l'entité; les droits de la clé restent requis." }, "manual_creation_policy": { "$ref": "#/components/schemas/ManualCreationPolicy", "default": { "operation": true, "fond": true, "spv": true, "operateur": true, "follow_up": true }, "description": "Politique de création manuelle par famille de ressources." } }, "type": "object", "required": [ "id", "name", "type", "mode_reporting", "frequence_reporting", "portfolio_goals" ], "title": "EntityAdminSettingsResponse", "description": "Entity settings response." }, "EntityAdminSettingsUpdate": { "properties": { "mode_reporting": { "anyOf": [ { "$ref": "#/components/schemas/ReportingMode" }, { "type": "null" } ], "description": "Mode de reporting configuré pour l'entité." }, "frequence_reporting": { "anyOf": [ { "type": "integer", "maximum": 12.0, "minimum": 1.0 }, { "type": "null" } ], "title": "Frequence Reporting", "description": "Fréquence de reporting configurée pour l'entité." }, "portfolio_goals": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Portfolio Goals", "description": "Objectifs portefeuille configurés pour l'entité." }, "report_external_neutrality": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Report External Neutrality", "description": "Paramètre de neutralité du reporting externe de l'entité." }, "siren": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Siren", "description": "SIREN français sur 9 chiffres; le service vérifie aussi le checksum lorsque la route le prévoit." }, "date_reference_reporting": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date Reference Reporting", "description": "Date de référence utilisée par le reporting de l'entité." }, "risk_threshold": { "anyOf": [ { "type": "integer", "maximum": 100.0, "minimum": 0.0 }, { "type": "null" } ], "title": "Risk Threshold", "description": "Seuil de risque configuré pour l'entité." }, "zone_vacances": { "anyOf": [ { "type": "string", "enum": [ "A", "B", "C" ] }, { "type": "null" } ], "title": "Zone Vacances", "description": "Zone de vacances configurée pour la planification de l'entité." }, "logo_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Logo Url", "description": "URL du logo de l'entité." }, "primary_color": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Primary Color", "description": "Couleur principale de la marque de l'entité." }, "secondary_color": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Secondary Color", "description": "Couleur secondaire de la marque de l'entité." }, "brand_baseline": { "anyOf": [ { "type": "string", "maxLength": 255 }, { "type": "null" } ], "title": "Brand Baseline", "description": "Texte de signature associé à la marque de l'entité." }, "email_brand_name": { "anyOf": [ { "type": "string", "maxLength": 255 }, { "type": "null" } ], "title": "Email Brand Name", "description": "Nom de marque utilisé dans les e-mails de l'entité." }, "email_from_address": { "anyOf": [ { "type": "string", "maxLength": 255, "format": "email" }, { "type": "null" } ], "title": "Email From Address", "description": "Adresse d'expédition configurée pour les e-mails." }, "email_reply_to": { "anyOf": [ { "type": "string", "maxLength": 255, "format": "email" }, { "type": "null" } ], "title": "Email Reply To", "description": "Adresse proposée pour répondre aux e-mails." }, "email_branding_mode": { "anyOf": [ { "type": "string", "enum": [ "marko", "co_branded", "white_label" ] }, { "type": "null" } ], "title": "Email Branding Mode", "description": "Mode de personnalisation des e-mails." } }, "type": "object", "title": "EntityAdminSettingsUpdate", "description": "Update entity settings (reporting mode, frequency, goals, etc.)." }, "EntityAdminUserCreate": { "properties": { "email": { "type": "string", "format": "email", "title": "Email", "description": "Adresse e-mail du compte utilisateur." }, "name": { "type": "string", "maxLength": 255, "minLength": 1, "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "role": { "type": "string", "enum": [ "entity_admin", "client", "entity_tech", "viewer" ], "title": "Role", "default": "client", "description": "Rôle du compte utilisateur dans l'entité." } }, "type": "object", "required": [ "email", "name" ], "title": "EntityAdminUserCreate", "description": "Create/invite a user into the entity." }, "EntityAdminUserListResponse": { "properties": { "items": { "items": { "$ref": "#/components/schemas/EntityAdminUserResponse" }, "type": "array", "title": "Items", "description": "Résultats de la page courante." }, "total": { "type": "integer", "title": "Total", "description": "Nombre total de résultats correspondant aux filtres." } }, "type": "object", "required": [ "items", "total" ], "title": "EntityAdminUserListResponse", "description": "Paginated user list for entity admin." }, "EntityAdminUserResponse": { "properties": { "id": { "type": "string", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "email": { "type": "string", "title": "Email", "description": "Adresse e-mail du compte utilisateur." }, "name": { "type": "string", "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "first_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "First Name", "description": "Prénom de l'utilisateur." }, "last_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Last Name", "description": "Nom de famille de l'utilisateur." }, "image": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Image", "description": "Image de profil de l'utilisateur, si elle est renseignée." }, "role": { "type": "string", "title": "Role", "default": "client", "description": "Rôle du compte utilisateur dans l'entité." }, "status": { "type": "string", "title": "Status", "default": "pending", "description": "État du compte utilisateur ou du retrait d'accès; distinct du rôle dans l'entité." }, "entity_slug": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Entity Slug", "description": "Entité à laquelle l'intégration est rattachée." }, "email_verified": { "type": "boolean", "title": "Email Verified", "default": false, "description": "Indique si l'adresse e-mail du compte a été vérifiée." }, "approved_by": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Approved By", "description": "Identifiant de l'utilisateur qui a approuvé ce compte." }, "invitation_expires_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Invitation Expires At", "description": "Date d'expiration de l'invitation du compte." }, "invitation_delivery": { "anyOf": [ { "$ref": "#/components/schemas/InvitationDeliveryResponse" }, { "type": "null" } ], "description": "Résultat de l'envoi de l'invitation; la création du compte ne garantit pas la livraison de l'e-mail." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "title": "Updated At", "description": "Date de dernière modification au format ISO 8601." }, "is_pending_invite": { "type": "boolean", "title": "Is Pending Invite", "readOnly": true, "description": "Indique si l'utilisateur doit encore activer son invitation." } }, "type": "object", "required": [ "id", "email", "name", "created_at", "updated_at", "is_pending_invite" ], "title": "EntityAdminUserResponse", "description": "User representation for entity admin endpoints." }, "EntityAdminUserUpdate": { "properties": { "role": { "type": "string", "enum": [ "entity_admin", "client", "entity_tech", "viewer" ], "title": "Role", "description": "Rôle du compte utilisateur dans l'entité." } }, "type": "object", "required": [ "role" ], "title": "EntityAdminUserUpdate", "description": "Update a user's role within the entity." }, "EntityTaxonomyOptionListResponse": { "properties": { "items": { "items": { "$ref": "#/components/schemas/EntityTaxonomyOptionResponse" }, "type": "array", "title": "Items", "description": "Résultats de la page courante." } }, "type": "object", "required": [ "items" ], "title": "EntityTaxonomyOptionListResponse" }, "EntityTaxonomyOptionResponse": { "properties": { "parent_code": { "anyOf": [ { "type": "string", "enum": [ "due_diligence", "en_cours", "en_recouvrement", "termine" ] }, { "type": "null" } ], "title": "Parent Code", "description": "Code de l'option parente dans la taxonomie, lorsqu'elle existe." }, "code": { "type": "string", "title": "Code", "description": "Code stable de la ressource ou de l'option. Conserver la valeur retournée par MARKO." }, "dimension": { "type": "string", "enum": [ "operation_status", "investment_type", "operation_type", "asset_class", "internal_status", "operational_status", "follow_up_category" ], "title": "Dimension", "description": "Dimension de taxonomie à laquelle cette option appartient." }, "display_label": { "type": "string", "title": "Display Label", "description": "Libellé de l'option à afficher; utiliser code comme identifiant stable." }, "source_kind": { "type": "string", "enum": [ "marko", "partner", "entity" ], "title": "Source Kind", "description": "Nature de l'origine de l'option: catalogue MARKO ou source propre à l'entité." }, "source_display_name": { "type": "string", "title": "Source Display Name", "description": "Nom lisible de l'origine de l'option de taxonomie." }, "is_visible": { "type": "boolean", "title": "Is Visible", "description": "Indique si l'option est visible dans le catalogue de l'entité." }, "is_active": { "type": "boolean", "title": "Is Active", "description": "Indique si l'élément est actif." }, "position": { "type": "integer", "title": "Position", "description": "Position de l'élément dans sa liste." }, "usage_count": { "type": "integer", "title": "Usage Count", "default": 0, "description": "Nombre d'utilisations de cette option de taxonomie." }, "label_editable": { "type": "boolean", "title": "Label Editable", "description": "Indique si le libellé de l'option peut être modifié dans MARKO." }, "canonical_code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Canonical Code", "description": "Code MARKO canonique associé à cette option, lorsqu'il existe." }, "icon_key": { "anyOf": [ { "type": "string", "enum": [ "tag", "briefcase", "building", "landmark", "home", "map", "layers", "shield", "trending-up", "calendar", "circle-check", "triangle-alert" ] }, { "type": "null" } ], "title": "Icon Key", "description": "Clé de l'icône associée à l'option de taxonomie." } }, "type": "object", "required": [ "code", "dimension", "display_label", "source_kind", "source_display_name", "is_visible", "is_active", "position", "label_editable" ], "title": "EntityTaxonomyOptionResponse" }, "ExternalAPIBearerTokenExchangeRequest": { "properties": { "key_id": { "type": "string", "maxLength": 24, "minLength": 4, "pattern": "^[a-z0-9]+$", "title": "Key Id", "description": "Identifiant public de la clé; utiliser la valeur réelle fournie par l'administrateur." }, "timestamp": { "type": "integer", "minimum": 0.0, "title": "Timestamp", "description": "Heure Unix en secondes de l'échange signé." }, "nonce": { "type": "string", "maxLength": 128, "minLength": 16, "pattern": "^[A-Za-z0-9_-]+$", "title": "Nonce", "description": "Valeur aléatoire unique pour cet échange; ne jamais réutiliser un nonce avec la même clé." }, "signature": { "type": "string", "maxLength": 64, "minLength": 64, "pattern": "^[A-Fa-f0-9]{64}$", "title": "Signature", "description": "HMAC-SHA256 hexadécimal du message canonique à quatre lignes; voir Authentification." } }, "type": "object", "required": [ "key_id", "timestamp", "nonce", "signature" ], "title": "ExternalAPIBearerTokenExchangeRequest" }, "ExternalAPIBearerTokenResponse": { "properties": { "access_token": { "type": "string", "title": "Access Token", "description": "Bearer de courte durée à utiliser dans Authorization." }, "token_type": { "type": "string", "title": "Token Type", "default": "Bearer", "description": "Type de jeton retourné: Bearer." }, "expires_in": { "type": "integer", "minimum": 1.0, "title": "Expires In", "description": "Durée du bearer en secondes; utilisez la valeur retournée plutôt qu'une durée fixe." }, "issued_at": { "type": "string", "format": "date-time", "title": "Issued At", "description": "Date d'émission du bearer." }, "expires_at": { "type": "string", "format": "date-time", "title": "Expires At", "description": "Date d'expiration du bearer." }, "key_id": { "type": "string", "title": "Key Id", "description": "Identifiant public de la clé; utiliser la valeur réelle fournie par l'administrateur." }, "environment": { "type": "string", "title": "Environment", "description": "Environnement de données associé à la clé; distinct de l'hôte d'infrastructure." }, "entity_slug": { "type": "string", "title": "Entity Slug", "description": "Entité à laquelle l'intégration est rattachée." } }, "type": "object", "required": [ "access_token", "expires_in", "issued_at", "expires_at", "key_id", "environment", "entity_slug" ], "title": "ExternalAPIBearerTokenResponse" }, "ExternalDocumentCreateRequest": { "properties": { "operation_external_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Operation External Id", "description": "Identifiant externe de l'opération, appartenant à la même intégration." }, "operation_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operation Id", "description": "UUID MARKO de l'opération." }, "type": { "type": "string", "maxLength": 100, "minLength": 1, "title": "Type", "description": "Catégorie métier du document, distincte de son type MIME; par exemple autre pour un document non spécialisé." }, "filename": { "anyOf": [ { "type": "string", "maxLength": 255 }, { "type": "null" } ], "title": "Filename", "description": "Nom du fichier." }, "partner_metadata": { "additionalProperties": true, "type": "object", "title": "Partner Metadata", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." } }, "type": "object", "required": [ "type" ], "title": "ExternalDocumentCreateRequest", "anyOf": [ { "required": [ "operation_id" ], "properties": { "operation_id": { "type": "string", "format": "uuid", "description": "UUID MARKO de l'opération." } } }, { "required": [ "operation_external_id" ], "properties": { "operation_external_id": { "type": "string", "minLength": 1, "description": "Identifiant externe de l'opération, appartenant à la même intégration." } } } ], "description": "Une opération est requise: fournir operation_id ou operation_external_id. Lorsque les deux sont fournis, operation_id est utilisé. Pour un upload de fichier, appeler directement /upload avec un nouvel external_id; une déclaration metadata préalable peut être renvoyée sans ajout de fichier." }, "ExternalDocumentResponse": { "properties": { "external_id": { "type": "string", "title": "External Id", "description": "Identifiant stable de votre système, dans le contexte de votre intégration." }, "document_id": { "type": "string", "format": "uuid", "title": "Document Id", "description": "UUID MARKO du document." }, "created": { "type": "boolean", "title": "Created", "description": "Indique si une nouvelle fiche documentaire a été créée par cet appel." }, "document": { "$ref": "#/components/schemas/PublicDocumentItem", "description": "Fiche du document associée à l'identifiant externe." } }, "type": "object", "required": [ "external_id", "document_id", "created", "document" ], "title": "ExternalDocumentResponse" }, "ExternalImportAcceptedResponse": { "properties": { "job_id": { "type": "string", "format": "uuid", "title": "Job Id", "description": "UUID du job durable à suivre." }, "status": { "type": "string", "title": "Status", "description": "État du job d'import: accepted, queued, running, partial, completed, failed ou cancelled. Lire les compteurs et les résultats individuels avant de considérer l'ensemble du lot comme réussi." }, "status_url": { "type": "string", "title": "Status Url", "description": "Chemin permettant de lire l'état du job; peut être relatif à l'hôte de l'API." }, "results_url": { "type": "string", "title": "Results Url", "description": "Chemin permettant de lire les résultats individuels du job; peut être relatif à l'hôte de l'API." }, "received_counts": { "additionalProperties": { "type": "integer" }, "type": "object", "title": "Received Counts", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, "idempotency_key": { "type": "string", "title": "Idempotency Key", "description": "Clé utilisée pour cette intention; la conserver avec le job ou la ressource." }, "replayed": { "type": "boolean", "title": "Replayed", "default": false, "description": "Indique qu'une réponse liée à la même intention a été retrouvée et rejouée." } }, "type": "object", "required": [ "job_id", "status", "status_url", "results_url", "received_counts", "idempotency_key" ], "title": "ExternalImportAcceptedResponse" }, "ExternalImportItemResponse": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "item_kind": { "type": "string", "title": "Item Kind", "description": "Nature de l'élément importé: opération ou note de suivi." }, "position": { "type": "integer", "title": "Position", "description": "Position de l'élément dans le lot d'origine." }, "external_id": { "type": "string", "title": "External Id", "description": "Identifiant stable de votre système, dans le contexte de votre intégration." }, "parent_external_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Parent External Id", "description": "Identifiant externe de l'opération parente d'une note importée." }, "status": { "type": "string", "title": "Status", "description": "État de cet élément du lot: pending, running, completed, noop, failed ou conflict. target_id et les champs d'erreur précisent le résultat individuel." }, "target_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Target Id", "description": "Identifiant de la ressource MARKO créée ou retrouvée par cet élément d'import." }, "attempts": { "type": "integer", "title": "Attempts", "description": "Nombre de tentatives de traitement de cet élément d'import." }, "result": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Result", "description": "Résultat public de l'exécution; structure variable selon le preset ou le type de job." }, "error_code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Error Code", "description": "Code exploitable pour diagnostiquer un échec; consulter aussi error_message." }, "error_message": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Error Message", "description": "Détail de l'échec, lorsqu'il est disponible." }, "conflict_payload": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Conflict Payload", "description": "Informations sur les valeurs en conflit; comparer la cible actuelle avant une reprise." }, "resolved_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Resolved At", "description": "Date de résolution de l'événement, du commentaire ou du conflit." } }, "type": "object", "required": [ "id", "item_kind", "position", "external_id", "status", "attempts" ], "title": "ExternalImportItemResponse" }, "ExternalImportItemsResponse": { "properties": { "items": { "items": { "$ref": "#/components/schemas/ExternalImportItemResponse" }, "type": "array", "title": "Items", "description": "Résultats de la page courante." }, "total": { "type": "integer", "title": "Total", "description": "Nombre total de résultats correspondant aux filtres." }, "limit": { "type": "integer", "title": "Limit", "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, "offset": { "type": "integer", "title": "Offset", "description": "Nombre de résultats à ignorer avant cette page (commence à 0)." } }, "type": "object", "required": [ "items", "total", "limit", "offset" ], "title": "ExternalImportItemsResponse" }, "ExternalImportJobResponse": { "properties": { "job_id": { "type": "string", "format": "uuid", "title": "Job Id", "description": "UUID du job durable à suivre." }, "status": { "type": "string", "title": "Status", "description": "État du job d'import: accepted, queued, running, partial, completed, failed ou cancelled. Lire les compteurs et les résultats individuels avant de considérer l'ensemble du lot comme réussi." }, "total_operations": { "type": "integer", "title": "Total Operations", "description": "Nombre d'opérations du lot ou de la synthèse portefeuille." }, "total_notes": { "type": "integer", "title": "Total Notes", "description": "Nombre de notes reçues dans le lot d'import." }, "processed_items": { "type": "integer", "title": "Processed Items", "description": "Nombre d'éléments du lot qui ont reçu un résultat de traitement." }, "completed_items": { "type": "integer", "title": "Completed Items", "description": "Nombre d'éléments d'import traités avec une mutation réussie." }, "noop_items": { "type": "integer", "title": "Noop Items", "description": "Nombre d'éléments traités sans changement de la ressource." }, "failed_items": { "type": "integer", "title": "Failed Items", "description": "Nombre d'éléments d'import en échec." }, "conflict_items": { "type": "integer", "title": "Conflict Items", "description": "Nombre d'éléments d'import arrêtés par un conflit à résoudre." }, "cancel_requested": { "type": "boolean", "title": "Cancel Requested", "description": "Indique qu'une annulation du job a été demandée; les éléments déjà terminés sont conservés." }, "accepted_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Accepted At", "description": "Date d'acceptation de la demande ou de la recommandation." }, "started_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Started At", "description": "Date de début du traitement." }, "completed_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Completed At", "description": "Date de fin, lorsqu'une exécution ou un traitement est terminé." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "title": "Updated At", "description": "Date de dernière modification au format ISO 8601." }, "results_url": { "type": "string", "title": "Results Url", "description": "Chemin permettant de lire les résultats individuels du job; peut être relatif à l'hôte de l'API." }, "operation_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operation Id", "description": "UUID MARKO de l'opération." }, "error_code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Error Code", "description": "Code exploitable pour diagnostiquer un échec; consulter aussi error_message." }, "error_message": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Error Message", "description": "Détail de l'échec, lorsqu'il est disponible." } }, "type": "object", "required": [ "job_id", "status", "total_operations", "total_notes", "processed_items", "completed_items", "noop_items", "failed_items", "conflict_items", "cancel_requested", "created_at", "updated_at", "results_url" ], "title": "ExternalImportJobResponse" }, "ExternalKpiSnapshotInput": { "properties": { "date_reference": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date Reference", "description": "Date à laquelle les valeurs du snapshot KPI se rapportent." }, "crd_total": { "anyOf": [ { "type": "number" }, { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Crd Total", "description": "Capital restant dû total à la date de référence." }, "crd_total_source": { "anyOf": [ { "type": "string", "maxLength": 32 }, { "type": "null" } ], "title": "Crd Total Source", "description": "Origine du capital restant dû: financing_tranches ou operation_data." }, "crd_senior": { "anyOf": [ { "type": "number" }, { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Crd Senior", "description": "Capital restant dû sur les tranches senior." }, "crd_mezzanine": { "anyOf": [ { "type": "number" }, { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Crd Mezzanine", "description": "Capital restant dû sur les tranches mezzanine." }, "valeur_venale": { "anyOf": [ { "type": "number" }, { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Valeur Venale", "description": "Valeur de marché de l'actif utilisée pour calculer la LTV." }, "noi": { "anyOf": [ { "type": "number" }, { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Noi", "description": "Net Operating Income: revenu opérationnel net utilisé pour les ratios financiers." }, "service_dette": { "anyOf": [ { "type": "number" }, { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Service Dette", "description": "Service de la dette utilisé pour le calcul du DSCR; aligner sa période avec celle du NOI." }, "ltv": { "anyOf": [ { "type": "number" }, { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Ltv", "description": "Loan-to-Value en fraction: 0.65 signifie 65 %. La valeur persistée est comprise entre 0 et 2." }, "dscr": { "anyOf": [ { "type": "number" }, { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Dscr", "description": "Ratio de couverture du service de la dette, exprimé comme un multiple: 1.25 signifie une couverture de 1,25 fois." }, "icr": { "anyOf": [ { "type": "number" }, { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Icr", "description": "Ratio de couverture des intérêts, exprimé comme un multiple." }, "ltc": { "anyOf": [ { "type": "number" }, { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Ltc", "description": "Loan-to-Cost en fraction: 0.65 signifie 65 %. La valeur persistée est comprise entre 0 et 2." }, "debt_yield": { "anyOf": [ { "type": "number" }, { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Debt Yield", "description": "Rendement de la dette, exprimé en fraction: 0.08 signifie 8 %." }, "risk_score_simple": { "anyOf": [ { "type": "number" }, { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Risk Score Simple", "description": "Score de risque de l'opération, en points de 0 à 100." }, "pct_perte_estimee": { "anyOf": [ { "type": "number" }, { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Pct Perte Estimee", "description": "Perte estimée en fraction comprise entre 0 et 1: 0.03 signifie 3 %." } }, "type": "object", "title": "ExternalKpiSnapshotInput" }, "ExternalNoteImport": { "properties": { "date": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "string", "format": "date" } ], "description": "Date métier avec fuseau horaire, ou date YYYY-MM-DD normalisée à minuit UTC." }, "text": { "anyOf": [ { "type": "string", "maxLength": 10000, "minLength": 1 }, { "type": "null" } ], "title": "Text", "description": "Texte de la note ou du commentaire." }, "category": { "type": "string", "maxLength": 80, "minLength": 1, "title": "Category", "default": "libre", "description": "Catégorie de la note; les règles exactes dépendent de la route. Pour l'import externe: chaîne de 1 à 80 caractères, libre par défaut." }, "description_i18n": { "anyOf": [ { "type": "object", "maxProperties": 20, "additionalProperties": { "type": "string", "minLength": 1, "maxLength": 10000 }, "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "description": "Au plus 20 locales et 100 000 caractères au total. Locales normalisées en minuscules avec tirets, max 35 caractères; aucune collision après normalisation. Les textes vides sont refusés." }, "source_created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Source Created At", "description": "Date de création dans le système source, avec fuseau horaire." }, "source_updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Source Updated At", "description": "Date de dernière mise à jour dans le système source, avec fuseau horaire. Pour une note déjà versionnée, un changement exige une date strictement plus récente." }, "existing_marko_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Existing Marko Id", "description": "UUID d'une ressource MARKO existante à associer lors du premier upsert externe; la cible doit être accessible et compatible." }, "external_id": { "type": "string", "maxLength": 255, "minLength": 1, "pattern": "^[A-Za-z0-9_~-][A-Za-z0-9._:~-]{0,254}$", "title": "External Id", "description": "Identifiant stable de votre système, dans le contexte de votre intégration." } }, "additionalProperties": false, "type": "object", "required": [ "date", "external_id" ], "title": "ExternalNoteImport", "description": "Note historique. text ou description_i18n non vide est requis. Dates source avec fuseau horaire; source_updated_at ne peut pas précéder source_created_at. Voir Imports et notes pour les règles de traduction et de version.", "anyOf": [ { "required": [ "text" ], "properties": { "text": { "type": "string", "minLength": 1, "description": "Texte de la note ou du commentaire." } } }, { "required": [ "description_i18n" ], "properties": { "description_i18n": { "type": "object", "minProperties": 1, "description": "Textes par locale normalisée (fr, en, fr-fr…); contraintes complémentaires dans le guide Imports et notes." } } } ] }, "ExternalNoteResourceResponse": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "operation_id": { "type": "string", "format": "uuid", "title": "Operation Id", "description": "UUID MARKO de l'opération." }, "date": { "type": "string", "format": "date-time", "title": "Date", "description": "Date métier; le type et le format ci-dessous font autorité pour cette route." }, "text": { "type": "string", "title": "Text", "description": "Texte de la note ou du commentaire." }, "category": { "type": "string", "title": "Category", "description": "Catégorie de la note; les règles exactes dépendent de la route. Pour l'import externe: chaîne de 1 à 80 caractères, libre par défaut." }, "description_i18n": { "additionalProperties": { "type": "string" }, "type": "object", "title": "Description I18N", "description": "Textes par locale normalisée (fr, en, fr-fr…); contraintes complémentaires dans le guide Imports et notes." }, "source_created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Source Created At", "description": "Date de création dans le système source, avec fuseau horaire." }, "source_updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Source Updated At", "description": "Date de dernière mise à jour dans le système source, avec fuseau horaire. Pour une note déjà versionnée, un changement exige une date strictement plus récente." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "title": "Updated At", "description": "Date de dernière modification au format ISO 8601." } }, "type": "object", "required": [ "id", "operation_id", "date", "text", "category", "created_at", "updated_at" ], "title": "ExternalNoteResourceResponse" }, "ExternalNoteSyncUpsertResponse": { "properties": { "external_id": { "type": "string", "title": "External Id", "description": "Identifiant stable de votre système, dans le contexte de votre intégration." }, "marko_id": { "type": "string", "format": "uuid", "title": "Marko Id", "description": "Identifiant MARKO résolu ou créé; conservez-le pour les appels ultérieurs." }, "outcome": { "type": "string", "enum": [ "created", "updated", "noop", "restored", "bound" ], "title": "Outcome", "description": "Résultat de la synchronisation: created, updated, noop, restored ou bound. Conserver marko_id quel que soit ce résultat." }, "resource": { "$ref": "#/components/schemas/ExternalNoteResourceResponse", "description": "État de la ressource MARKO après la synchronisation externe." }, "taxonomy_additions": { "items": { "$ref": "#/components/schemas/EntityTaxonomyOptionResponse" }, "type": "array", "title": "Taxonomy Additions", "description": "Options de taxonomie créées par cet upsert. Conservez les codes retournés; le suffixe custom__ n'est pas prévisible." }, "request_id": { "type": "string", "title": "Request Id", "description": "Identifiant de corrélation pour le diagnostic de la requête." } }, "type": "object", "required": [ "external_id", "marko_id", "outcome", "resource", "request_id" ], "title": "ExternalNoteSyncUpsertResponse" }, "ExternalNoteUpsertRequest": { "properties": { "date": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "string", "format": "date" } ], "description": "Date métier avec fuseau horaire, ou date YYYY-MM-DD normalisée à minuit UTC." }, "text": { "anyOf": [ { "type": "string", "maxLength": 10000, "minLength": 1 }, { "type": "null" } ], "title": "Text", "description": "Texte de la note ou du commentaire." }, "category": { "type": "string", "maxLength": 80, "minLength": 1, "title": "Category", "default": "libre", "description": "Catégorie de la note; les règles exactes dépendent de la route. Pour l'import externe: chaîne de 1 à 80 caractères, libre par défaut." }, "description_i18n": { "anyOf": [ { "type": "object", "maxProperties": 20, "additionalProperties": { "type": "string", "minLength": 1, "maxLength": 10000 }, "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "description": "Au plus 20 locales et 100 000 caractères au total. Locales normalisées en minuscules avec tirets, max 35 caractères; aucune collision après normalisation. Les textes vides sont refusés." }, "source_created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Source Created At", "description": "Date de création dans le système source, avec fuseau horaire." }, "source_updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Source Updated At", "description": "Date de dernière mise à jour dans le système source, avec fuseau horaire. Pour une note déjà versionnée, un changement exige une date strictement plus récente." }, "existing_marko_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Existing Marko Id", "description": "UUID d'une ressource MARKO existante à associer lors du premier upsert externe; la cible doit être accessible et compatible." } }, "additionalProperties": false, "type": "object", "required": [ "date" ], "title": "ExternalNoteUpsertRequest", "description": "Note historique. text ou description_i18n non vide est requis. Dates source avec fuseau horaire; source_updated_at ne peut pas précéder source_created_at. Voir Imports et notes pour les règles de traduction et de version.", "anyOf": [ { "required": [ "text" ], "properties": { "text": { "type": "string", "minLength": 1, "description": "Texte de la note ou du commentaire." } } }, { "required": [ "description_i18n" ], "properties": { "description_i18n": { "type": "object", "minProperties": 1, "description": "Textes par locale normalisée (fr, en, fr-fr…); contraintes complémentaires dans le guide Imports et notes." } } } ] }, "ExternalOperateurSyncUpsertResponse": { "properties": { "external_id": { "type": "string", "title": "External Id", "description": "Identifiant stable de votre système, dans le contexte de votre intégration." }, "marko_id": { "type": "string", "format": "uuid", "title": "Marko Id", "description": "Identifiant MARKO résolu ou créé; conservez-le pour les appels ultérieurs." }, "outcome": { "type": "string", "enum": [ "created", "updated", "noop", "restored", "bound" ], "title": "Outcome", "description": "Résultat de la synchronisation: created, updated, noop, restored ou bound. Conserver marko_id quel que soit ce résultat." }, "resource": { "$ref": "#/components/schemas/OperateurResponse", "description": "État de la ressource MARKO après la synchronisation externe." }, "taxonomy_additions": { "items": { "$ref": "#/components/schemas/EntityTaxonomyOptionResponse" }, "type": "array", "title": "Taxonomy Additions", "description": "Options de taxonomie créées par cet upsert. Conservez les codes retournés; le suffixe custom__ n'est pas prévisible." }, "request_id": { "type": "string", "title": "Request Id", "description": "Identifiant de corrélation pour le diagnostic de la requête." } }, "type": "object", "required": [ "external_id", "marko_id", "outcome", "resource", "request_id" ], "title": "ExternalOperateurSyncUpsertResponse" }, "ExternalOperateurUpsertRequest": { "properties": { "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "siren": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Siren", "description": "SIREN français sur 9 chiffres; le service vérifie aussi le checksum lorsque la route le prévoit." }, "type": { "anyOf": [ { "$ref": "#/components/schemas/OperateurType" }, { "type": "null" } ], "description": "Type métier de l'opérateur." }, "data": { "additionalProperties": true, "type": "object", "title": "Data", "description": "Données métier de l'opération. Consultez GET /field-definitions pour les clés, types et unités disponibles; ne déduisez pas les unités des noms." }, "existing_marko_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Existing Marko Id", "description": "UUID d'une ressource MARKO existante à associer lors du premier upsert externe; la cible doit être accessible et compatible." } }, "additionalProperties": false, "type": "object", "title": "ExternalOperateurUpsertRequest" }, "ExternalOperationBatchItem": { "properties": { "spv_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Spv Id", "description": "UUID MARKO de la SPV." }, "lead_operateur_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Lead Operateur Id", "description": "UUID MARKO de l'opérateur principal de l'opération." }, "existing_marko_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Existing Marko Id", "description": "UUID d'une ressource MARKO existante à associer lors du premier upsert externe; la cible doit être accessible et compatible." }, "name": { "type": "string", "maxLength": 255, "minLength": 1, "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "status": { "anyOf": [ { "type": "string", "maxLength": 255, "minLength": 1 }, { "type": "null" } ], "title": "Status", "description": "Statut métier de l'opération. Pour une écriture externe, consulter la dimension operation_status de GET /taxonomies." }, "type_investissement": { "anyOf": [ { "type": "string", "maxLength": 255, "minLength": 1 }, { "type": "null" } ], "title": "Type Investissement", "description": "Code de type d'investissement; consulter la dimension investment_type de GET /taxonomies." }, "type_operation": { "anyOf": [ { "type": "string", "maxLength": 255, "minLength": 1 }, { "type": "null" } ], "title": "Type Operation", "description": "Code de type d'opération; consulter la dimension operation_type de GET /taxonomies." }, "classe_actif": { "anyOf": [ { "type": "string", "maxLength": 255, "minLength": 1 }, { "type": "null" } ], "title": "Classe Actif", "description": "Classe d'actif de l'opération. Pour une écriture externe, consulter la dimension asset_class de GET /taxonomies." }, "statut_interne": { "anyOf": [ { "type": "string", "maxLength": 255, "minLength": 1 }, { "type": "null" } ], "title": "Statut Interne", "description": "Code de statut interne de l'opération; consulter la dimension internal_status de GET /taxonomies." }, "statut_operationnel": { "anyOf": [ { "items": { "type": "string", "maxLength": 255, "minLength": 1 }, "type": "array", "maxItems": 100 }, { "type": "null" } ], "title": "Statut Operationnel", "description": "Codes de statuts opérationnels de l'opération; consulter la dimension operational_status de GET /taxonomies." }, "sous_classe_actif": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Sous Classe Actif", "description": "Sous-classe d'actif de l'opération." }, "data": { "additionalProperties": true, "type": "object", "title": "Data", "description": "Données métier de l'opération. Consultez GET /field-definitions pour les clés, types et unités disponibles; ne déduisez pas les unités des noms." }, "kpi_snapshot": { "anyOf": [ { "$ref": "#/components/schemas/ExternalKpiSnapshotInput" }, { "type": "null" } ], "description": "Indicateurs financiers à la date de référence; utiliser les unités définies dans le guide Pagination et données." }, "external_id": { "type": "string", "maxLength": 255, "minLength": 1, "pattern": "^[A-Za-z0-9_~-][A-Za-z0-9._:~-]{0,254}$", "title": "External Id", "description": "Identifiant stable de votre système, dans le contexte de votre intégration." }, "notes": { "items": { "$ref": "#/components/schemas/ExternalNoteImport" }, "type": "array", "maxItems": 10000, "title": "Notes", "description": "Notes historiques de l'opération. Le lot complet accepte au maximum 10 000 notes." } }, "additionalProperties": false, "type": "object", "required": [ "name", "external_id" ], "title": "ExternalOperationBatchItem" }, "ExternalOperationBatchRequest": { "properties": { "operations": { "items": { "$ref": "#/components/schemas/ExternalOperationBatchItem" }, "type": "array", "maxItems": 500, "minItems": 1, "title": "Operations", "description": "Opérations à importer; entre 1 et 500 par lot, enveloppe normalisée limitée à 20 Mio." } }, "additionalProperties": false, "type": "object", "required": [ "operations" ], "title": "ExternalOperationBatchRequest" }, "ExternalOperationResourceResponse": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "spv_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Spv Id", "description": "UUID MARKO de la SPV." }, "lead_operateur_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Lead Operateur Id", "description": "UUID MARKO de l'opérateur principal de l'opération." }, "name": { "type": "string", "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "status": { "type": "string", "title": "Status", "description": "Statut métier de l'opération. Pour une écriture externe, consulter la dimension operation_status de GET /taxonomies." }, "type_investissement": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Type Investissement", "description": "Code de type d'investissement; consulter la dimension investment_type de GET /taxonomies." }, "type_operation": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Type Operation", "description": "Code de type d'opération; consulter la dimension operation_type de GET /taxonomies." }, "classe_actif": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Classe Actif", "description": "Classe d'actif de l'opération. Pour une écriture externe, consulter la dimension asset_class de GET /taxonomies." }, "statut_interne": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Statut Interne", "description": "Code de statut interne de l'opération; consulter la dimension internal_status de GET /taxonomies." }, "statut_operationnel": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Statut Operationnel", "description": "Codes de statuts opérationnels de l'opération; consulter la dimension operational_status de GET /taxonomies." }, "sous_classe_actif": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Sous Classe Actif", "description": "Sous-classe d'actif de l'opération." }, "data": { "additionalProperties": true, "type": "object", "title": "Data", "description": "Données métier de l'opération. Consultez GET /field-definitions pour les clés, types et unités disponibles; ne déduisez pas les unités des noms." }, "kpi_snapshot": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Kpi Snapshot", "description": "Indicateurs financiers à la date de référence; utiliser les unités définies dans le guide Pagination et données." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "title": "Updated At", "description": "Date de dernière modification au format ISO 8601." } }, "type": "object", "required": [ "id", "name", "status", "created_at", "updated_at" ], "title": "ExternalOperationResourceResponse" }, "ExternalOperationSyncUpsertResponse": { "properties": { "external_id": { "type": "string", "title": "External Id", "description": "Identifiant stable de votre système, dans le contexte de votre intégration." }, "marko_id": { "type": "string", "format": "uuid", "title": "Marko Id", "description": "Identifiant MARKO résolu ou créé; conservez-le pour les appels ultérieurs." }, "outcome": { "type": "string", "enum": [ "created", "updated", "noop", "restored", "bound" ], "title": "Outcome", "description": "Résultat de la synchronisation: created, updated, noop, restored ou bound. Conserver marko_id quel que soit ce résultat." }, "resource": { "$ref": "#/components/schemas/ExternalOperationResourceResponse", "description": "État de la ressource MARKO après la synchronisation externe." }, "taxonomy_additions": { "items": { "$ref": "#/components/schemas/EntityTaxonomyOptionResponse" }, "type": "array", "title": "Taxonomy Additions", "description": "Options de taxonomie créées par cet upsert. Conservez les codes retournés; le suffixe custom__ n'est pas prévisible." }, "request_id": { "type": "string", "title": "Request Id", "description": "Identifiant de corrélation pour le diagnostic de la requête." } }, "type": "object", "required": [ "external_id", "marko_id", "outcome", "resource", "request_id" ], "title": "ExternalOperationSyncUpsertResponse" }, "ExternalOperationTaxonomyOption": { "properties": { "code": { "type": "string", "title": "Code", "description": "Code stable de la ressource ou de l'option. Conserver la valeur retournée par MARKO." }, "label": { "type": "string", "title": "Label", "description": "Libellé à afficher pour cette option, ce groupe ou ce preset." } }, "type": "object", "required": [ "code", "label" ], "title": "ExternalOperationTaxonomyOption" }, "ExternalOperationTaxonomyResponse": { "properties": { "default_status": { "$ref": "#/components/schemas/OperationStatus", "description": "Statut canonique proposé par défaut pour une opération." }, "statuses": { "items": { "$ref": "#/components/schemas/ExternalOperationTaxonomyOption" }, "type": "array", "title": "Statuses", "description": "Statuts du socle canonique historique; GET /taxonomies expose aussi les options visibles de l'entité." }, "statuts_internes": { "items": { "$ref": "#/components/schemas/ExternalOperationTaxonomyOption" }, "type": "array", "title": "Statuts Internes", "description": "Statuts internes du socle canonique historique." }, "statuts_operationnels": { "items": { "$ref": "#/components/schemas/ExternalOperationTaxonomyOption" }, "type": "array", "title": "Statuts Operationnels", "description": "Statuts opérationnels du socle canonique historique." } }, "type": "object", "required": [ "default_status", "statuses", "statuts_internes", "statuts_operationnels" ], "title": "ExternalOperationTaxonomyResponse" }, "ExternalOperationUpsertRequest": { "properties": { "spv_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Spv Id", "description": "UUID MARKO de la SPV." }, "lead_operateur_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Lead Operateur Id", "description": "UUID MARKO de l'opérateur principal de l'opération." }, "existing_marko_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Existing Marko Id", "description": "UUID d'une ressource MARKO existante à associer lors du premier upsert externe; la cible doit être accessible et compatible." }, "name": { "type": "string", "maxLength": 255, "minLength": 1, "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "status": { "anyOf": [ { "type": "string", "maxLength": 255, "minLength": 1 }, { "type": "null" } ], "title": "Status", "description": "Statut métier de l'opération. Pour une écriture externe, consulter la dimension operation_status de GET /taxonomies." }, "type_investissement": { "anyOf": [ { "type": "string", "maxLength": 255, "minLength": 1 }, { "type": "null" } ], "title": "Type Investissement", "description": "Code de type d'investissement; consulter la dimension investment_type de GET /taxonomies." }, "type_operation": { "anyOf": [ { "type": "string", "maxLength": 255, "minLength": 1 }, { "type": "null" } ], "title": "Type Operation", "description": "Code de type d'opération; consulter la dimension operation_type de GET /taxonomies." }, "classe_actif": { "anyOf": [ { "type": "string", "maxLength": 255, "minLength": 1 }, { "type": "null" } ], "title": "Classe Actif", "description": "Classe d'actif de l'opération. Pour une écriture externe, consulter la dimension asset_class de GET /taxonomies." }, "statut_interne": { "anyOf": [ { "type": "string", "maxLength": 255, "minLength": 1 }, { "type": "null" } ], "title": "Statut Interne", "description": "Code de statut interne de l'opération; consulter la dimension internal_status de GET /taxonomies." }, "statut_operationnel": { "anyOf": [ { "items": { "type": "string", "maxLength": 255, "minLength": 1 }, "type": "array", "maxItems": 100 }, { "type": "null" } ], "title": "Statut Operationnel", "description": "Codes de statuts opérationnels de l'opération; consulter la dimension operational_status de GET /taxonomies." }, "sous_classe_actif": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Sous Classe Actif", "description": "Sous-classe d'actif de l'opération." }, "data": { "additionalProperties": true, "type": "object", "title": "Data", "description": "Données métier de l'opération. Consultez GET /field-definitions pour les clés, types et unités disponibles; ne déduisez pas les unités des noms." }, "kpi_snapshot": { "anyOf": [ { "$ref": "#/components/schemas/ExternalKpiSnapshotInput" }, { "type": "null" } ], "description": "Indicateurs financiers à la date de référence; utiliser les unités définies dans le guide Pagination et données." } }, "additionalProperties": false, "type": "object", "required": [ "name" ], "title": "ExternalOperationUpsertRequest" }, "ExternalSPVSyncUpsertResponse": { "properties": { "external_id": { "type": "string", "title": "External Id", "description": "Identifiant stable de votre système, dans le contexte de votre intégration." }, "marko_id": { "type": "string", "format": "uuid", "title": "Marko Id", "description": "Identifiant MARKO résolu ou créé; conservez-le pour les appels ultérieurs." }, "outcome": { "type": "string", "enum": [ "created", "updated", "noop", "restored", "bound" ], "title": "Outcome", "description": "Résultat de la synchronisation: created, updated, noop, restored ou bound. Conserver marko_id quel que soit ce résultat." }, "resource": { "$ref": "#/components/schemas/SPVResponse", "description": "État de la ressource MARKO après la synchronisation externe." }, "taxonomy_additions": { "items": { "$ref": "#/components/schemas/EntityTaxonomyOptionResponse" }, "type": "array", "title": "Taxonomy Additions", "description": "Options de taxonomie créées par cet upsert. Conservez les codes retournés; le suffixe custom__ n'est pas prévisible." }, "request_id": { "type": "string", "title": "Request Id", "description": "Identifiant de corrélation pour le diagnostic de la requête." } }, "type": "object", "required": [ "external_id", "marko_id", "outcome", "resource", "request_id" ], "title": "ExternalSPVSyncUpsertResponse" }, "ExternalSPVUpsertRequest": { "properties": { "existing_marko_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Existing Marko Id", "description": "UUID d'une ressource MARKO existante à associer lors du premier upsert externe; la cible doit être accessible et compatible." }, "name": { "type": "string", "maxLength": 255, "minLength": 1, "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "siren": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Siren", "description": "SIREN français sur 9 chiffres; le service vérifie aussi le checksum lorsque la route le prévoit." }, "forme_juridique": { "anyOf": [ { "type": "string", "maxLength": 255 }, { "type": "null" } ], "title": "Forme Juridique", "description": "Forme juridique déclarée de la société." }, "capital_social": { "anyOf": [ { "type": "number" }, { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Capital Social", "description": "Capital social déclaré de la société." }, "montage": { "anyOf": [ { "$ref": "#/components/schemas/MontageFinancier" }, { "type": "null" } ], "description": "Montage financier de la SPV; utiliser une valeur de l'énumération." }, "date_creation": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date Creation", "description": "Date de création de la société, du fonds ou du dossier; distincte de created_at dans MARKO." }, "adresse": { "anyOf": [ { "type": "string", "maxLength": 500 }, { "type": "null" } ], "title": "Adresse", "description": "Adresse postale déclarée pour la société ou le dirigeant." }, "region": { "anyOf": [ { "type": "string", "maxLength": 255 }, { "type": "null" } ], "title": "Region", "description": "Région géographique déclarée de la société." }, "beneficiaire_effectif": { "anyOf": [ { "type": "string", "maxLength": 500 }, { "type": "null" } ], "title": "Beneficiaire Effectif", "description": "Bénéficiaire effectif déclaré pour la SPV." }, "fond_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Fond Id", "description": "UUID MARKO du fonds." } }, "additionalProperties": false, "type": "object", "required": [ "name" ], "title": "ExternalSPVUpsertRequest" }, "FieldDefinitionListResponse": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "field_key": { "type": "string", "title": "Field Key", "description": "Clé stable de la propriété métier." }, "table_name": { "type": "string", "title": "Table Name", "description": "Nom de la table associée à la propriété métier." }, "column_name": { "type": "string", "title": "Column Name", "description": "Nom de la colonne de stockage associée à la propriété métier." }, "label_fr": { "type": "string", "title": "Label Fr", "description": "Libellé français de la propriété métier." }, "verticale": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Verticale", "description": "Verticale métier à laquelle cette propriété s'applique." }, "page_onglet": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Page Onglet", "description": "Onglet de l'interface auquel la propriété est rattachée." }, "section": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Section", "description": "Section d'affichage de la propriété métier." }, "ordre_affichage": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Ordre Affichage", "description": "Position de la propriété dans son groupe d'affichage." }, "value_type": { "$ref": "#/components/schemas/FieldValueType", "description": "Type métier de la propriété, distinct du type JSON de son enveloppe." }, "importance": { "$ref": "#/components/schemas/FieldImportance", "description": "Importance attribuée à cette propriété dans le référentiel métier." }, "is_required": { "type": "boolean", "title": "Is Required", "description": "Indique si cette propriété est requise dans le référentiel métier; distinct des champs obligatoires du corps HTTP." }, "source_type": { "$ref": "#/components/schemas/FieldSourceType", "description": "Type de source de l'événement ou de la propriété métier." }, "unit": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Unit", "description": "Unité de la propriété dans le référentiel métier; la lire avant de convertir une valeur." } }, "type": "object", "required": [ "id", "field_key", "table_name", "column_name", "label_fr", "value_type", "importance", "is_required", "source_type" ], "title": "FieldDefinitionListResponse", "description": "Version allegee pour les listes." }, "FieldDefinitionResponse": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "field_key": { "type": "string", "title": "Field Key", "description": "Clé stable de la propriété métier." }, "table_name": { "type": "string", "title": "Table Name", "description": "Nom de la table associée à la propriété métier." }, "column_name": { "type": "string", "title": "Column Name", "description": "Nom de la colonne de stockage associée à la propriété métier." }, "label_fr": { "type": "string", "title": "Label Fr", "description": "Libellé français de la propriété métier." }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Description", "description": "Explication métier de la propriété." }, "verticale": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Verticale", "description": "Verticale métier à laquelle cette propriété s'applique." }, "page_onglet": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Page Onglet", "description": "Onglet de l'interface auquel la propriété est rattachée." }, "section": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Section", "description": "Section d'affichage de la propriété métier." }, "ordre_affichage": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Ordre Affichage", "description": "Position de la propriété dans son groupe d'affichage." }, "value_type": { "$ref": "#/components/schemas/FieldValueType", "description": "Type métier de la propriété, distinct du type JSON de son enveloppe." }, "enum_values": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Enum Values", "description": "Valeurs proposées pour cette propriété métier lorsqu'elle possède un choix fermé." }, "validation_regex": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Validation Regex", "description": "Expression régulière définie pour valider cette propriété métier." }, "validation_min": { "anyOf": [ { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Validation Min", "description": "Valeur minimale définie pour cette propriété métier." }, "validation_max": { "anyOf": [ { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Validation Max", "description": "Valeur maximale définie pour cette propriété métier." }, "unit": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Unit", "description": "Unité de la propriété dans le référentiel métier; la lire avant de convertir une valeur." }, "importance": { "$ref": "#/components/schemas/FieldImportance", "description": "Importance attribuée à cette propriété dans le référentiel métier." }, "is_required": { "type": "boolean", "title": "Is Required", "description": "Indique si cette propriété est requise dans le référentiel métier; distinct des champs obligatoires du corps HTTP." }, "source_type": { "$ref": "#/components/schemas/FieldSourceType", "description": "Type de source de l'événement ou de la propriété métier." }, "sources_dette_mezz": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Sources Dette Mezz", "description": "Sources documentaires prévues pour cette propriété en dette mezzanine." }, "sources_equity_minoritaire": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Sources Equity Minoritaire", "description": "Sources documentaires prévues pour cette propriété en equity minoritaire." }, "sources_dette_senior": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Sources Dette Senior", "description": "Sources documentaires prévues pour cette propriété en dette senior." }, "sources_equity_majoritaire": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Sources Equity Majoritaire", "description": "Sources documentaires prévues pour cette propriété en equity majoritaire." }, "sources_mix": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Sources Mix", "description": "Sources documentaires prévues pour cette propriété dans un investissement mixte." }, "source_priority": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Source Priority", "description": "Ordre de priorité des sources de cette propriété métier." }, "calculation_formula": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Calculation Formula", "description": "Formule de calcul déclarée pour cette propriété." }, "calculation_dependencies": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Calculation Dependencies", "description": "Champs nécessaires au calcul de cette propriété métier." }, "calculation_trigger": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Calculation Trigger", "description": "Événement ou mode qui déclenche le calcul de cette propriété." }, "alert_1_enabled": { "type": "boolean", "title": "Alert 1 Enabled", "description": "Indique si la règle d'alerte est activée." }, "alert_1_rule": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Alert 1 Rule", "description": "Condition de déclenchement de la règle d'alerte." }, "alert_1_type": { "anyOf": [ { "$ref": "#/components/schemas/AlertSourceType" }, { "type": "null" } ], "description": "Type d'alerte associé à la règle." }, "alert_1_severity": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Alert 1 Severity", "description": "Gravité de l'alerte déclenchée par la règle." }, "alert_1_task": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Alert 1 Task", "description": "Configuration de la tâche associée à la règle d'alerte." }, "alert_2_enabled": { "type": "boolean", "title": "Alert 2 Enabled", "description": "Indique si la règle d'alerte est activée." }, "alert_2_rule": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Alert 2 Rule", "description": "Condition de déclenchement de la règle d'alerte." }, "alert_2_type": { "anyOf": [ { "$ref": "#/components/schemas/AlertSourceType" }, { "type": "null" } ], "description": "Type d'alerte associé à la règle." }, "alert_2_severity": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Alert 2 Severity", "description": "Gravité de l'alerte déclenchée par la règle." }, "alert_2_task": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Alert 2 Task", "description": "Configuration de la tâche associée à la règle d'alerte." }, "alert_config": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Alert Config", "description": "Configuration des règles d'alerte associées à ce champ métier." }, "name_modifiable": { "type": "boolean", "title": "Name Modifiable", "description": "Indique si le nom de la propriété peut être modifié dans le référentiel." }, "value_modifiable": { "type": "boolean", "title": "Value Modifiable", "description": "Indique si la valeur de la propriété peut être modifiée." }, "risk_factor": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Risk Factor", "description": "Facteur de risque associé à cette propriété métier." }, "risk_weight": { "anyOf": [ { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Risk Weight", "description": "Poids de cette propriété dans l'évaluation du risque." }, "extraction_hints": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Extraction Hints", "description": "Indications destinées à l'extraction de cette propriété depuis les documents." }, "extraction_confidence_threshold": { "anyOf": [ { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Extraction Confidence Threshold", "description": "Seuil de confiance configuré pour l'extraction de cette propriété." }, "requires_human_validation": { "type": "boolean", "title": "Requires Human Validation", "description": "Indique si les valeurs extraites de cette propriété requièrent une validation humaine." }, "version": { "type": "integer", "title": "Version", "description": "Version de la ressource MARKO." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "title": "Updated At", "description": "Date de dernière modification au format ISO 8601." } }, "type": "object", "required": [ "id", "field_key", "table_name", "column_name", "label_fr", "value_type", "importance", "is_required", "source_type", "alert_1_enabled", "alert_2_enabled", "name_modifiable", "value_modifiable", "requires_human_validation", "version", "created_at", "updated_at" ], "title": "FieldDefinitionResponse" }, "FieldImportance": { "type": "string", "enum": [ "essentielle", "utile", "optionnelle", "onboarding" ], "title": "FieldImportance", "description": "Importance du champ." }, "FieldSourceType": { "type": "string", "enum": [ "document", "calculation", "hybrid", "manual", "external" ], "title": "FieldSourceType", "description": "Source d'un champ." }, "FieldValueType": { "type": "string", "enum": [ "texte", "nombre", "decimal", "pourcentage", "montant", "date", "booleen", "enum", "jsonb", "email", "telephone", "surface", "lien_doc", "liste_deroulante" ], "title": "FieldValueType", "description": "Type de valeur d'un champ." }, "FondDocumentValuesResponse": { "properties": { "aum_du_fonds": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Aum Du Fonds", "description": "Actifs sous gestion de ce fonds, issus de ses valeurs documentaires." }, "aum_des_fonds": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Aum Des Fonds", "description": "Actifs sous gestion agrégés des fonds, issus des valeurs documentaires disponibles." }, "nombre_de_spv": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Nombre De Spv", "description": "Nombre de SPV indiqué dans les valeurs documentaires du fonds." } }, "type": "object", "title": "FondDocumentValuesResponse", "description": "Typed, read-only projection of the three AI Extract fund cells.\n\nThese are document observations. They deliberately stay separate from the\nKPIs calculated from MARKO's linked SPVs and financing tranches." }, "FondResponse": { "properties": { "name": { "type": "string", "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Code", "description": "Code stable de la ressource ou de l'option. Conserver la valeur retournée par MARKO." }, "status": { "$ref": "#/components/schemas/FondStatus", "default": "actif", "description": "Statut du fonds d'investissement." }, "date_creation": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date Creation", "description": "Date de création de la société, du fonds ou du dossier; distincte de created_at dans MARKO." }, "date_liquidation": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date Liquidation", "description": "Date de liquidation du fonds, lorsqu'elle est renseignée." }, "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "entity_id": { "type": "string", "format": "uuid", "title": "Entity Id", "description": "Identifiant de l'entité MARKO à laquelle cette ressource appartient." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." }, "spv_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Spv Count", "default": 0, "description": "Nombre de SPV rattachées au fonds." }, "document_values": { "$ref": "#/components/schemas/FondDocumentValuesResponse", "description": "Valeurs du fonds extraites de ses documents." } }, "type": "object", "required": [ "name", "id", "entity_id", "created_at" ], "title": "FondResponse" }, "FondStatus": { "type": "string", "enum": [ "en_levee_de_fonds", "actif", "en_liquidation", "liquide", "ferme" ], "title": "FondStatus", "description": "Statut du fond d'investissement." }, "FondUpdate": { "properties": { "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Code", "description": "Code stable de la ressource ou de l'option. Conserver la valeur retournée par MARKO." }, "status": { "anyOf": [ { "$ref": "#/components/schemas/FondStatus" }, { "type": "null" } ], "description": "Statut du fonds d'investissement." }, "date_creation": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date Creation", "description": "Date de création de la société, du fonds ou du dossier; distincte de created_at dans MARKO." }, "date_liquidation": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date Liquidation", "description": "Date de liquidation du fonds, lorsqu'elle est renseignée." } }, "type": "object", "title": "FondUpdate" }, "InvitationDeliveryResponse": { "properties": { "reference": { "type": "string", "title": "Reference", "description": "Référence de suivi de la livraison de l'invitation." }, "status": { "type": "string", "enum": [ "preparing", "queued", "sending", "sent", "failed", "suppressed", "superseded" ], "title": "Status", "description": "État de livraison de l'invitation; ne prouve pas que l'utilisateur a activé son compte." }, "retryable": { "type": "boolean", "title": "Retryable", "description": "Indique si l'échec de livraison de l'invitation peut faire l'objet d'une reprise." }, "support": { "$ref": "#/components/schemas/InvitationDeliverySupportResponse", "description": "Informations de suivi disponibles pour diagnostiquer la livraison de l'invitation." }, "updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Updated At", "description": "Date de dernière modification au format ISO 8601." } }, "type": "object", "required": [ "reference", "status", "retryable" ], "title": "InvitationDeliveryResponse" }, "InvitationDeliverySupportResponse": { "properties": { "status": { "type": "string", "enum": [ "created", "existing", "pending", "unavailable", "not_applicable" ], "title": "Status", "default": "not_applicable", "description": "État de livraison de l'invitation; ne prouve pas que l'utilisateur a activé son compte." }, "reference": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Reference", "description": "Référence de suivi de la livraison de l'invitation." } }, "type": "object", "title": "InvitationDeliverySupportResponse" }, "JobStatus": { "type": "string", "enum": [ "pending", "running", "completed", "failed", "dead_letter", "cancelled" ], "title": "JobStatus" }, "JobType": { "type": "string", "enum": [ "ai_extraction", "ai_categorization", "kpi_calculation", "echeancier_generation" ], "description": "Type du job de traitement système." }, "KYBComparison": { "properties": { "status": { "type": "string", "enum": [ "not_compared", "matched", "differences" ], "title": "Status", "default": "not_compared", "description": "État de la comparaison entre les informations de registre et les pièces disponibles." }, "documents_compared": { "type": "integer", "title": "Documents Compared", "default": 0, "description": "Documents utilisés pour la comparaison KYB." }, "review_required": { "type": "boolean", "title": "Review Required", "default": false, "description": "Indique que le résultat demande une revue humaine." }, "alert_persistence_failed": { "type": "boolean", "title": "Alert Persistence Failed", "default": false, "description": "Indique que la comparaison a produit un résultat mais que l'enregistrement de son alerte a échoué." }, "differences": { "items": { "$ref": "#/components/schemas/KYBDifference" }, "type": "array", "title": "Differences", "description": "Écarts constatés entre les données du Kbis et celles du fournisseur." } }, "type": "object", "title": "KYBComparison" }, "KYBDifference": { "properties": { "document_id": { "type": "string", "title": "Document Id", "description": "UUID MARKO du document." }, "filename": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Filename", "description": "Nom du fichier." }, "field": { "type": "string", "title": "Field", "description": "Propriété sur laquelle porte la différence KYB." }, "kbis_value": { "type": "string", "title": "Kbis Value", "description": "Valeur lue dans le Kbis pour la propriété comparée." }, "pappers_value": { "type": "string", "title": "Pappers Value", "description": "Valeur fournie par Pappers pour la propriété comparée." }, "message": { "type": "string", "title": "Message", "description": "Message destiné à l'affichage ou au diagnostic." } }, "type": "object", "required": [ "document_id", "field", "kbis_value", "pappers_value", "message" ], "title": "KYBDifference" }, "KanbanLabelCreate": { "properties": { "name": { "type": "string", "maxLength": 50, "minLength": 1, "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "color": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$", "title": "Color", "default": "#6366f1", "description": "Couleur d'affichage; respecter les valeurs ou le format indiqués dans le schéma." } }, "type": "object", "required": [ "name" ], "title": "KanbanLabelCreate" }, "KanbanLabelResponse": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "name": { "type": "string", "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "color": { "type": "string", "title": "Color", "description": "Couleur d'affichage; respecter les valeurs ou le format indiqués dans le schéma." } }, "type": "object", "required": [ "id", "name", "color" ], "title": "KanbanLabelResponse" }, "KanbanTaskCreate": { "properties": { "titre": { "type": "string", "maxLength": 500, "minLength": 1, "title": "Titre", "description": "Titre de la tâche Kanban." }, "description": { "anyOf": [ { "type": "string", "maxLength": 2000 }, { "type": "null" } ], "title": "Description", "description": "Description libre de la ressource." }, "statut": { "anyOf": [ { "type": "string", "maxLength": 50, "minLength": 1 }, { "type": "null" } ], "title": "Statut", "description": "Statut de la tâche Kanban." }, "categorie": { "type": "string", "maxLength": 50, "minLength": 1, "title": "Categorie", "default": "custom", "description": "Catégorie de la tâche Kanban, distincte de sa priorité et de son statut." }, "priority": { "type": "string", "enum": [ "critique", "haute", "moyenne", "basse" ], "title": "Priority", "default": "moyenne", "description": "Priorité de la tâche: critique, haute, moyenne ou basse." }, "phase_key": { "anyOf": [ { "type": "string", "maxLength": 50, "minLength": 1 }, { "type": "null" } ], "title": "Phase Key", "description": "Clé de phase métier à laquelle la tâche est rattachée." }, "due_date": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Due Date", "description": "Date d'échéance de la tâche, au format YYYY-MM-DD." }, "assignee_id": { "anyOf": [ { "type": "string", "maxLength": 255, "minLength": 1 }, { "type": "null" } ], "title": "Assignee Id", "description": "Identifiant utilisateur du responsable de la tâche; ce champ n'est pas nécessairement un UUID." }, "label_ids": { "items": { "type": "string", "format": "uuid" }, "type": "array", "title": "Label Ids", "description": "UUID des labels à associer à la tâche." }, "client_request_id": { "anyOf": [ { "type": "string", "pattern": "^[A-Za-z0-9._-]{1,80}$" }, { "type": "null" } ], "title": "Client Request Id", "description": "Optional durable request id scoped to the operation: retrying the same create replays the already-created task instead of duplicating it." } }, "type": "object", "required": [ "titre" ], "title": "KanbanTaskCreate" }, "KanbanTaskReorder": { "properties": { "task_id": { "type": "string", "format": "uuid", "title": "Task Id", "description": "UUID de la tâche Kanban à déplacer." }, "new_status": { "type": "string", "title": "New Status", "description": "Statut cible de la tâche après son déplacement." }, "new_sort_order": { "type": "integer", "minimum": 0.0, "title": "New Sort Order", "description": "Nouvelle position de la tâche dans le périmètre de réordonnancement." }, "ordering_scope": { "type": "string", "enum": [ "operation", "dashboard" ], "title": "Ordering Scope", "default": "operation", "description": "Périmètre du déplacement: board de l'opération ou board consolidé." }, "expected_updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Expected Updated At", "description": "Optimistic-concurrency guard: the task's updated_at the client based its move on. A mismatch returns a typed 409 with the fresh state instead of silently overwriting a concurrent move." } }, "type": "object", "required": [ "task_id", "new_status", "new_sort_order" ], "title": "KanbanTaskReorder", "description": "Payload for drag & drop reorder." }, "KanbanTaskResponse": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "operation_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operation Id", "description": "UUID MARKO de l'opération." }, "operateur_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operateur Id", "description": "UUID MARKO de l'opérateur." }, "fond_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Fond Id", "description": "UUID MARKO du fonds." }, "spv_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Spv Id", "description": "UUID MARKO de la SPV." }, "target_type": { "type": "string", "enum": [ "operation", "operateur", "fond", "spv" ], "title": "Target Type", "description": "Type de ressource à laquelle la tâche se rapporte." }, "target_name": { "type": "string", "title": "Target Name", "description": "Nom de la ressource à laquelle la tâche se rapporte." }, "target_url": { "type": "string", "title": "Target Url", "description": "Lien vers la ressource concernée dans l'interface MARKO." }, "phase_key": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Phase Key", "description": "Clé de phase métier à laquelle la tâche est rattachée." }, "operation_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Operation Name", "description": "Nom de l'opération concernée." }, "operation_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Operation Url", "description": "Lien vers la fiche de l'opération dans MARKO." }, "operation_piloting_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Operation Piloting Url", "description": "Lien vers le pilotage de l'opération dans MARKO." }, "fond_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Fond Name", "description": "Nom du fonds associé à la ressource." }, "spv_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Spv Name", "description": "Nom de la SPV associée à la ressource." }, "responsable_interne": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Responsable Interne", "description": "Responsable interne associé à la ressource." }, "operateur_nom": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Operateur Nom", "description": "Nom de l'opérateur associé à la cible de la tâche." }, "asset_manager_nom": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Asset Manager Nom", "description": "Nom de l'asset manager associé à la cible de la tâche." }, "statut_interne": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Statut Interne", "description": "Code de statut interne de l'opération; consulter la dimension internal_status de GET /taxonomies." }, "statut_operationnel": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Statut Operationnel", "description": "Codes de statuts opérationnels de l'opération; consulter la dimension operational_status de GET /taxonomies." }, "titre": { "type": "string", "title": "Titre", "description": "Titre de la tâche Kanban." }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Description", "description": "Description libre de la ressource." }, "statut": { "type": "string", "title": "Statut", "description": "Statut de la tâche Kanban." }, "categorie": { "type": "string", "title": "Categorie", "description": "Catégorie de la tâche Kanban, distincte de sa priorité et de son statut." }, "priority": { "type": "string", "enum": [ "critique", "haute", "moyenne", "basse" ], "title": "Priority", "default": "moyenne", "description": "Priorité de la tâche: critique, haute, moyenne ou basse." }, "assignee_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Assignee Id", "description": "Identifiant utilisateur du responsable de la tâche; ce champ n'est pas nécessairement un UUID." }, "due_date": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Due Date", "description": "Date d'échéance de la tâche, au format YYYY-MM-DD." }, "completed_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Completed At", "description": "Date de fin, lorsqu'une exécution ou un traitement est terminé." }, "sort_order": { "type": "integer", "title": "Sort Order", "description": "Position de la tâche dans le board de son opération." }, "dashboard_sort_order": { "type": "integer", "title": "Dashboard Sort Order", "default": 0, "description": "Position de la tâche dans le board consolidé." }, "archived_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Archived At", "description": "Date d'archivage de la tâche; null si elle n'est pas archivée." }, "labels": { "items": { "$ref": "#/components/schemas/KanbanLabelResponse" }, "type": "array", "title": "Labels", "description": "Labels actuellement associés à la tâche." }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Created At", "description": "Date de création au format ISO 8601." }, "updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Updated At", "description": "Date de dernière modification au format ISO 8601." }, "idempotency_receipt": { "anyOf": [ { "$ref": "#/components/schemas/ManualCreationIdempotencyReceipt" }, { "type": "null" } ], "description": "Reçu de création manuelle indiquant notamment si une création précédente a été rejouée." } }, "type": "object", "required": [ "id", "target_type", "target_name", "target_url", "titre", "statut", "categorie", "sort_order" ], "title": "KanbanTaskResponse" }, "KanbanTaskUpdate": { "properties": { "titre": { "anyOf": [ { "type": "string", "maxLength": 500, "minLength": 1 }, { "type": "null" } ], "title": "Titre", "description": "Titre de la tâche Kanban." }, "description": { "anyOf": [ { "type": "string", "maxLength": 2000 }, { "type": "null" } ], "title": "Description", "description": "Description libre de la ressource." }, "statut": { "anyOf": [ { "type": "string", "maxLength": 50, "minLength": 1 }, { "type": "null" } ], "title": "Statut", "description": "Statut de la tâche Kanban." }, "categorie": { "anyOf": [ { "type": "string", "maxLength": 50, "minLength": 1 }, { "type": "null" } ], "title": "Categorie", "description": "Catégorie de la tâche Kanban, distincte de sa priorité et de son statut." }, "priority": { "anyOf": [ { "type": "string", "enum": [ "critique", "haute", "moyenne", "basse" ] }, { "type": "null" } ], "title": "Priority", "description": "Priorité de la tâche: critique, haute, moyenne ou basse." }, "phase_key": { "anyOf": [ { "type": "string", "maxLength": 50, "minLength": 1 }, { "type": "null" } ], "title": "Phase Key", "description": "Clé de phase métier à laquelle la tâche est rattachée." }, "due_date": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Due Date", "description": "Date d'échéance de la tâche, au format YYYY-MM-DD." }, "assignee_id": { "anyOf": [ { "type": "string", "maxLength": 255, "minLength": 1 }, { "type": "null" } ], "title": "Assignee Id", "description": "Identifiant utilisateur du responsable de la tâche; ce champ n'est pas nécessairement un UUID." }, "label_ids": { "anyOf": [ { "items": { "type": "string", "format": "uuid" }, "type": "array" }, { "type": "null" } ], "title": "Label Ids", "description": "UUID des labels à associer à la tâche." }, "operation_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operation Id", "description": "UUID MARKO de l'opération." }, "operateur_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operateur Id", "description": "UUID MARKO de l'opérateur." }, "fond_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Fond Id", "description": "UUID MARKO du fonds." }, "spv_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Spv Id", "description": "UUID MARKO de la SPV." } }, "type": "object", "title": "KanbanTaskUpdate" }, "ManualCreationIdempotencyReceipt": { "properties": { "client_request_id": { "type": "string", "title": "Client Request Id", "description": "Identifiant durable de la création manuelle; conserver la même valeur pour reprendre la même création." }, "actor_id": { "type": "string", "title": "Actor Id", "description": "Identifiant de l'auteur de l'événement." }, "capability": { "type": "string", "title": "Capability", "description": "Capacité de création à laquelle se rapporte le reçu d'idempotence." }, "payload_digest": { "type": "string", "pattern": "^[0-9a-f]{64}$", "title": "Payload Digest", "description": "Empreinte du contenu de la création manuelle utilisée pour détecter une reprise incompatible." }, "replayed": { "type": "boolean", "title": "Replayed", "default": false, "description": "Indique qu'une réponse liée à la même intention a été retrouvée et rejouée." } }, "type": "object", "required": [ "client_request_id", "actor_id", "capability", "payload_digest" ], "title": "ManualCreationIdempotencyReceipt", "description": "Content-free binding returned on create and later readback." }, "ManualCreationPolicy": { "properties": { "operation": { "type": "boolean", "title": "Operation", "default": true, "description": "Politique de création manuelle des opérations." }, "fond": { "type": "boolean", "title": "Fond", "default": true, "description": "Politique de création manuelle des fonds." }, "spv": { "type": "boolean", "title": "Spv", "default": true, "description": "Politique de création manuelle des SPV." }, "operateur": { "type": "boolean", "title": "Operateur", "default": true, "description": "Politique de création manuelle des opérateurs." }, "follow_up": { "type": "boolean", "title": "Follow Up", "default": true, "description": "Politique de création manuelle des notes de suivi." } }, "additionalProperties": false, "type": "object", "title": "ManualCreationPolicy" }, "MontageFinancier": { "type": "string", "enum": [ "dette_senior", "mezzanine", "equity", "mix" ], "title": "MontageFinancier", "description": "Type de montage financier du SPV." }, "NotificationCreate": { "properties": { "type": { "type": "string", "title": "Type", "description": "Type de l'alerte ou de la notification." }, "severity": { "type": "string", "title": "Severity", "default": "info", "description": "Niveau de gravité de l'événement, distinct de son statut de traitement." }, "title": { "type": "string", "title": "Title", "description": "Titre affiché pour l'événement ou le problème." }, "message": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Message", "description": "Message destiné à l'affichage ou au diagnostic." }, "target_url": { "type": "string", "title": "Target Url", "description": "Lien vers la ressource concernée dans l'interface MARKO." }, "target_tab": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Target Tab", "description": "Onglet à ouvrir sur la cible dans MARKO." }, "target_filter": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Target Filter", "description": "Filtre à appliquer lors de l'ouverture de la cible dans MARKO." }, "highlight_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Highlight Id", "description": "Identifiant de l'élément à mettre en évidence dans l'interface." }, "operation_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operation Id", "description": "UUID MARKO de l'opération." } }, "type": "object", "required": [ "type", "title", "target_url" ], "title": "NotificationCreate" }, "NotificationReadAllResult": { "type": "object", "properties": { "marked_read": { "type": "integer", "description": "Nombre de notifications marquées comme lues par cet appel." } }, "required": [ "marked_read" ] }, "NotificationResponse": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "user_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "User Id", "description": "Identifiant utilisateur MARKO; il n'est pas nécessairement un UUID." }, "type": { "type": "string", "title": "Type", "description": "Type de l'alerte ou de la notification." }, "severity": { "type": "string", "title": "Severity", "description": "Niveau de gravité de l'événement, distinct de son statut de traitement." }, "title": { "type": "string", "title": "Title", "description": "Titre affiché pour l'événement ou le problème." }, "message": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Message", "description": "Message destiné à l'affichage ou au diagnostic." }, "target_url": { "type": "string", "title": "Target Url", "description": "Lien vers la ressource concernée dans l'interface MARKO." }, "target_tab": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Target Tab", "description": "Onglet à ouvrir sur la cible dans MARKO." }, "target_filter": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Target Filter", "description": "Filtre à appliquer lors de l'ouverture de la cible dans MARKO." }, "highlight_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Highlight Id", "description": "Identifiant de l'élément à mettre en évidence dans l'interface." }, "operation_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operation Id", "description": "UUID MARKO de l'opération." }, "is_composite": { "type": "boolean", "title": "Is Composite", "default": false, "description": "Indique si la notification regroupe plusieurs informations." }, "read": { "type": "boolean", "title": "Read", "description": "Indique si la notification ou l'alerte a été lue." }, "was_false_positive": { "type": "boolean", "title": "Was False Positive", "default": false, "description": "Indique si cette notification a été déclarée comme faux positif." }, "alert_status": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Alert Status", "description": "État de traitement de l'alerte, distinct de son niveau de gravité." }, "snoozed_until": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Snoozed Until", "description": "Date jusqu'à laquelle l'alerte ou la recommandation est reportée." }, "escalation_level": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Escalation Level", "description": "Niveau d'escalade de l'alerte ou de la notification." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." } }, "type": "object", "required": [ "id", "type", "severity", "title", "target_url", "read", "created_at" ], "title": "NotificationResponse" }, "OperateurCreate": { "properties": { "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "siren": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Siren", "description": "SIREN français sur 9 chiffres; le service vérifie aussi le checksum lorsque la route le prévoit." }, "type": { "anyOf": [ { "$ref": "#/components/schemas/OperateurType" }, { "type": "null" } ], "description": "Type métier de l'opérateur." }, "data": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Data", "description": "Données métier de l'opération. Consultez GET /field-definitions pour les clés, types et unités disponibles; ne déduisez pas les unités des noms." } }, "type": "object", "title": "OperateurCreate" }, "OperateurResponse": { "properties": { "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "siren": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Siren", "description": "SIREN français sur 9 chiffres; le service vérifie aussi le checksum lorsque la route le prévoit." }, "type": { "anyOf": [ { "$ref": "#/components/schemas/OperateurType" }, { "type": "null" } ], "description": "Type métier de l'opérateur." }, "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "data": { "additionalProperties": true, "type": "object", "title": "Data", "description": "Données métier de l'opération. Consultez GET /field-definitions pour les clés, types et unités disponibles; ne déduisez pas les unités des noms." }, "source_extraction": { "type": "boolean", "title": "Source Extraction", "description": "Origine des données extraites pour l'opérateur." }, "litiges_en_cours": { "type": "boolean", "title": "Litiges En Cours", "description": "Indique si des litiges sont déclarés en cours." }, "litiges_detail": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Litiges Detail", "description": "Détails des litiges déclarés pour la société." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "title": "Updated At", "description": "Date de dernière modification au format ISO 8601." }, "responsable_interne": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Responsable Interne", "description": "Responsable interne associé à la ressource." }, "reputation_gouvernance_score": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Reputation Gouvernance Score", "description": "Score de réputation et de gouvernance de l'opérateur." }, "reputation_gouvernance_label": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Reputation Gouvernance Label", "description": "Libellé du niveau de réputation et de gouvernance de l'opérateur." }, "forme_societe_mere": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Forme Societe Mere", "description": "Forme juridique de la société mère de l'opérateur." }, "siren_mere": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Siren Mere", "description": "SIREN de la société mère de l'opérateur." } }, "type": "object", "required": [ "id", "data", "source_extraction", "litiges_en_cours", "created_at", "updated_at" ], "title": "OperateurResponse" }, "OperateurType": { "type": "string", "enum": [ "promoteur", "marchand_de_biens", "asset_manager", "fonciere", "entrepreneur_general" ], "title": "OperateurType", "description": "Type d'opérateur." }, "OperateurUpdate": { "properties": { "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "siren": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Siren", "description": "SIREN français sur 9 chiffres; le service vérifie aussi le checksum lorsque la route le prévoit." }, "type": { "anyOf": [ { "$ref": "#/components/schemas/OperateurType" }, { "type": "null" } ], "description": "Type métier de l'opérateur." }, "data": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Data", "description": "Données métier de l'opération. Consultez GET /field-definitions pour les clés, types et unités disponibles; ne déduisez pas les unités des noms." }, "expected_updated_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Expected Updated At", "description": "Valeur updated_at lue avant la modification. Une version concurrente exige une nouvelle lecture et une réévaluation." } }, "type": "object", "title": "OperateurUpdate" }, "OperationChronicle": { "properties": { "operation_id": { "type": "string", "title": "Operation Id", "description": "UUID MARKO de l'opération." }, "entries": { "items": { "$ref": "#/components/schemas/OperationChronicleEntry" }, "type": "array", "title": "Entries", "description": "Événements de la chronologie de l'opération." }, "total": { "type": "integer", "title": "Total", "description": "Nombre total de résultats correspondant aux filtres." }, "page": { "type": "integer", "title": "Page", "description": "Numéro de la page courante, à partir de 1.", "default": 1 }, "pages": { "type": "integer", "title": "Pages", "description": "Total pages", "default": 0 }, "limit": { "type": "integer", "title": "Limit", "description": "Items per page", "default": 50 }, "sources_queried": { "items": { "type": "string" }, "type": "array", "title": "Sources Queried", "description": "Data sources included (comment, alert, document, status, reporting)" } }, "type": "object", "required": [ "operation_id", "entries", "total" ], "title": "OperationChronicle", "description": "Complete narrative chronicle for an operation.\n\nAggregates events from multiple sources into a unified, chronologically-sorted\ntimeline with narrative text." }, "OperationChronicleCategory": { "type": "string", "enum": [ "comment", "alert", "document", "status", "reporting" ], "title": "OperationChronicleCategory", "description": "Category of an operation chronicle narrative entry." }, "OperationChronicleEntry": { "properties": { "id": { "type": "string", "title": "Id", "description": "Prefixed ID: 'cm_{uuid}', 'nt_{uuid}', etc." }, "timestamp": { "type": "string", "format": "date-time", "title": "Timestamp", "description": "Heure Unix en secondes de l'échange signé." }, "category": { "$ref": "#/components/schemas/OperationChronicleCategory", "description": "Catégorie de la note; les règles exactes dépendent de la route. Pour l'import externe: chaîne de 1 à 80 caractères, libre par défaut." }, "title": { "type": "string", "title": "Title", "description": "Short, action-oriented title" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Description", "description": "1-2 sentence narrative description" }, "severity": { "$ref": "#/components/schemas/OperationChronicleSeverity", "default": "info", "description": "Niveau de gravité de l'événement, distinct de son statut de traitement." }, "source_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Source Url", "description": "Deep-link to the source entity" }, "actor_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Actor Id", "description": "Identifiant de l'auteur de l'événement." }, "actor_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Actor Name", "description": "Nom de l'auteur affiché dans la chronologie." }, "metadata": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Metadata", "description": "Informations complémentaires de l'événement; leurs clés dépendent de son type." } }, "type": "object", "required": [ "id", "timestamp", "category", "title" ], "title": "OperationChronicleEntry", "description": "Single entry in the operation chronicle narrative timeline.\n\nRicher than ChronicleEntry: includes category, severity, source_url,\nand narrative-style title/description." }, "OperationChronicleSeverity": { "type": "string", "enum": [ "info", "warning", "critical" ], "title": "OperationChronicleSeverity", "description": "Severity level for a chronicle entry." }, "OperationStatus": { "type": "string", "enum": [ "sourcing", "instruction", "travaux", "commercialisation", "livraison", "cloture", "perte" ], "title": "OperationStatus", "description": "Statut métier de l'opération." }, "PaginatedResponse_AIExtractionJobResponse_": { "properties": { "items": { "items": { "$ref": "#/components/schemas/AIExtractionJobResponse" }, "type": "array", "title": "Items", "description": "Résultats de la page courante." }, "total": { "type": "integer", "title": "Total", "description": "Nombre total de résultats correspondant aux filtres." }, "limit": { "type": "integer", "title": "Limit", "description": "Limit used for this request" }, "offset": { "type": "integer", "title": "Offset", "description": "Nombre de résultats ignorés avant cette page." }, "page": { "type": "integer", "title": "Page", "description": "Numéro de la page courante, à partir de 1.", "default": 0 }, "pages": { "type": "integer", "title": "Pages", "description": "Nombre total de pages pour cette taille de page.", "default": 0 } }, "type": "object", "required": [ "items", "total", "limit", "offset" ], "title": "PaginatedResponse[AIExtractionJobResponse]" }, "PaginatedResponse_AlertResponse_": { "properties": { "items": { "items": { "$ref": "#/components/schemas/AlertResponse" }, "type": "array", "title": "Items", "description": "Résultats de la page courante." }, "total": { "type": "integer", "title": "Total", "description": "Nombre total de résultats correspondant aux filtres." }, "limit": { "type": "integer", "title": "Limit", "description": "Limit used for this request" }, "offset": { "type": "integer", "title": "Offset", "description": "Nombre de résultats ignorés avant cette page." }, "page": { "type": "integer", "title": "Page", "description": "Numéro de la page courante, à partir de 1.", "default": 0 }, "pages": { "type": "integer", "title": "Pages", "description": "Nombre total de pages pour cette taille de page.", "default": 0 } }, "type": "object", "required": [ "items", "total", "limit", "offset" ], "title": "PaginatedResponse[AlertResponse]" }, "PaginatedResponse_CommentResponse_": { "properties": { "items": { "items": { "$ref": "#/components/schemas/CommentResponse" }, "type": "array", "title": "Items", "description": "Résultats de la page courante." }, "total": { "type": "integer", "title": "Total", "description": "Nombre total de résultats correspondant aux filtres." }, "limit": { "type": "integer", "title": "Limit", "description": "Limit used for this request" }, "offset": { "type": "integer", "title": "Offset", "description": "Nombre de résultats ignorés avant cette page." }, "page": { "type": "integer", "title": "Page", "description": "Numéro de la page courante, à partir de 1.", "default": 0 }, "pages": { "type": "integer", "title": "Pages", "description": "Nombre total de pages pour cette taille de page.", "default": 0 } }, "type": "object", "required": [ "items", "total", "limit", "offset" ], "title": "PaginatedResponse[CommentResponse]" }, "PaginatedResponse_DealNoteResponse_": { "properties": { "items": { "items": { "$ref": "#/components/schemas/DealNoteResponse" }, "type": "array", "title": "Items", "description": "Résultats de la page courante." }, "total": { "type": "integer", "title": "Total", "description": "Nombre total de résultats correspondant aux filtres." }, "limit": { "type": "integer", "title": "Limit", "description": "Limit used for this request" }, "offset": { "type": "integer", "title": "Offset", "description": "Nombre de résultats ignorés avant cette page." }, "page": { "type": "integer", "title": "Page", "description": "Numéro de la page courante, à partir de 1.", "default": 0 }, "pages": { "type": "integer", "title": "Pages", "description": "Nombre total de pages pour cette taille de page.", "default": 0 } }, "type": "object", "required": [ "items", "total", "limit", "offset" ], "title": "PaginatedResponse[DealNoteResponse]" }, "PaginatedResponse_DealResponse_": { "properties": { "items": { "items": { "$ref": "#/components/schemas/DealResponse" }, "type": "array", "title": "Items", "description": "Résultats de la page courante." }, "total": { "type": "integer", "title": "Total", "description": "Nombre total de résultats correspondant aux filtres." }, "limit": { "type": "integer", "title": "Limit", "description": "Limit used for this request" }, "offset": { "type": "integer", "title": "Offset", "description": "Nombre de résultats ignorés avant cette page." }, "page": { "type": "integer", "title": "Page", "description": "Numéro de la page courante, à partir de 1.", "default": 0 }, "pages": { "type": "integer", "title": "Pages", "description": "Nombre total de pages pour cette taille de page.", "default": 0 } }, "type": "object", "required": [ "items", "total", "limit", "offset" ], "title": "PaginatedResponse[DealResponse]" }, "PaginatedResponse_FieldDefinitionListResponse_": { "properties": { "items": { "items": { "$ref": "#/components/schemas/FieldDefinitionListResponse" }, "type": "array", "title": "Items", "description": "Résultats de la page courante." }, "total": { "type": "integer", "title": "Total", "description": "Nombre total de résultats correspondant aux filtres." }, "limit": { "type": "integer", "title": "Limit", "description": "Limit used for this request" }, "offset": { "type": "integer", "title": "Offset", "description": "Nombre de résultats ignorés avant cette page." }, "page": { "type": "integer", "title": "Page", "description": "Numéro de la page courante, à partir de 1.", "default": 0 }, "pages": { "type": "integer", "title": "Pages", "description": "Nombre total de pages pour cette taille de page.", "default": 0 } }, "type": "object", "required": [ "items", "total", "limit", "offset" ], "title": "PaginatedResponse[FieldDefinitionListResponse]" }, "PaginatedResponse_KanbanTaskResponse_": { "properties": { "items": { "items": { "$ref": "#/components/schemas/KanbanTaskResponse" }, "type": "array", "title": "Items", "description": "Résultats de la page courante." }, "total": { "type": "integer", "title": "Total", "description": "Nombre total de résultats correspondant aux filtres." }, "limit": { "type": "integer", "title": "Limit", "description": "Limit used for this request" }, "offset": { "type": "integer", "title": "Offset", "description": "Nombre de résultats ignorés avant cette page." }, "page": { "type": "integer", "title": "Page", "description": "Numéro de la page courante, à partir de 1.", "default": 0 }, "pages": { "type": "integer", "title": "Pages", "description": "Nombre total de pages pour cette taille de page.", "default": 0 } }, "type": "object", "required": [ "items", "total", "limit", "offset" ], "title": "PaginatedResponse[KanbanTaskResponse]" }, "PaginatedResponse_NotificationResponse_": { "properties": { "items": { "items": { "$ref": "#/components/schemas/NotificationResponse" }, "type": "array", "title": "Items", "description": "Résultats de la page courante." }, "total": { "type": "integer", "title": "Total", "description": "Nombre total de résultats correspondant aux filtres." }, "limit": { "type": "integer", "title": "Limit", "description": "Limit used for this request" }, "offset": { "type": "integer", "title": "Offset", "description": "Nombre de résultats ignorés avant cette page." }, "page": { "type": "integer", "title": "Page", "description": "Numéro de la page courante, à partir de 1.", "default": 0 }, "pages": { "type": "integer", "title": "Pages", "description": "Nombre total de pages pour cette taille de page.", "default": 0 } }, "type": "object", "required": [ "items", "total", "limit", "offset" ], "title": "PaginatedResponse[NotificationResponse]" }, "PaginatedResponse_OperateurResponse_": { "properties": { "items": { "items": { "$ref": "#/components/schemas/OperateurResponse" }, "type": "array", "title": "Items", "description": "Résultats de la page courante." }, "total": { "type": "integer", "title": "Total", "description": "Nombre total de résultats correspondant aux filtres." }, "limit": { "type": "integer", "title": "Limit", "description": "Limit used for this request" }, "offset": { "type": "integer", "title": "Offset", "description": "Nombre de résultats ignorés avant cette page." }, "page": { "type": "integer", "title": "Page", "description": "Numéro de la page courante, à partir de 1.", "default": 0 }, "pages": { "type": "integer", "title": "Pages", "description": "Nombre total de pages pour cette taille de page.", "default": 0 } }, "type": "object", "required": [ "items", "total", "limit", "offset" ], "title": "PaginatedResponse[OperateurResponse]" }, "PaginatedResponse_RepaymentHistoryResponse_": { "properties": { "items": { "items": { "$ref": "#/components/schemas/RepaymentHistoryResponse" }, "type": "array", "title": "Items", "description": "Résultats de la page courante." }, "total": { "type": "integer", "title": "Total", "description": "Nombre total de résultats correspondant aux filtres." }, "limit": { "type": "integer", "title": "Limit", "description": "Limit used for this request" }, "offset": { "type": "integer", "title": "Offset", "description": "Nombre de résultats ignorés avant cette page." }, "page": { "type": "integer", "title": "Page", "description": "Numéro de la page courante, à partir de 1.", "default": 0 }, "pages": { "type": "integer", "title": "Pages", "description": "Nombre total de pages pour cette taille de page.", "default": 0 } }, "type": "object", "required": [ "items", "total", "limit", "offset" ], "title": "PaginatedResponse[RepaymentHistoryResponse]" }, "PaginatedResponse_ThirdPartyRiskResponse_": { "properties": { "items": { "items": { "$ref": "#/components/schemas/ThirdPartyRiskResponse" }, "type": "array", "title": "Items", "description": "Résultats de la page courante." }, "total": { "type": "integer", "title": "Total", "description": "Nombre total de résultats correspondant aux filtres." }, "limit": { "type": "integer", "title": "Limit", "description": "Limit used for this request" }, "offset": { "type": "integer", "title": "Offset", "description": "Nombre de résultats ignorés avant cette page." }, "page": { "type": "integer", "title": "Page", "description": "Numéro de la page courante, à partir de 1.", "default": 0 }, "pages": { "type": "integer", "title": "Pages", "description": "Nombre total de pages pour cette taille de page.", "default": 0 } }, "type": "object", "required": [ "items", "total", "limit", "offset" ], "title": "PaginatedResponse[ThirdPartyRiskResponse]" }, "ProblemDetails": { "type": "object", "required": [ "title", "status", "detail" ], "properties": { "type": { "type": "string", "default": "about:blank", "description": "URI identifiant le type de problème; about:blank lorsque seul le statut HTTP le caractérise." }, "title": { "type": "string", "description": "Titre affiché pour l'événement ou le problème." }, "status": { "type": "integer", "description": "Statut HTTP de la réponse d'erreur." }, "detail": { "type": "string", "description": "Informations détaillées sur le problème ou le dossier." }, "request_id": { "type": "string", "description": "Identifiant de corrélation pour le diagnostic de la requête." }, "scope": { "type": "string", "description": "Scope concerné par le refus d'accès, lorsqu'il est renseigné." }, "route_id": { "type": "string", "description": "Identifiant de la route concernée par le problème." }, "reason_code": { "type": "string", "description": "Code structuré du motif de refus; préférable au texte du message pour le diagnostic." } } }, "ProcedureCollective": { "type": "string", "enum": [ "aucune", "sauvegarde", "redressement", "liquidation" ], "title": "ProcedureCollective", "description": "Statut de procédure collective." }, "ProcessingJobHistoryItem": { "type": "object", "properties": { "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "workflow_id": { "type": "null", "description": "Clé du workflow; certaines routes utilisent une chaîne, d'autres un UUID. Respectez le type de cette route." }, "workflow_name": { "type": "null", "description": "Nom du workflow à l'origine de l'exécution." }, "workflow_source": { "type": "string", "const": "system", "description": "Origine du workflow à l'origine de l'exécution." }, "job_type": { "$ref": "#/components/schemas/JobType", "description": "Type de traitement exécuté par le job." }, "preset_key": { "type": "null", "description": "Clé du preset de workflow; utiliser une valeur du catalogue de presets." }, "status": { "$ref": "#/components/schemas/JobStatus", "description": "État du traitement; lire job_type pour identifier sa fonction et error_message pour diagnostiquer un échec." }, "entity_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Type de ressource auquel se rapporte la vue ou le traitement." }, "entity_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "description": "Identifiant de la ressource ciblée par le job, dont le type est donné par entity_type; ce n'est pas nécessairement l'entité administrative." }, "retry_count": { "type": "integer", "description": "Nombre de reprises enregistrées pour ce traitement." }, "error_message": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Détail de l'échec, lorsqu'il est disponible." }, "result": { "type": "object", "additionalProperties": true, "description": "Objet JSON métier; les clés dépendent de la source ou du preset." }, "document_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "UUID MARKO du document." }, "operation_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "UUID MARKO de l'opération." }, "filename": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Nom du fichier." }, "document_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Type métier du document; distinct de son type MIME." }, "suggestions_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Nombre total de suggestions associées à ce job." }, "pending_suggestions": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Nombre de suggestions de ce job qui attendent encore un traitement." }, "applied_suggestions": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "description": "Nombre de suggestions appliquées pour ce job." }, "summary": { "description": "Valeur JSON variable selon la source ou le preset; aucun schéma fixe n'est imposé par cette route." }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." }, "started_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de début du traitement." }, "completed_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de fin, lorsqu'une exécution ou un traitement est terminé." } }, "required": [ "id", "workflow_id", "workflow_name", "workflow_source", "job_type", "preset_key", "status", "entity_type", "entity_id", "retry_count", "error_message", "result", "document_id", "operation_id", "filename", "document_type", "suggestions_count", "pending_suggestions", "applied_suggestions", "summary", "created_at", "started_at", "completed_at" ] }, "PublicDocumentItem": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "operation_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operation Id", "description": "UUID MARKO de l'opération." }, "spv_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Spv Id", "description": "UUID MARKO de la SPV." }, "fond_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Fond Id", "description": "UUID MARKO du fonds." }, "type": { "type": "string", "title": "Type", "description": "Catégorie métier du document, distincte de son type MIME; par exemple autre pour un document non spécialisé." }, "filename": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Filename", "description": "Nom du fichier." }, "state": { "type": "string", "title": "State", "description": "État de traitement ou de validation du document." }, "version": { "type": "integer", "title": "Version", "description": "Version de la ressource MARKO." }, "storage_path": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Storage Path", "description": "Référence du fichier dans le stockage; utiliser download_url pour le télécharger." }, "download_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Download Url", "description": "URL de téléchargement disponible pour ce document. Elle peut être absente; ne pas la traiter comme un identifiant permanent." }, "partner_metadata": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Partner Metadata", "description": "Métadonnées fournies par l'intégration partenaire pour ce document." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." } }, "type": "object", "required": [ "id", "type", "state", "version", "created_at" ], "title": "PublicDocumentItem" }, "PublicEntityResponse": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "name": { "type": "string", "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "type": { "type": "string", "title": "Type", "description": "Type de l'entité MARKO." }, "siren": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Siren", "description": "SIREN français sur 9 chiffres; le service vérifie aussi le checksum lorsque la route le prévoit." }, "mode_reporting": { "type": "string", "title": "Mode Reporting", "description": "Mode de reporting configuré pour l'entité." }, "frequence_reporting": { "type": "integer", "title": "Frequence Reporting", "description": "Fréquence de reporting configurée pour l'entité." }, "date_reference_reporting": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date Reference Reporting", "description": "Date de référence utilisée par le reporting de l'entité." }, "risk_threshold": { "type": "integer", "title": "Risk Threshold", "description": "Seuil de risque configuré pour l'entité." }, "zone_vacances": { "type": "string", "title": "Zone Vacances", "description": "Zone de vacances configurée pour la planification de l'entité." }, "ai_enabled": { "type": "boolean", "title": "Ai Enabled", "description": "Indique si les fonctions IA sont activées pour l'entité; les droits de la clé restent requis." } }, "type": "object", "required": [ "id", "name", "type", "mode_reporting", "frequence_reporting", "risk_threshold", "zone_vacances", "ai_enabled" ], "title": "PublicEntityResponse" }, "PublicFondItem": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "name": { "type": "string", "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "code": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Code", "description": "Code stable de la ressource ou de l'option. Conserver la valeur retournée par MARKO." }, "status": { "type": "string", "title": "Status", "description": "Statut du fonds d'investissement." }, "date_creation": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date Creation", "description": "Date de création de la société, du fonds ou du dossier; distincte de created_at dans MARKO." }, "date_liquidation": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date Liquidation", "description": "Date de liquidation du fonds, lorsqu'elle est renseignée." } }, "type": "object", "required": [ "id", "name", "status" ], "title": "PublicFondItem" }, "PublicOperationItem": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "spv_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Spv Id", "description": "UUID MARKO de la SPV." }, "relationship_status": { "type": "string", "enum": [ "attached", "pending_attachment" ], "title": "Relationship Status", "description": "État du rattachement de l'opération visible dans ce contexte." }, "relationship_label": { "type": "string", "title": "Relationship Label", "description": "Libellé du rattachement de l'opération visible dans ce contexte." }, "name": { "type": "string", "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "status": { "type": "string", "title": "Status", "description": "Statut métier de l'opération. Pour une écriture externe, consulter la dimension operation_status de GET /taxonomies." }, "phase": { "type": "string", "title": "Phase", "description": "Phase métier de l'opération; distincte de son statut." }, "type_investissement": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Type Investissement", "description": "Code de type d'investissement; consulter la dimension investment_type de GET /taxonomies." }, "type_operation": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Type Operation", "description": "Code de type d'opération; consulter la dimension operation_type de GET /taxonomies." }, "classe_actif": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Classe Actif", "description": "Classe d'actif de l'opération. Pour une écriture externe, consulter la dimension asset_class de GET /taxonomies." }, "statut_interne": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Statut Interne", "description": "Code de statut interne de l'opération; consulter la dimension internal_status de GET /taxonomies." }, "statut_operationnel": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Statut Operationnel", "description": "Codes de statuts opérationnels de l'opération; consulter la dimension operational_status de GET /taxonomies." }, "sous_classe_actif": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Sous Classe Actif", "description": "Sous-classe d'actif de l'opération." }, "version": { "type": "integer", "title": "Version", "description": "Version de la ressource MARKO." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "title": "Updated At", "description": "Date de dernière modification au format ISO 8601." }, "financial_summary": { "additionalProperties": true, "type": "object", "title": "Financial Summary", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, "reporting_summary": { "additionalProperties": true, "type": "object", "title": "Reporting Summary", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." } }, "type": "object", "required": [ "id", "relationship_status", "relationship_label", "name", "status", "phase", "version", "created_at", "updated_at" ], "title": "PublicOperationItem" }, "PublicPortfolioSummary": { "properties": { "total_operations": { "type": "integer", "title": "Total Operations", "default": 0, "description": "Nombre d'opérations du lot ou de la synthèse portefeuille." }, "total_nominal": { "type": "number", "title": "Total Nominal", "default": 0.0, "description": "Nominal agrégé des opérations visibles dans la synthèse portefeuille." }, "total_fonds": { "type": "integer", "title": "Total Fonds", "default": 0, "description": "Nombre de fonds inclus dans la synthèse portefeuille." }, "total_spvs": { "type": "integer", "title": "Total Spvs", "default": 0, "description": "Nombre de SPV incluses dans la synthèse portefeuille." }, "total_operateurs": { "type": "integer", "title": "Total Operateurs", "default": 0, "description": "Nombre d'opérateurs inclus dans la synthèse portefeuille." }, "operations_by_status": { "additionalProperties": { "type": "integer" }, "type": "object", "title": "Operations By Status", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, "operations_by_classe_actif": { "additionalProperties": { "type": "integer" }, "type": "object", "title": "Operations By Classe Actif", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, "operations_by_type_investissement": { "additionalProperties": { "type": "integer" }, "type": "object", "title": "Operations By Type Investissement", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." } }, "type": "object", "title": "PublicPortfolioSummary" }, "PublicSPVItem": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "fond_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Fond Id", "description": "UUID MARKO du fonds." }, "name": { "type": "string", "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "siren": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Siren", "description": "SIREN français sur 9 chiffres; le service vérifie aussi le checksum lorsque la route le prévoit." }, "forme_juridique": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Forme Juridique", "description": "Forme juridique déclarée de la société." }, "montage": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Montage", "description": "Montage financier de la SPV; utiliser une valeur de l'énumération." }, "procedure_collective": { "type": "string", "title": "Procedure Collective", "description": "Indique si une procédure collective est déclarée pour la SPV." }, "is_draft": { "type": "boolean", "title": "Is Draft", "description": "Indique si la SPV est encore à l'état de brouillon." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "title": "Updated At", "description": "Date de dernière modification au format ISO 8601." } }, "type": "object", "required": [ "id", "name", "procedure_collective", "is_draft", "created_at", "updated_at" ], "title": "PublicSPVItem" }, "RCCICovenantItem": { "properties": { "operation_id": { "type": "string", "format": "uuid", "title": "Operation Id", "description": "UUID MARKO de l'opération." }, "operation_name": { "type": "string", "title": "Operation Name", "description": "Nom de l'opération concernée." }, "covenant_id": { "type": "string", "format": "uuid", "title": "Covenant Id", "description": "Identifiant du covenant contrôlé." }, "covenant_type": { "type": "string", "title": "Covenant Type", "description": "Type d'engagement contractuel contrôlé." }, "valeur_actuelle": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Valeur Actuelle", "description": "Valeur du dernier calcul du covenant." }, "seuil_contractuel": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Seuil Contractuel", "description": "Seuil défini dans le contrat pour ce covenant." }, "marge_pct": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Marge Pct", "description": "Marge calculée par rapport au seuil contractuel du covenant." }, "severity": { "type": "string", "title": "Severity", "description": "Niveau de gravité de l'événement, distinct de son statut de traitement." }, "date_dernier_calcul": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date Dernier Calcul", "description": "Date du dernier calcul du covenant." } }, "type": "object", "required": [ "operation_id", "operation_name", "covenant_id", "covenant_type", "severity" ], "title": "RCCICovenantItem", "description": "A covenant in breach or near-breach for the RCCI dashboard." }, "RCCIDocumentItem": { "properties": { "operation_id": { "type": "string", "format": "uuid", "title": "Operation Id", "description": "UUID MARKO de l'opération." }, "operation_name": { "type": "string", "title": "Operation Name", "description": "Nom de l'opération concernée." }, "document_type": { "type": "string", "title": "Document Type", "description": "Type métier du document; distinct de son type MIME." }, "status": { "type": "string", "title": "Status", "description": "État de disponibilité ou de conformité de la pièce requise." }, "deadline": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Deadline", "description": "Date limite attendue pour la pièce documentaire." } }, "type": "object", "required": [ "operation_id", "operation_name", "document_type", "status" ], "title": "RCCIDocumentItem", "description": "A missing or overdue document for the RCCI dashboard." }, "RCCIRiskItem": { "properties": { "operation_id": { "type": "string", "format": "uuid", "title": "Operation Id", "description": "UUID MARKO de l'opération." }, "operation_name": { "type": "string", "title": "Operation Name", "description": "Nom de l'opération concernée." }, "risk_score": { "type": "number", "title": "Risk Score", "description": "Score de risque calculé pour la ressource." }, "risk_grade": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Risk Grade", "description": "Classe de risque attribuée à l'opération." }, "risk_level": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Risk Level", "description": "Niveau de risque de l'opération." }, "spv_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Spv Name", "description": "Nom de la SPV associée à la ressource." } }, "type": "object", "required": [ "operation_id", "operation_name", "risk_score" ], "title": "RCCIRiskItem", "description": "An operation with risk score below threshold." }, "RCCISummaryResponse": { "properties": { "covenants_breach_count": { "type": "integer", "title": "Covenants Breach Count", "default": 0, "description": "Nombre de covenants en dépassement de seuil." }, "covenants_warning_count": { "type": "integer", "title": "Covenants Warning Count", "default": 0, "description": "Nombre de covenants en zone d'avertissement." }, "documents_missing_count": { "type": "integer", "title": "Documents Missing Count", "default": 0, "description": "Nombre de pièces documentaires manquantes dans la synthèse RCCI." }, "operations_at_risk_count": { "type": "integer", "title": "Operations At Risk Count", "default": 0, "description": "Nombre d'opérations signalées à risque dans la synthèse RCCI." }, "covenants": { "items": { "$ref": "#/components/schemas/RCCICovenantItem" }, "type": "array", "title": "Covenants", "default": [], "description": "Covenants à surveiller dans la synthèse RCCI." }, "documents": { "items": { "$ref": "#/components/schemas/RCCIDocumentItem" }, "type": "array", "title": "Documents", "default": [], "description": "Pièces documentaires prises en compte dans la synthèse RCCI." }, "risk_operations": { "items": { "$ref": "#/components/schemas/RCCIRiskItem" }, "type": "array", "title": "Risk Operations", "default": [], "description": "Opérations à risque incluses dans la synthèse RCCI." } }, "type": "object", "title": "RCCISummaryResponse", "description": "Aggregated RCCI compliance dashboard response." }, "RecommendationBundle": { "type": "object", "properties": { "key": { "type": "string", "description": "Clé stable du preset ou du groupe de recommandations." }, "label": { "type": "string", "description": "Libellé à afficher pour cette option, ce groupe ou ce preset." }, "summary": { "type": "string", "description": "Résumé du groupe de recommandations." }, "items": { "type": "array", "items": { "$ref": "#/components/schemas/WorkflowRecommendation" }, "description": "Résultats de la page courante." }, "critical_count": { "type": "integer", "description": "Nombre d'éléments classés critiques dans ce groupe." }, "recommended_count": { "type": "integer", "description": "Nombre de recommandations de priorité recommended dans ce groupe." }, "optional_count": { "type": "integer", "description": "Nombre de recommandations optionnelles dans ce groupe." } }, "required": [ "key", "label", "summary", "items", "critical_count", "recommended_count", "optional_count" ] }, "RecommendationKPIs": { "type": "object", "properties": { "recommendations_total": { "type": "integer", "description": "Nombre total de recommandations du périmètre." }, "recommendation_acceptance_rate": { "type": "number", "description": "Taux d'acceptation des recommandations du périmètre." }, "recommendation_dismiss_rate": { "type": "number", "description": "Taux de recommandations classées non pertinentes." }, "recommendation_snooze_rate": { "type": "number", "description": "Taux de recommandations reportées." }, "time_to_activation_after_recommendation_hours": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "description": "Délai d'activation après recommandation, exprimé en heures." }, "prefill_edit_rate": { "type": "number", "description": "Taux de modification des valeurs préremplies des recommandations." }, "workflow_disabled_soon_after_activation_rate": { "type": "number", "description": "Taux de workflows désactivés peu après leur activation." }, "workflow_utility_score": { "type": "number", "description": "Indicateur d'utilité des workflows dans le périmètre de recommandations." }, "monthly_false_positive_count": { "type": "integer", "description": "Nombre mensuel de recommandations déclarées comme faux positifs." }, "monthly_false_negative_proxy_count": { "type": "integer", "description": "Nombre mensuel d'événements utilisés comme indicateur indirect de faux négatifs; ce n'est pas un décompte exhaustif des erreurs." } }, "required": [ "recommendations_total", "recommendation_acceptance_rate", "recommendation_dismiss_rate", "recommendation_snooze_rate", "time_to_activation_after_recommendation_hours", "prefill_edit_rate", "workflow_disabled_soon_after_activation_rate", "workflow_utility_score", "monthly_false_positive_count", "monthly_false_negative_proxy_count" ] }, "RepaymentHistoryCreate": { "properties": { "tranche_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Tranche Id", "description": "UUID de la tranche de financement associée au remboursement." }, "date": { "type": "string", "format": "date", "title": "Date", "description": "Date métier; le type et le format ci-dessous font autorité pour cette route." }, "principal": { "anyOf": [ { "type": "number", "minimum": 0.0 }, { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*(?:\\d{0,18}|(?=[\\d.]{1,21}0*$)\\d{0,18}\\.\\d{0,2}0*$)" } ], "title": "Principal", "description": "Part de capital du remboursement enregistré." }, "interest": { "anyOf": [ { "type": "number", "minimum": 0.0 }, { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*(?:\\d{0,18}|(?=[\\d.]{1,21}0*$)\\d{0,18}\\.\\d{0,2}0*$)" } ], "title": "Interest", "description": "Part d'intérêts du remboursement enregistré." }, "total": { "anyOf": [ { "type": "number", "minimum": 0.0 }, { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*(?:\\d{0,18}|(?=[\\d.]{1,21}0*$)\\d{0,18}\\.\\d{0,2}0*$)" } ], "title": "Total", "description": "Montant total du remboursement. Doit être exactement égal à principal + interest." }, "remaining_balance": { "anyOf": [ { "type": "number", "minimum": 0.0 }, { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*(?:\\d{0,18}|(?=[\\d.]{1,21}0*$)\\d{0,18}\\.\\d{0,2}0*$)" } ], "title": "Remaining Balance", "description": "Capital restant après ce remboursement." }, "source": { "type": "string", "title": "Source", "default": "manual", "description": "Origine du remboursement: manual, extraction ou open_banking." } }, "type": "object", "required": [ "date", "principal", "interest", "total", "remaining_balance" ], "title": "RepaymentHistoryCreate" }, "RepaymentHistoryResponse": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "operation_id": { "type": "string", "format": "uuid", "title": "Operation Id", "description": "UUID MARKO de l'opération." }, "tranche_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Tranche Id", "description": "UUID de la tranche de financement associée au remboursement." }, "date": { "type": "string", "format": "date", "title": "Date", "description": "Date métier; le type et le format ci-dessous font autorité pour cette route." }, "principal": { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$", "title": "Principal", "description": "Part de capital du remboursement enregistré." }, "interest": { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$", "title": "Interest", "description": "Part d'intérêts du remboursement enregistré." }, "total": { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$", "title": "Total", "description": "Montant total du remboursement enregistré, comprenant le capital et les intérêts." }, "remaining_balance": { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$", "title": "Remaining Balance", "description": "Capital restant après ce remboursement." }, "source": { "type": "string", "title": "Source", "description": "Origine du remboursement: manual, extraction ou open_banking." }, "schedule_projection_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Schedule Projection Id", "description": "Identifiant de la projection d'échéancier à laquelle le remboursement est rapproché." }, "assignment_status": { "type": "string", "title": "Assignment Status", "default": "needs_attachment", "description": "État du rapprochement du remboursement avec l'échéancier." }, "assignment_label": { "type": "string", "title": "Assignment Label", "default": "À rattacher", "description": "Libellé du rapprochement du remboursement avec l'échéancier." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "title": "Updated At", "description": "Date de dernière modification au format ISO 8601." } }, "type": "object", "required": [ "id", "operation_id", "date", "principal", "interest", "total", "remaining_balance", "source", "created_at", "updated_at" ], "title": "RepaymentHistoryResponse" }, "ReportingMode": { "type": "string", "enum": [ "calendaire", "post_anniversaire" ], "title": "ReportingMode", "description": "Mode de calcul des dates de reporting." }, "ReportingTemplateCreate": { "properties": { "name": { "type": "string", "maxLength": 200, "minLength": 1, "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "description": { "anyOf": [ { "type": "string", "maxLength": 2000 }, { "type": "null" } ], "title": "Description", "description": "Description libre de la ressource." }, "template_type": { "type": "string", "maxLength": 50, "title": "Template Type", "description": "quarterly, annual, covenant, custom", "default": "custom" }, "columns": { "items": { "$ref": "#/components/schemas/TemplateColumn" }, "type": "array", "title": "Columns", "description": "Définitions des colonnes du reporting, dans l'ordre de sortie." }, "filters": { "$ref": "#/components/schemas/TemplateFilters", "description": "Filtres enregistrés pour la vue, le dashboard ou le template." }, "format": { "type": "string", "pattern": "^(pdf|excel)$", "title": "Format", "default": "pdf", "description": "Format de sortie demandé pour le reporting." }, "entity_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Entity Id", "description": "Identifiant de l'entité MARKO à laquelle cette ressource appartient." }, "fond_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Fond Id", "description": "UUID MARKO du fonds." } }, "type": "object", "required": [ "name" ], "title": "ReportingTemplateCreate", "description": "Create a reporting template." }, "ReportingTemplatePage": { "type": "object", "properties": { "items": { "type": "array", "items": { "$ref": "#/components/schemas/ReportingTemplateResponse" }, "description": "Résultats de la page courante." }, "total": { "type": "integer", "description": "Nombre total de résultats correspondant aux filtres." }, "limit": { "type": "integer", "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, "offset": { "type": "integer", "description": "Nombre de résultats à ignorer avant cette page (commence à 0)." } }, "required": [ "items", "total", "limit", "offset" ] }, "ReportingTemplatePreview": { "properties": { "template": { "$ref": "#/components/schemas/ReportingTemplateResponse", "description": "Template utilisé pour produire cet aperçu de reporting." }, "headers": { "items": { "type": "string" }, "type": "array", "title": "Headers", "description": "En-têtes des colonnes de l'aperçu de reporting, dans le même ordre que les cellules." }, "rows": { "items": { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, "type": "array", "title": "Rows", "description": "Lignes de l'aperçu de reporting; les cellules suivent l'ordre des headers." }, "total_rows": { "type": "integer", "title": "Total Rows", "description": "Nombre total de lignes correspondant aux filtres du reporting." } }, "type": "object", "required": [ "template", "headers", "rows", "total_rows" ], "title": "ReportingTemplatePreview", "description": "Preview data returned when previewing a template." }, "ReportingTemplateResponse": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "name": { "type": "string", "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Description", "description": "Description libre de la ressource." }, "template_type": { "type": "string", "title": "Template Type", "description": "Filtrer les templates par type." }, "columns": { "items": { "$ref": "#/components/schemas/TemplateColumn" }, "type": "array", "title": "Columns", "description": "Définitions des colonnes du reporting, dans l'ordre de sortie." }, "filters": { "$ref": "#/components/schemas/TemplateFilters", "description": "Filtres enregistrés pour la vue, le dashboard ou le template." }, "format": { "type": "string", "title": "Format", "description": "Format de sortie demandé pour le reporting." }, "entity_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Entity Id", "description": "Identifiant de l'entité MARKO à laquelle cette ressource appartient." }, "fond_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Fond Id", "description": "UUID MARKO du fonds." }, "version": { "type": "integer", "title": "Version", "description": "Version de la ressource MARKO." }, "is_default": { "type": "boolean", "title": "Is Default", "description": "Indique si cette vue ou ce template est défini par défaut." }, "created_by": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Created By", "description": "Identifiant de l'utilisateur qui a créé le template." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "title": "Updated At", "description": "Date de dernière modification au format ISO 8601." } }, "type": "object", "required": [ "id", "name", "template_type", "format", "version", "is_default", "created_at", "updated_at" ], "title": "ReportingTemplateResponse", "description": "Response schema for a reporting template." }, "ReportingTemplateUpdate": { "properties": { "name": { "anyOf": [ { "type": "string", "maxLength": 200, "minLength": 1 }, { "type": "null" } ], "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "description": { "anyOf": [ { "type": "string", "maxLength": 2000 }, { "type": "null" } ], "title": "Description", "description": "Description libre de la ressource." }, "template_type": { "anyOf": [ { "type": "string", "maxLength": 50 }, { "type": "null" } ], "title": "Template Type", "description": "Filtrer les templates par type." }, "columns": { "anyOf": [ { "items": { "$ref": "#/components/schemas/TemplateColumn" }, "type": "array" }, { "type": "null" } ], "title": "Columns", "description": "Définitions des colonnes du reporting, dans l'ordre de sortie." }, "filters": { "anyOf": [ { "$ref": "#/components/schemas/TemplateFilters" }, { "type": "null" } ], "description": "Filtres enregistrés pour la vue, le dashboard ou le template." }, "format": { "anyOf": [ { "type": "string", "pattern": "^(pdf|excel)$" }, { "type": "null" } ], "title": "Format", "description": "Format de sortie demandé pour le reporting." }, "entity_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Entity Id", "description": "Identifiant de l'entité MARKO à laquelle cette ressource appartient." }, "fond_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Fond Id", "description": "UUID MARKO du fonds." } }, "type": "object", "title": "ReportingTemplateUpdate", "description": "Update a reporting template (partial)." }, "SIRENAdresse": { "properties": { "adresse_ligne_1": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Adresse Ligne 1", "description": "Première ligne de l'adresse postale." }, "adresse_ligne_2": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Adresse Ligne 2", "description": "Deuxième ligne de l'adresse postale." }, "adresse_ligne_3": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Adresse Ligne 3", "description": "Troisième ligne de l'adresse postale." }, "complement_adresse": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Complement Adresse", "description": "Complément d'adresse postale." }, "code_postal": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Code Postal", "description": "Code postal de l'adresse." }, "ville": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Ville", "description": "Ville de l'adresse postale." }, "pays": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Pays", "description": "Nom du pays dans l'adresse fournie." }, "code_pays": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Code Pays", "description": "Code pays fourni avec l'adresse." }, "latitude": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Latitude", "description": "Latitude géographique de l'adresse." }, "longitude": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Longitude", "description": "Longitude géographique de l'adresse." } }, "type": "object", "title": "SIRENAdresse" }, "SIRENBeneficiaireEffectif": { "properties": { "nom": { "type": "string", "maxLength": 300, "minLength": 1, "title": "Nom", "description": "Nom de famille de la personne." }, "prenom": { "anyOf": [ { "type": "string", "maxLength": 300 }, { "type": "null" } ], "title": "Prenom", "description": "Prénom de la personne." } }, "type": "object", "required": [ "nom" ], "title": "SIRENBeneficiaireEffectif", "description": "Only the declared person's name; no private address or birth data." }, "SIRENCompanyIdentity-Input": { "properties": { "siren": { "type": "string", "pattern": "^\\d{9}$", "title": "Siren", "description": "SIREN français sur 9 chiffres; le service vérifie aussi le checksum lorsque la route le prévoit." }, "siret": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Siret", "description": "Identifiant SIRET de l'établissement sur 14 chiffres, distinct du SIREN sur 9 chiffres." }, "representant_legal": { "anyOf": [ { "$ref": "#/components/schemas/SIRENDirigeant" }, { "type": "null" } ], "description": "Représentant légal connu de la société." }, "presidents": { "anyOf": [ { "items": { "$ref": "#/components/schemas/SIRENDirigeant" }, "type": "array" }, { "type": "null" } ], "title": "Presidents", "description": "Présidents connus de la société." }, "beneficiaires_effectifs": { "anyOf": [ { "items": { "$ref": "#/components/schemas/SIRENBeneficiaireEffectif" }, "type": "array" }, { "type": "null" } ], "title": "Beneficiaires Effectifs", "description": "Bénéficiaires effectifs connus dans les données de la société." }, "adresse_siege": { "anyOf": [ { "$ref": "#/components/schemas/SIRENAdresse" }, { "type": "null" } ], "description": "Adresse du siège social issue des données de la société." }, "is_radiee": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Is Radiee", "description": "Indique si la société est radiée du registre." }, "entreprise_cessee": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Entreprise Cessee", "description": "Indique si la société est déclarée en cessation d'activité." }, "date_radiation": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Date Radiation", "description": "Date de radiation de la société du registre." }, "date_cessation": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Date Cessation", "description": "Date de cessation d'activité de la société." }, "numero_tva_intracommunautaire": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Numero Tva Intracommunautaire", "description": "Numéro de TVA intracommunautaire connu pour la société." }, "date_cloture_exercice": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Date Cloture Exercice", "description": "Date de clôture de l'exercice de la société." }, "date_prochaine_cloture_exercice": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Date Prochaine Cloture Exercice", "description": "Prochaine date de clôture d'exercice connue." }, "date_cloture_exercice_exceptionnelle": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Date Cloture Exercice Exceptionnelle", "description": "Date de clôture exceptionnelle de l'exercice, si elle est renseignée." } }, "type": "object", "required": [ "siren" ], "title": "SIRENCompanyIdentity", "description": "Selected registry identity, bound to the company it describes." }, "SIRENCompanyIdentity-Output": { "properties": { "siren": { "type": "string", "pattern": "^\\d{9}$", "title": "Siren", "description": "SIREN français sur 9 chiffres; le service vérifie aussi le checksum lorsque la route le prévoit." }, "siret": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Siret", "description": "Identifiant SIRET de l'établissement sur 14 chiffres, distinct du SIREN sur 9 chiffres." }, "representant_legal": { "anyOf": [ { "$ref": "#/components/schemas/SIRENDirigeant" }, { "type": "null" } ], "description": "Représentant légal connu de la société." }, "presidents": { "anyOf": [ { "items": { "$ref": "#/components/schemas/SIRENDirigeant" }, "type": "array" }, { "type": "null" } ], "title": "Presidents", "description": "Présidents connus de la société." }, "beneficiaires_effectifs": { "anyOf": [ { "items": { "$ref": "#/components/schemas/SIRENBeneficiaireEffectif" }, "type": "array" }, { "type": "null" } ], "title": "Beneficiaires Effectifs", "description": "Bénéficiaires effectifs connus dans les données de la société." }, "adresse_siege": { "anyOf": [ { "$ref": "#/components/schemas/SIRENAdresse" }, { "type": "null" } ], "description": "Adresse du siège social issue des données de la société." }, "is_radiee": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Is Radiee", "description": "Indique si la société est radiée du registre." }, "entreprise_cessee": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Entreprise Cessee", "description": "Indique si la société est déclarée en cessation d'activité." }, "date_radiation": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Date Radiation", "description": "Date de radiation de la société du registre." }, "date_cessation": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Date Cessation", "description": "Date de cessation d'activité de la société." }, "numero_tva_intracommunautaire": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Numero Tva Intracommunautaire", "description": "Numéro de TVA intracommunautaire connu pour la société." }, "date_cloture_exercice": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Date Cloture Exercice", "description": "Date de clôture de l'exercice de la société." }, "date_prochaine_cloture_exercice": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Date Prochaine Cloture Exercice", "description": "Prochaine date de clôture d'exercice connue." }, "date_cloture_exercice_exceptionnelle": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Date Cloture Exercice Exceptionnelle", "description": "Date de clôture exceptionnelle de l'exercice, si elle est renseignée." } }, "type": "object", "required": [ "siren" ], "title": "SIRENCompanyIdentity", "description": "Selected registry identity, bound to the company it describes." }, "SIRENData": { "properties": { "identite_entreprise": { "anyOf": [ { "$ref": "#/components/schemas/SIRENCompanyIdentity-Output" }, { "type": "null" } ], "description": "Identité structurée de la société et informations de registre." }, "kyb_comparison": { "anyOf": [ { "$ref": "#/components/schemas/KYBComparison" }, { "type": "null" } ], "description": "Comparaison des informations de registre avec les pièces disponibles." }, "siren": { "type": "string", "title": "Siren", "description": "SIREN français sur 9 chiffres; le service vérifie aussi le checksum lorsque la route le prévoit." }, "raison_sociale": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Raison Sociale", "description": "Dénomination légale de la société." }, "forme_juridique": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Forme Juridique", "description": "Forme juridique déclarée de la société." }, "capital_social": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Capital Social", "description": "Capital social déclaré de la société." }, "adresse_siege": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Adresse Siege", "description": "Adresse du siège social issue des données de la société." }, "region": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Region", "description": "Région géographique déclarée de la société." }, "date_creation": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Date Creation", "description": "Date de création de la société, du fonds ou du dossier; distincte de created_at dans MARKO." }, "siret": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Siret", "description": "Identifiant SIRET de l'établissement sur 14 chiffres, distinct du SIREN sur 9 chiffres." }, "dirigeants": { "items": { "$ref": "#/components/schemas/SIRENDirigeant" }, "type": "array", "title": "Dirigeants", "description": "Dirigeants connus de la société." }, "procedures_collectives": { "anyOf": [ { "items": { "$ref": "#/components/schemas/SIRENProcedure" }, "type": "array" }, { "type": "null" } ], "title": "Procedures Collectives", "description": "Procédures collectives connues de la société." }, "beneficiaires_effectifs": { "items": { "type": "string" }, "type": "array", "title": "Beneficiaires Effectifs", "description": "Bénéficiaires effectifs connus dans les données de la société." }, "source": { "type": "string", "title": "Source", "description": "Origine des données de registre: registre_public, pappers, manual ou none.", "default": "manual" }, "fetched_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Fetched At", "description": "Date de récupération des données SIREN auprès de leur source." }, "is_radiee": { "type": "boolean", "title": "Is Radiee", "default": false, "description": "Indique si la société est radiée du registre." } }, "type": "object", "required": [ "siren" ], "title": "SIRENData", "description": "Enriched company data resolved from a SIREN number.\n\nFields align across local, public-registry and commercial providers." }, "SIRENDirigeant": { "properties": { "nom": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Nom", "description": "Nom de famille de la personne." }, "prenom": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Prenom", "description": "Prénom de la personne." }, "qualite": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Qualite", "description": "Fonction ou qualité du dirigeant." }, "date_naissance": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Date Naissance", "description": "Date de naissance du dirigeant." }, "denomination": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Denomination", "description": "Dénomination du dirigeant lorsqu'il s'agit d'une personne morale." }, "siren": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Siren", "description": "SIREN français sur 9 chiffres; le service vérifie aussi le checksum lorsque la route le prévoit." }, "personne_morale": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Personne Morale", "description": "Indique si le dirigeant est une personne morale." }, "qualites": { "items": { "type": "string" }, "type": "array", "title": "Qualites", "description": "Fonctions ou qualités connues du dirigeant." }, "date_prise_de_poste": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Date Prise De Poste", "description": "Date de prise de fonction du dirigeant." }, "adresse": { "anyOf": [ { "$ref": "#/components/schemas/SIRENAdresse" }, { "type": "null" } ], "description": "Adresse postale déclarée pour la société ou le dirigeant." }, "forme_juridique": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Forme Juridique", "description": "Forme juridique déclarée de la société." } }, "type": "object", "title": "SIRENDirigeant", "description": "A single dirigeant (director/officer) of the company." }, "SIRENEnrichmentResponse": { "properties": { "success": { "type": "boolean", "title": "Success", "default": true, "description": "Indique si l'enrichissement SIREN a produit un résultat exploitable." }, "data": { "anyOf": [ { "$ref": "#/components/schemas/SIRENData" }, { "type": "null" } ], "description": "Données métier de l'opération. Consultez GET /field-definitions pour les clés, types et unités disponibles; ne déduisez pas les unités des noms." }, "error": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Error", "description": "Message d'échec de l'enrichissement SIREN, lorsqu'il existe." }, "cached": { "type": "boolean", "title": "Cached", "default": false, "description": "Indique que les données SIREN proviennent d'un résultat déjà disponible." } }, "type": "object", "title": "SIRENEnrichmentResponse", "description": "API response wrapper for SIREN enrichment." }, "SIRENProcedure": { "properties": { "type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Type", "description": "Nature de la procédure collective déclarée." }, "date": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Date", "description": "Date métier; le type et le format ci-dessous font autorité pour cette route." }, "tribunal": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Tribunal", "description": "Tribunal associé à la procédure collective." } }, "type": "object", "title": "SIRENProcedure", "description": "A collective proceeding reported by the company provider." }, "SIRENValidationResponse": { "properties": { "siren": { "type": "string", "title": "Siren", "description": "SIREN français sur 9 chiffres; le service vérifie aussi le checksum lorsque la route le prévoit." }, "valid": { "type": "boolean", "title": "Valid", "description": "Indique si le SIREN satisfait les contrôles de validation de cette route." }, "luhn_valid": { "type": "boolean", "title": "Luhn Valid", "description": "Indique si les neuf chiffres du SIREN satisfont le contrôle Luhn." }, "message": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Message", "description": "Message destiné à l'affichage ou au diagnostic." } }, "type": "object", "required": [ "siren", "valid", "luhn_valid" ], "title": "SIRENValidationResponse", "description": "Response for SIREN format validation endpoint." }, "SPVResponse": { "properties": { "name": { "type": "string", "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "siren": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Siren", "description": "SIREN français sur 9 chiffres; le service vérifie aussi le checksum lorsque la route le prévoit." }, "forme_juridique": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Forme Juridique", "description": "Forme juridique déclarée de la société." }, "capital_social": { "anyOf": [ { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Capital Social", "description": "Capital social déclaré de la société." }, "montage": { "anyOf": [ { "$ref": "#/components/schemas/MontageFinancier" }, { "type": "null" } ], "description": "Montage financier de la SPV; utiliser une valeur de l'énumération." }, "date_creation": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date Creation", "description": "Date de création de la société, du fonds ou du dossier; distincte de created_at dans MARKO." }, "identite_entreprise": { "anyOf": [ { "$ref": "#/components/schemas/SIRENCompanyIdentity-Output" }, { "type": "null" } ], "description": "Identité structurée de la société et informations de registre." }, "dirigeants": { "items": { "$ref": "#/components/schemas/SIRENDirigeant" }, "type": "array", "maxItems": 500, "title": "Dirigeants", "description": "Dirigeants connus de la société." }, "procedures_collectives": { "anyOf": [ { "items": { "$ref": "#/components/schemas/SIRENProcedure" }, "type": "array", "maxItems": 500 }, { "type": "null" } ], "title": "Procedures Collectives", "description": "Procédures collectives connues de la société." }, "organisation_pappers": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Organisation Pappers", "description": "Données d'organisation obtenues du fournisseur pour la SPV." }, "justice_pappers": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Justice Pappers", "description": "Données judiciaires fournies pour la SPV." }, "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "entity_id": { "type": "string", "format": "uuid", "title": "Entity Id", "description": "Identifiant de l'entité MARKO à laquelle cette ressource appartient." }, "fond_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Fond Id", "description": "UUID MARKO du fonds." }, "adresse": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Adresse", "description": "Adresse postale déclarée pour la société ou le dirigeant." }, "region": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Region", "description": "Région géographique déclarée de la société." }, "beneficiaire_effectif": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Beneficiaire Effectif", "description": "Bénéficiaire effectif déclaré pour la SPV." }, "date_ag_annuelle": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date Ag Annuelle", "description": "Date de l'assemblée générale annuelle de la SPV." }, "resultat_net_ag": { "anyOf": [ { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Resultat Net Ag", "description": "Résultat net présenté à l'assemblée générale de la SPV." }, "pv_ag_document_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Pv Ag Document Id", "description": "UUID du document contenant le procès-verbal d'assemblée générale." }, "procedure_collective": { "$ref": "#/components/schemas/ProcedureCollective", "default": "aucune", "description": "Indique si une procédure collective est déclarée pour la SPV." }, "litiges_en_cours": { "type": "boolean", "title": "Litiges En Cours", "default": false, "description": "Indique si des litiges sont déclarés en cours." }, "litiges_detail": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Litiges Detail", "description": "Détails des litiges déclarés pour la société." }, "contentieux_items": { "items": { "$ref": "#/components/schemas/SpvContentieuxItem-Output" }, "type": "array", "title": "Contentieux Items", "default": [], "description": "Contentieux détaillés rattachés à la SPV." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "title": "Updated At", "description": "Date de dernière modification au format ISO 8601." }, "operations_count": { "anyOf": [ { "type": "integer" }, { "type": "null" } ], "title": "Operations Count", "default": 0, "description": "Nombre d'opérations rattachées à la SPV." } }, "type": "object", "required": [ "name", "id", "entity_id", "created_at", "updated_at" ], "title": "SPVResponse" }, "SPVUpdate": { "properties": { "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "siren": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Siren", "description": "SIREN français sur 9 chiffres; le service vérifie aussi le checksum lorsque la route le prévoit." }, "forme_juridique": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Forme Juridique", "description": "Forme juridique déclarée de la société." }, "capital_social": { "anyOf": [ { "type": "number" }, { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Capital Social", "description": "Capital social déclaré de la société." }, "montage": { "anyOf": [ { "$ref": "#/components/schemas/MontageFinancier" }, { "type": "null" } ], "description": "Montage financier de la SPV; utiliser une valeur de l'énumération." }, "date_creation": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date Creation", "description": "Date de création de la société, du fonds ou du dossier; distincte de created_at dans MARKO." }, "identite_entreprise": { "anyOf": [ { "$ref": "#/components/schemas/SIRENCompanyIdentity-Input" }, { "type": "null" } ], "description": "Identité structurée de la société et informations de registre." }, "dirigeants": { "items": { "$ref": "#/components/schemas/SIRENDirigeant" }, "type": "array", "maxItems": 500, "title": "Dirigeants", "description": "Dirigeants connus de la société." }, "procedures_collectives": { "anyOf": [ { "items": { "$ref": "#/components/schemas/SIRENProcedure" }, "type": "array", "maxItems": 500 }, { "type": "null" } ], "title": "Procedures Collectives", "description": "Procédures collectives connues de la société." }, "adresse": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Adresse", "description": "Adresse postale déclarée pour la société ou le dirigeant." }, "region": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Region", "description": "Région géographique déclarée de la société." }, "beneficiaire_effectif": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Beneficiaire Effectif", "description": "Bénéficiaire effectif déclaré pour la SPV." }, "date_ag_annuelle": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date Ag Annuelle", "description": "Date de l'assemblée générale annuelle de la SPV." }, "resultat_net_ag": { "anyOf": [ { "type": "number" }, { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Resultat Net Ag", "description": "Résultat net présenté à l'assemblée générale de la SPV." }, "procedure_collective": { "anyOf": [ { "$ref": "#/components/schemas/ProcedureCollective" }, { "type": "null" } ], "description": "Indique si une procédure collective est déclarée pour la SPV." }, "litiges_en_cours": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Litiges En Cours", "description": "Indique si des litiges sont déclarés en cours." }, "litiges_detail": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Litiges Detail", "description": "Détails des litiges déclarés pour la société." }, "contentieux_items": { "anyOf": [ { "items": { "$ref": "#/components/schemas/SpvContentieuxItem-Input" }, "type": "array" }, { "type": "null" } ], "title": "Contentieux Items", "description": "Contentieux détaillés rattachés à la SPV." }, "fond_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Fond Id", "description": "UUID MARKO du fonds." } }, "type": "object", "title": "SPVUpdate" }, "SavedViewCreate": { "properties": { "name": { "type": "string", "maxLength": 200, "minLength": 1, "title": "Name", "description": "Display name of the saved view" }, "icon": { "type": "string", "enum": [ "bookmark", "briefcase", "building", "calendar", "chart", "clock", "filter", "flag", "shield", "star", "table", "target" ], "description": "Icône d'affichage de la vue sauvegardée; respecter la liste de valeurs autorisées." }, "color": { "type": "string", "enum": [ "amber", "cyan", "emerald", "rose", "slate", "violet" ], "description": "Couleur d'affichage; respecter les valeurs ou le format indiqués dans le schéma." }, "filters": { "type": "object", "maxProperties": 24, "propertyNames": { "pattern": "^[a-z][a-z0-9_]{0,63}$" }, "additionalProperties": true, "description": "État de filtre; pour une vue operations, seules les clés décrites par le contrat conditionnel de création sont acceptées." }, "columns": { "type": "array", "maxItems": 64, "items": { "type": "string", "pattern": "^[a-z][a-z0-9_]{0,63}$" }, "description": "Colonnes à afficher, dans l'ordre transmis." }, "sort": { "type": "object", "maxProperties": 4, "propertyNames": { "pattern": "^[a-z][a-z0-9_]{0,63}$" }, "additionalProperties": true, "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, "entity_type": { "type": "string", "maxLength": 50, "minLength": 1, "title": "Entity Type", "description": "Target entity: operations, operateurs, documents" }, "is_default": { "type": "boolean", "title": "Is Default", "description": "Set as default view", "default": false } }, "type": "object", "required": [ "name", "entity_type" ], "title": "SavedViewCreate", "description": "État de vue limité à 16 384 octets JSON pour filters, columns et sort. Le nom est normalisé et doit rester non vide. Les allowlists operations sont contrôlées selon le type de la vue, y compris lors d'un update.", "allOf": [ { "if": { "required": [ "entity_type" ], "properties": { "entity_type": { "const": "operations", "description": "Type de ressource auquel se rapporte la vue ou le traitement." } } }, "then": { "properties": { "filters": { "propertyNames": { "enum": [ "classe_actif", "cycle_interne", "operateur_id", "preset", "search", "statut", "statut_interne", "statut_operationnel", "type_investissement" ] }, "description": "Filtres enregistrés pour la vue, le dashboard ou le template." }, "columns": { "items": { "type": "string", "enum": [ "activity_level", "classe_actif", "completeness", "completeness_bar", "completeness_score", "created_at", "created_year", "data_quality", "date_debut_financement", "date_echeance", "date_echeance_contractuelle", "date_echeance_prorogee", "date_investissement", "date_sortie_effective", "date_sortie_previsionnelle", "days_since_update", "dscr", "duree_initiale_mois", "duree_reelle_mois", "ecart_horizon_investissement_mois", "encours", "fond_name", "horizon_contractuel_mois", "horizon_investissement_actualise_mois", "icr", "id", "intervenant_nom", "lifecycle_state", "ltv", "montant_nominal", "montant_total_investi", "montant_total_remonte", "name", "operateur_nom", "perte_latente", "phase", "phase_group", "responsable_interne", "retard_mois", "risk_bucket", "risk_grade", "risk_score", "spv_name", "status", "status_label", "statut_interne", "statut_operationnel", "tri_operation", "type_investissement", "type_operation", "updated_at", "updated_month", "updated_year", "version", "version_label", "visuel" ] }, "description": "Colonnes à afficher, dans l'ordre transmis." }, "sort": { "type": "object", "additionalProperties": false, "properties": { "sort_by": { "type": "string", "enum": [ "classe_actif", "created_at", "date_investissement", "date_sortie_effective", "date_sortie_previsionnelle", "name", "phase", "risk_score", "status", "updated_at" ], "description": "Clé de la colonne utilisée pour le tri de la vue." }, "sort_order": { "type": "string", "enum": [ "asc", "desc" ], "description": "Position de la tâche dans le board de son opération." } }, "description": "Critères de tri enregistrés pour la vue." } } } } ] }, "SavedViewResponse": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "user_id": { "type": "string", "title": "User Id", "description": "Identifiant utilisateur MARKO; il n'est pas nécessairement un UUID." }, "entity_type": { "type": "string", "title": "Entity Type", "description": "Type de ressource auquel se rapporte la vue ou le traitement." }, "name": { "type": "string", "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "icon": { "type": "string", "title": "Icon", "default": "bookmark", "description": "Icône d'affichage de la vue sauvegardée; respecter la liste de valeurs autorisées." }, "color": { "type": "string", "title": "Color", "default": "slate", "description": "Couleur d'affichage; respecter les valeurs ou le format indiqués dans le schéma." }, "filters": { "additionalProperties": true, "type": "object", "title": "Filters", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, "columns": { "items": { "type": "string" }, "type": "array", "title": "Columns", "description": "Colonnes à afficher, dans l'ordre transmis." }, "sort": { "additionalProperties": true, "type": "object", "title": "Sort", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, "is_default": { "type": "boolean", "title": "Is Default", "description": "Indique si cette vue ou ce template est défini par défaut." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "title": "Updated At", "description": "Date de dernière modification au format ISO 8601." } }, "type": "object", "required": [ "id", "user_id", "entity_type", "name", "filters", "columns", "sort", "is_default", "created_at", "updated_at" ], "title": "SavedViewResponse", "description": "Response for a single saved view." }, "SavedViewUpdate": { "properties": { "name": { "anyOf": [ { "type": "string", "maxLength": 200, "minLength": 1 }, { "type": "null" } ], "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "icon": { "anyOf": [ { "type": "string", "enum": [ "bookmark", "briefcase", "building", "calendar", "chart", "clock", "filter", "flag", "shield", "star", "table", "target" ] }, { "type": "null" } ], "description": "Icône d'affichage de la vue sauvegardée; respecter la liste de valeurs autorisées." }, "color": { "anyOf": [ { "type": "string", "enum": [ "amber", "cyan", "emerald", "rose", "slate", "violet" ] }, { "type": "null" } ], "description": "Couleur d'affichage; respecter les valeurs ou le format indiqués dans le schéma." }, "filters": { "anyOf": [ { "type": "object", "maxProperties": 24, "propertyNames": { "pattern": "^[a-z][a-z0-9_]{0,63}$" }, "additionalProperties": true, "description": "État de filtre; pour une vue operations, seules les clés décrites par le contrat conditionnel de création sont acceptées." }, { "type": "null" } ], "description": "Filtres enregistrés pour la vue, le dashboard ou le template." }, "columns": { "anyOf": [ { "type": "array", "maxItems": 64, "items": { "type": "string", "pattern": "^[a-z][a-z0-9_]{0,63}$" } }, { "type": "null" } ], "description": "Colonnes à afficher, dans l'ordre transmis." }, "sort": { "anyOf": [ { "type": "object", "maxProperties": 4, "propertyNames": { "pattern": "^[a-z][a-z0-9_]{0,63}$" }, "additionalProperties": true, "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "description": "Critères de tri enregistrés pour la vue." }, "is_default": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Is Default", "description": "Indique si cette vue ou ce template est défini par défaut." } }, "type": "object", "title": "SavedViewUpdate", "description": "État de vue limité à 16 384 octets JSON pour filters, columns et sort. Le nom est normalisé et doit rester non vide. Les allowlists operations sont contrôlées selon le type de la vue, y compris lors d'un update." }, "SearchResponse": { "properties": { "query": { "type": "string", "title": "Query", "description": "Texte de recherche reçu par le service." }, "groups": { "items": { "$ref": "#/components/schemas/SearchResultGroup" }, "type": "array", "title": "Groups", "description": "Résultats de recherche regroupés par type de ressource." }, "total": { "type": "integer", "title": "Total", "description": "Nombre total de résultats correspondant aux filtres." } }, "type": "object", "required": [ "query", "groups", "total" ], "title": "SearchResponse" }, "SearchResultGroup": { "properties": { "type": { "type": "string", "title": "Type", "description": "Type de la ressource trouvée ou du groupe de résultats." }, "label": { "type": "string", "title": "Label", "description": "Libellé à afficher pour cette option, ce groupe ou ce preset." }, "results": { "items": { "$ref": "#/components/schemas/SearchResultItem" }, "type": "array", "title": "Results", "description": "Résultats de recherche accessibles dans ce périmètre." }, "total": { "type": "integer", "title": "Total", "description": "Nombre total de résultats correspondant aux filtres." } }, "type": "object", "required": [ "type", "label", "results", "total" ], "title": "SearchResultGroup" }, "SearchResultItem": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "type": { "type": "string", "enum": [ "operation", "operateur", "spv", "fond", "document" ], "title": "Type", "description": "Type de la ressource trouvée ou du groupe de résultats." }, "name": { "type": "string", "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "subtitle": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Subtitle", "description": "Informations secondaires à afficher sous le titre du résultat de recherche." }, "url": { "type": "string", "title": "Url", "description": "Lien vers la fiche de la ressource trouvée dans MARKO." } }, "type": "object", "required": [ "id", "type", "name", "url" ], "title": "SearchResultItem" }, "SpvContentieuxItem-Input": { "properties": { "id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Id", "description": "Identifiant MARKO de la ressource." }, "date_creation": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date Creation", "description": "Date de création de la société, du fonds ou du dossier; distincte de created_at dans MARKO." }, "provision": { "anyOf": [ { "type": "number" }, { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Provision", "description": "Provision déclarée pour le contentieux." }, "montant_demande": { "anyOf": [ { "type": "number" }, { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Montant Demande", "description": "Montant réclamé dans le contentieux." }, "position": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Position", "description": "Position de la société dans le contentieux." }, "partie_adverse": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Partie Adverse", "description": "Partie adverse dans le contentieux." }, "cabinet_avocat": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Cabinet Avocat", "description": "Cabinet d'avocats chargé du contentieux." }, "juridiction": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Juridiction", "description": "Juridiction compétente pour le contentieux." }, "nature": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Nature", "description": "Nature du contentieux." }, "detail": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Detail", "description": "Informations détaillées sur le problème ou le dossier." }, "document_ids": { "items": { "type": "string", "format": "uuid" }, "type": "array", "maxItems": 20, "title": "Document Ids", "description": "UUID des pièces associées au contentieux." } }, "type": "object", "title": "SpvContentieuxItem" }, "SpvContentieuxItem-Output": { "properties": { "id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Id", "description": "Identifiant MARKO de la ressource." }, "date_creation": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date Creation", "description": "Date de création de la société, du fonds ou du dossier; distincte de created_at dans MARKO." }, "provision": { "anyOf": [ { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Provision", "description": "Provision déclarée pour le contentieux." }, "montant_demande": { "anyOf": [ { "type": "string", "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" } ], "title": "Montant Demande", "description": "Montant réclamé dans le contentieux." }, "position": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Position", "description": "Position de la société dans le contentieux." }, "partie_adverse": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Partie Adverse", "description": "Partie adverse dans le contentieux." }, "cabinet_avocat": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Cabinet Avocat", "description": "Cabinet d'avocats chargé du contentieux." }, "juridiction": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Juridiction", "description": "Juridiction compétente pour le contentieux." }, "nature": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Nature", "description": "Nature du contentieux." }, "detail": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Detail", "description": "Informations détaillées sur le problème ou le dossier." }, "document_ids": { "items": { "type": "string", "format": "uuid" }, "type": "array", "maxItems": 20, "title": "Document Ids", "description": "UUID des pièces associées au contentieux." } }, "type": "object", "title": "SpvContentieuxItem" }, "TemplateColumn": { "properties": { "field": { "type": "string", "maxLength": 100, "title": "Field", "description": "Nom du champ source" }, "label": { "type": "string", "maxLength": 200, "title": "Label", "description": "Libelle affiche" }, "width": { "anyOf": [ { "type": "integer", "maximum": 500.0, "minimum": 20.0 }, { "type": "null" } ], "title": "Width", "description": "Largeur en px" }, "format": { "anyOf": [ { "type": "string", "maxLength": 50 }, { "type": "null" } ], "title": "Format", "description": "Format d'affichage: text, number, currency, percent, date" } }, "type": "object", "required": [ "field", "label" ], "title": "TemplateColumn", "description": "Definition d'une colonne dans un template de reporting." }, "TemplateFilters": { "properties": { "status": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Status", "description": "Limiter le reporting aux opérations de ce statut." }, "classe_actif": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Classe Actif", "description": "Classe d'actif de l'opération. Pour une écriture externe, consulter la dimension asset_class de GET /taxonomies." }, "spv_ids": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Spv Ids", "description": "UUID des SPV à inclure dans le périmètre." }, "fond_ids": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Fond Ids", "description": "UUID des fonds à inclure dans le périmètre." } }, "type": "object", "title": "TemplateFilters", "description": "Filtres appliques lors de la generation du rapport." }, "ThirdPartyRiskCreate": { "properties": { "operateur_id": { "type": "string", "format": "uuid", "title": "Operateur Id", "description": "UUID MARKO de l'opérateur." }, "source": { "$ref": "#/components/schemas/ThirdPartyRiskSource", "default": "manual", "description": "Origine de l'événement de risque concernant l'opérateur." }, "event_type": { "type": "string", "maxLength": 100, "title": "Event Type", "description": "Event type: procedure_collective, privilege, nantissement, etc." }, "severity": { "$ref": "#/components/schemas/ThirdPartyRiskSeverity", "default": "info", "description": "Niveau de gravité de l'événement, distinct de son statut de traitement." }, "title": { "type": "string", "maxLength": 500, "title": "Title", "description": "Titre affiché pour l'événement ou le problème." }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Description", "description": "Description libre de la ressource." }, "raw_data": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Raw Data", "description": "Données de l'événement fournies par sa source, avec une structure propre au fournisseur." }, "detected_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Detected At", "description": "Date de détection de l'événement de risque." }, "risk_score_impact": { "anyOf": [ { "type": "number", "maximum": 100.0, "minimum": -100.0 }, { "type": "null" } ], "title": "Risk Score Impact", "description": "Contribution de l'événement au score de risque." } }, "type": "object", "required": [ "operateur_id", "event_type", "title" ], "title": "ThirdPartyRiskCreate", "description": "Create a third-party risk event manually." }, "ThirdPartyRiskResolve": { "properties": { "resolved_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Resolved At", "description": "Date de résolution de l'événement, du commentaire ou du conflit." } }, "type": "object", "title": "ThirdPartyRiskResolve", "description": "Mark a third-party risk event as resolved." }, "ThirdPartyRiskResponse": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "operateur_id": { "type": "string", "format": "uuid", "title": "Operateur Id", "description": "UUID MARKO de l'opérateur." }, "source": { "type": "string", "title": "Source", "description": "Origine de l'événement de risque concernant l'opérateur." }, "provider_event_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Provider Event Id", "description": "Identifiant de l'événement dans le système du fournisseur." }, "event_type": { "type": "string", "title": "Event Type", "description": "Type de l'événement." }, "severity": { "type": "string", "title": "Severity", "description": "Niveau de gravité de l'événement, distinct de son statut de traitement." }, "title": { "type": "string", "title": "Title", "description": "Titre affiché pour l'événement ou le problème." }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Description", "description": "Description libre de la ressource." }, "raw_data": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Raw Data", "description": "Données de l'événement fournies par sa source, avec une structure propre au fournisseur." }, "detected_at": { "type": "string", "format": "date-time", "title": "Detected At", "description": "Date de détection de l'événement de risque." }, "resolved_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Resolved At", "description": "Date de résolution de l'événement, du commentaire ou du conflit." }, "risk_score_impact": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Risk Score Impact", "description": "Contribution de l'événement au score de risque." }, "is_resolved": { "type": "boolean", "title": "Is Resolved", "default": false, "description": "Indique si le commentaire ou l'événement de risque est résolu." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "title": "Updated At", "description": "Date de dernière modification au format ISO 8601." } }, "type": "object", "required": [ "id", "operateur_id", "source", "event_type", "severity", "title", "detected_at", "created_at", "updated_at" ], "title": "ThirdPartyRiskResponse", "description": "Response schema for a single third-party risk event." }, "ThirdPartyRiskSeverity": { "type": "string", "enum": [ "info", "warning", "critical" ], "title": "ThirdPartyRiskSeverity", "description": "Severity level of a third-party risk event." }, "ThirdPartyRiskSource": { "type": "string", "enum": [ "pappers", "bodacc", "infogreffe", "manual" ], "title": "ThirdPartyRiskSource", "description": "Source of the third-party risk event." }, "ThirdPartyRiskSummary": { "properties": { "operateur_id": { "type": "string", "format": "uuid", "title": "Operateur Id", "description": "UUID MARKO de l'opérateur." }, "total_events": { "type": "integer", "title": "Total Events", "default": 0, "description": "Nombre total d'événements de risque du périmètre." }, "active_events": { "type": "integer", "title": "Active Events", "default": 0, "description": "Nombre d'événements de risque encore ouverts." }, "resolved_events": { "type": "integer", "title": "Resolved Events", "default": 0, "description": "Nombre d'événements de risque résolus." }, "critical_count": { "type": "integer", "title": "Critical Count", "default": 0, "description": "Nombre d'éléments classés critiques dans ce groupe." }, "warning_count": { "type": "integer", "title": "Warning Count", "default": 0, "description": "Nombre d'événements de risque en niveau d'avertissement." }, "info_count": { "type": "integer", "title": "Info Count", "default": 0, "description": "Nombre d'événements de risque informatifs." }, "risk_score": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Risk Score", "description": "Score de risque calculé pour la ressource." }, "risk_label": { "type": "string", "title": "Risk Label", "default": "Indisponible", "description": "Libellé du niveau de risque agrégé." }, "sources": { "items": { "type": "string" }, "type": "array", "title": "Sources", "description": "Sources des événements de risque inclus dans la synthèse." }, "latest_event_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Latest Event At", "description": "Date du dernier événement de risque connu." } }, "type": "object", "required": [ "operateur_id" ], "title": "ThirdPartyRiskSummary", "description": "Aggregated risk summary for an operateur." }, "UnreadCountResponse": { "properties": { "count": { "type": "integer", "title": "Count", "description": "Nombre de notifications non lues." }, "has_critical": { "type": "boolean", "title": "Has Critical", "description": "Indique si au moins une notification critique non lue existe." }, "support_badge_count": { "type": "integer", "title": "Support Badge Count", "default": 0, "description": "Compteur du badge de support pour cet utilisateur." } }, "type": "object", "required": [ "count", "has_critical" ], "title": "UnreadCountResponse" }, "UserAlertPreferenceBase": { "properties": { "alert_type": { "type": "string", "maxLength": 50, "minLength": 1, "title": "Alert Type", "description": "Type d'alerte auquel cette préférence s'applique." }, "enabled": { "type": "boolean", "title": "Enabled", "default": true, "description": "Indique si cette définition est activée." }, "min_severity": { "type": "string", "title": "Min Severity", "default": "info", "description": "Gravité minimale des alertes pour lesquelles la préférence s'applique." } }, "type": "object", "required": [ "alert_type" ], "title": "UserAlertPreferenceBase" }, "UserAlertPreferenceResponse": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "user_id": { "type": "string", "title": "User Id", "description": "Identifiant utilisateur MARKO; il n'est pas nécessairement un UUID." }, "alert_type": { "type": "string", "title": "Alert Type", "description": "Type d'alerte auquel cette préférence s'applique." }, "enabled": { "type": "boolean", "title": "Enabled", "description": "Indique si cette définition est activée." }, "min_severity": { "type": "string", "title": "Min Severity", "description": "Gravité minimale des alertes pour lesquelles la préférence s'applique." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "title": "Updated At", "description": "Date de dernière modification au format ISO 8601." } }, "type": "object", "required": [ "id", "user_id", "alert_type", "enabled", "min_severity", "created_at", "updated_at" ], "title": "UserAlertPreferenceResponse" }, "UserAlertPreferenceUpdate": { "properties": { "preferences": { "items": { "$ref": "#/components/schemas/UserAlertPreferenceBase" }, "type": "array", "maxItems": 100, "title": "Preferences", "description": "Préférences de l'utilisateur délégué, limitées aux propriétés acceptées par la route." } }, "type": "object", "required": [ "preferences" ], "title": "UserAlertPreferenceUpdate", "description": "Bulk upsert payload: list of preferences." }, "UserPreferencesResponse": { "properties": { "user_id": { "type": "string", "title": "User Id", "description": "Identifiant utilisateur MARKO; il n'est pas nécessairement un UUID." }, "preferences": { "additionalProperties": true, "type": "object", "title": "Preferences", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, "alert_budget_daily": { "type": "integer", "title": "Alert Budget Daily", "description": "Maximum alerts returned by the priority feed (legacy field name; not a daily delivery throttle)", "default": 5 }, "updated_at": { "type": "string", "format": "date-time", "title": "Updated At", "description": "Date de dernière modification au format ISO 8601." } }, "type": "object", "required": [ "user_id", "preferences", "updated_at" ], "title": "UserPreferencesResponse", "description": "User preferences." }, "UserPreferencesUpdate": { "properties": { "preferences": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Preferences", "description": "Préférences de l'utilisateur délégué, limitées aux propriétés acceptées par la route." }, "alert_budget_daily": { "anyOf": [ { "type": "integer", "maximum": 50.0, "minimum": 1.0 }, { "type": "null" } ], "title": "Alert Budget Daily", "description": "Maximum alerts returned by the priority feed (1-50; legacy field name, not a daily delivery throttle)" } }, "type": "object", "title": "UserPreferencesUpdate", "description": "Update user preferences (partial merge into JSONB)." }, "UserRemovalResponse": { "properties": { "action": { "type": "string", "enum": [ "invite_cancelled", "offboarding_accepted" ], "title": "Action", "description": "Action effectuée sur le compte utilisateur." }, "status": { "type": "string", "enum": [ "completed", "in_progress", "blocked" ], "title": "Status", "description": "État du compte utilisateur ou du retrait d'accès; distinct du rôle dans l'entité." }, "privacy_case_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Privacy Case Id", "description": "UUID du dossier durable de traitement RGPD." }, "replayed": { "type": "boolean", "title": "Replayed", "default": false, "description": "Indique qu'une réponse liée à la même intention a été retrouvée et rejouée." }, "manual_review_required": { "type": "boolean", "title": "Manual Review Required", "default": false, "description": "Indique qu'une revue humaine reste nécessaire pour ce dossier ou cette action." } }, "type": "object", "required": [ "action", "status" ], "title": "UserRemovalResponse", "description": "Truthful result of invite cancellation or durable user offboarding." }, "UserResponse": { "properties": { "id": { "type": "string", "title": "Id", "description": "Identifiant MARKO de la ressource." }, "email": { "type": "string", "title": "Email", "description": "Adresse e-mail du compte utilisateur." }, "name": { "type": "string", "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "first_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "First Name", "description": "Prénom de l'utilisateur." }, "last_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Last Name", "description": "Nom de famille de l'utilisateur." }, "image": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Image", "description": "Image de profil de l'utilisateur, si elle est renseignée." }, "role": { "type": "string", "title": "Role", "default": "client", "description": "Rôle du compte utilisateur dans l'entité." }, "status": { "type": "string", "title": "Status", "default": "pending", "description": "État du compte utilisateur ou du retrait d'accès; distinct du rôle dans l'entité." }, "entity_slug": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Entity Slug", "description": "Entité à laquelle l'intégration est rattachée." }, "email_verified": { "type": "boolean", "title": "Email Verified", "default": false, "description": "Indique si l'adresse e-mail du compte a été vérifiée." }, "approved_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Approved At", "description": "Date d'approbation du compte utilisateur." }, "approved_by": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Approved By", "description": "Identifiant de l'utilisateur qui a approuvé ce compte." }, "invitation_expires_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Invitation Expires At", "description": "Date d'expiration de l'invitation du compte." }, "invitation_delivery": { "anyOf": [ { "$ref": "#/components/schemas/InvitationDeliveryResponse" }, { "type": "null" } ], "description": "Résultat de l'envoi de l'invitation; la création du compte ne garantit pas la livraison de l'e-mail." }, "created_at": { "type": "string", "format": "date-time", "title": "Created At", "description": "Date de création au format ISO 8601." }, "updated_at": { "type": "string", "format": "date-time", "title": "Updated At", "description": "Date de dernière modification au format ISO 8601." }, "is_pending_invite": { "type": "boolean", "title": "Is Pending Invite", "readOnly": true, "description": "Indique si l'utilisateur doit encore activer son invitation." } }, "type": "object", "required": [ "id", "email", "name", "created_at", "updated_at", "is_pending_invite" ], "title": "UserResponse", "description": "Public user representation." }, "UserUpdate": { "properties": { "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "first_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "First Name", "description": "Prénom de l'utilisateur." }, "last_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Last Name", "description": "Nom de famille de l'utilisateur." } }, "type": "object", "title": "UserUpdate", "description": "Fields a user can update on their own profile." }, "WorkflowDefinition": { "type": "object", "properties": { "id": { "type": "string", "description": "Clé du workflow, pas nécessairement un UUID." }, "name": { "type": "string", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "description": { "type": "string", "description": "Description libre de la ressource." }, "type": { "type": "string", "description": "Famille de traitement de cette définition de workflow." }, "schedule": { "type": "string", "description": "Planification actuelle du workflow." }, "enabled": { "type": "boolean", "description": "Indique si cette définition est activée." }, "custom": { "type": "boolean", "description": "Indique si le workflow est une définition personnalisée." }, "editable": { "type": "boolean", "description": "Indique si cette définition de workflow peut être modifiée." }, "deletable": { "type": "boolean", "description": "Indique si cette définition de workflow peut être supprimée." }, "toggleable": { "type": "boolean", "description": "Indique si cette définition de workflow peut être activée ou désactivée." }, "source": { "type": "string", "description": "Origine de cette définition de workflow; distingue les workflows système des workflows personnalisés." }, "scope": { "type": "string", "description": "Périmètre métier couvert par le workflow; distinct des scopes d'autorisation de la clé API." }, "impact": { "type": "string", "description": "Indication de l'effet métier attendu du preset." }, "job_types": { "type": "array", "items": { "type": "string" }, "description": "Types de traitements associés à cette définition de workflow." }, "preset_key": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Clé du preset de workflow; utiliser une valeur du catalogue de presets." }, "status": { "type": "string", "description": "État de la définition de workflow: draft, active, inactive ou error. Distinct du résultat d'une exécution." }, "schedule_kind": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Mode de planification: utiliser une valeur du catalogue de presets." }, "schedule_config": { "type": "object", "additionalProperties": true, "description": "Objet JSON métier; les clés dépendent de la source ou du preset." }, "config": { "type": "object", "additionalProperties": true, "description": "Objet JSON métier; les clés dépendent de la source ou du preset." }, "last_run_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de la dernière exécution du workflow." }, "next_run_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de la prochaine exécution planifiée, si elle existe." }, "last_error": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Dernière erreur enregistrée pour cette définition de workflow." } }, "required": [ "id", "name", "description", "type", "schedule", "enabled", "custom", "editable", "deletable", "toggleable", "source", "scope", "impact", "job_types", "preset_key", "status", "schedule_kind", "schedule_config", "config", "last_run_at", "next_run_at", "last_error" ] }, "WorkflowDefinitionCreate": { "properties": { "name": { "type": "string", "maxLength": 200, "minLength": 1, "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "description": { "type": "string", "maxLength": 1000, "title": "Description", "default": "", "description": "Description libre de la ressource." }, "preset_key": { "anyOf": [ { "type": "string", "maxLength": 80 }, { "type": "null" } ], "title": "Preset Key", "description": "Clé du preset de workflow; utiliser une valeur du catalogue de presets." }, "schedule_kind": { "anyOf": [ { "type": "string", "maxLength": 20 }, { "type": "null" } ], "title": "Schedule Kind", "description": "Mode de planification: utiliser une valeur du catalogue de presets." }, "schedule_config": { "additionalProperties": true, "type": "object", "title": "Schedule Config", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, "config": { "additionalProperties": true, "type": "object", "title": "Config", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, "enabled": { "type": "boolean", "title": "Enabled", "default": true, "description": "Indique si cette définition est activée." }, "recommendation_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Recommendation Id", "description": "UUID de la recommandation persistée à l'origine de cette définition; ne pas fournir un identifiant preview." } }, "type": "object", "required": [ "name" ], "title": "WorkflowDefinitionCreate", "description": "Create one tenant-scoped custom workflow definition." }, "WorkflowDefinitionUpdate": { "properties": { "name": { "anyOf": [ { "type": "string", "maxLength": 200, "minLength": 1 }, { "type": "null" } ], "title": "Name", "description": "Nom de la ressource. Les recherches exactes et partielles sont décrites au niveau de la route." }, "description": { "anyOf": [ { "type": "string", "maxLength": 1000 }, { "type": "null" } ], "title": "Description", "description": "Description libre de la ressource." }, "preset_key": { "anyOf": [ { "type": "string", "maxLength": 80 }, { "type": "null" } ], "title": "Preset Key", "description": "Clé du preset de workflow; utiliser une valeur du catalogue de presets." }, "schedule_kind": { "anyOf": [ { "type": "string", "maxLength": 20 }, { "type": "null" } ], "title": "Schedule Kind", "description": "Mode de planification: utiliser une valeur du catalogue de presets." }, "schedule_config": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Schedule Config", "description": "Paramètres de planification du workflow pour le schedule_kind choisi." }, "config": { "anyOf": [ { "additionalProperties": true, "type": "object", "description": "Objet JSON extensible. Les types des valeurs sont indiqués par additionalProperties lorsque la route les contraint." }, { "type": "null" } ], "title": "Config", "description": "Configuration métier du workflow." }, "enabled": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "title": "Enabled", "description": "Indique si cette définition est activée." } }, "type": "object", "title": "WorkflowDefinitionUpdate", "description": "Schema to update a custom workflow definition." }, "WorkflowHistoryPage": { "type": "object", "properties": { "items": { "type": "array", "items": { "anyOf": [ { "$ref": "#/components/schemas/WorkflowRun" }, { "$ref": "#/components/schemas/ProcessingJobHistoryItem" } ] }, "description": "Résultats de la page courante." }, "total": { "type": "integer", "description": "Nombre total de résultats correspondant aux filtres." }, "limit": { "type": "integer", "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, "offset": { "type": "integer", "description": "Nombre de résultats à ignorer avant cette page (commence à 0)." } }, "required": [ "items", "total", "limit", "offset" ] }, "WorkflowPreset": { "type": "object", "properties": { "key": { "type": "string", "description": "Clé stable du preset ou du groupe de recommandations." }, "label": { "type": "string", "description": "Libellé à afficher pour cette option, ce groupe ou ce preset." }, "type": { "type": "string", "description": "Famille de traitement proposée par le preset." }, "scope": { "type": "string", "description": "Types de périmètres métier sur lesquels ce preset peut être utilisé." }, "impact": { "type": "string", "description": "Indication de l'effet métier attendu du preset." }, "default_schedule_kind": { "type": "string", "description": "Mode de planification proposé par défaut pour ce preset." }, "default_schedule_config": { "type": "object", "additionalProperties": true, "description": "Objet JSON métier; les clés dépendent de la source ou du preset." }, "config_defaults": { "type": "object", "additionalProperties": true, "description": "Objet JSON métier; les clés dépendent de la source ou du preset." }, "fields": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "description": "Clé du paramètre de configuration du preset." }, "label": { "type": "string", "description": "Libellé du paramètre à afficher." }, "type": { "type": "string", "description": "Type de contrôle ou de valeur proposé pour ce paramètre." }, "required": { "type": "boolean", "description": "Indique si ce paramètre est obligatoire pour configurer le preset." }, "placeholder": { "type": "string", "description": "Texte d'aide affiché dans un champ de saisie vide." }, "help": { "type": "string", "description": "Explication du paramètre de configuration." }, "options": { "type": "array", "items": { "type": "object", "properties": { "value": { "type": "string", "description": "Valeur de configuration associée au choix." }, "label": { "type": "string", "description": "Libellé du paramètre à afficher." } }, "required": [ "value", "label" ] }, "description": "Choix proposés pour ce paramètre." } }, "required": [ "key", "label", "type", "required" ] }, "description": "Champs configurables proposés par le preset." } }, "required": [ "key", "label", "type", "scope", "impact", "default_schedule_kind", "default_schedule_config", "config_defaults", "fields" ] }, "WorkflowRecommendation": { "type": "object", "properties": { "id": { "type": "string", "description": "UUID après matérialisation; identifiant preview-* dans une prévisualisation." }, "scope_type": { "type": "string", "description": "Périmètre auquel la recommandation ou l'objet se rapporte." }, "scope_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "description": "Identifiant de la ressource du périmètre; il peut être absent pour le périmètre entité." }, "bundle_key": { "type": "string", "description": "Clé du groupe de recommandations à matérialiser." }, "bundle_label": { "type": "string", "description": "Libellé du groupe de recommandations." }, "workflow_key": { "type": "string", "description": "Clé du workflow proposé dans le groupe de recommandations." }, "workflow_label": { "type": "string", "description": "Nom du workflow proposé par la recommandation." }, "workflow_type": { "type": "string", "description": "Type de traitement du workflow proposé." }, "title": { "type": "string", "description": "Titre affiché pour l'événement ou le problème." }, "description": { "type": "string", "description": "Description libre de la ressource." }, "expected_impact": { "type": "string", "description": "Effet métier attendu de la recommandation." }, "score": { "type": "number", "description": "Score de classement de la recommandation." }, "confidence": { "type": "number", "description": "Confiance associée à la recommandation, distincte de son score de classement." }, "priority": { "type": "string", "enum": [ "critical", "recommended", "optional" ], "description": "Priorité de l'élément; les valeurs acceptées figurent dans le schéma." }, "priority_label": { "type": "string", "description": "Libellé de la priorité de la recommandation." }, "reason_codes": { "type": "array", "items": { "type": "string" }, "description": "Codes des motifs ayant conduit à cette recommandation." }, "evidence": { "type": "array", "items": { "type": "object", "additionalProperties": true, "description": "Éléments de preuve spécifiques au générateur de la recommandation." }, "description": "Données utilisées pour établir la recommandation; ne constituent pas à elles seules une autorisation d'écriture." }, "prefill": { "type": "object", "additionalProperties": true, "description": "Objet JSON métier; les clés dépendent de la source ou du preset." }, "status": { "type": "string", "description": "État de la recommandation: proposed, accepted, dismissed, snoozed ou created. created indique qu'un workflow a été créé depuis cette recommandation." }, "accepted_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date d'acceptation de la demande ou de la recommandation." }, "dismissed_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date à laquelle la recommandation a été classée non pertinente." }, "snoozed_until": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date jusqu'à laquelle l'alerte ou la recommandation est reportée." }, "created_workflow_key": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Clé du workflow créé depuis la recommandation, si cette création a eu lieu." }, "workflow_created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création du workflow issu de cette recommandation." }, "feedback": { "type": "object", "additionalProperties": true, "description": "Objet JSON métier; les clés dépendent de la source ou du preset." }, "impact_metrics": { "type": "object", "additionalProperties": true, "description": "Objet JSON métier; les clés dépendent de la source ou du preset." }, "note": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Commentaire associé à la décision sur la recommandation." } }, "required": [ "id", "scope_type", "scope_id", "bundle_key", "bundle_label", "workflow_key", "workflow_label", "workflow_type", "title", "description", "expected_impact", "score", "confidence", "priority", "priority_label", "reason_codes", "evidence", "prefill", "status", "feedback", "impact_metrics" ] }, "WorkflowRecommendationDecisionRequest": { "properties": { "note": { "anyOf": [ { "type": "string", "maxLength": 1000 }, { "type": "null" } ], "title": "Note", "description": "Commentaire associé à la décision sur la recommandation." }, "reason": { "anyOf": [ { "type": "string", "maxLength": 255 }, { "type": "null" } ], "title": "Reason", "description": "Motif donné pour la décision sur la recommandation." } }, "type": "object", "title": "WorkflowRecommendationDecisionRequest" }, "WorkflowRecommendationMaterializeRequest": { "properties": { "scope_type": { "type": "string", "maxLength": 20, "title": "Scope Type", "default": "entity", "description": "Périmètre auquel la recommandation ou l'objet se rapporte." }, "scope_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Scope Id", "description": "Identifiant de la ressource du périmètre; il peut être absent pour le périmètre entité." }, "bundle_key": { "type": "string", "maxLength": 50, "minLength": 1, "title": "Bundle Key", "description": "Clé du groupe de recommandations à matérialiser." }, "workflow_key": { "type": "string", "maxLength": 100, "minLength": 1, "title": "Workflow Key", "description": "Clé du workflow proposé dans le groupe de recommandations." } }, "type": "object", "required": [ "bundle_key", "workflow_key" ], "title": "WorkflowRecommendationMaterializeRequest" }, "WorkflowRecommendationPreviewRequest": { "properties": { "scope_type": { "type": "string", "maxLength": 20, "title": "Scope Type", "default": "entity", "description": "Périmètre auquel la recommandation ou l'objet se rapporte." }, "scope_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Scope Id", "description": "Identifiant de la ressource du périmètre; il peut être absent pour le périmètre entité." }, "only_high_priority": { "type": "boolean", "title": "Only High Priority", "default": false, "description": "Limiter aux recommandations de priorité élevée." }, "include_dismissed": { "type": "boolean", "title": "Include Dismissed", "default": false, "description": "Inclure les recommandations classées comme non pertinentes." } }, "type": "object", "title": "WorkflowRecommendationPreviewRequest" }, "WorkflowRecommendationSnoozeRequest": { "properties": { "note": { "anyOf": [ { "type": "string", "maxLength": 1000 }, { "type": "null" } ], "title": "Note", "description": "Commentaire associé à la décision sur la recommandation." }, "days": { "anyOf": [ { "type": "integer", "maximum": 90.0, "minimum": 1.0 }, { "type": "null" } ], "title": "Days", "description": "Nombre de jours de report demandé pour la recommandation." }, "until": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Until", "description": "Date jusqu'à laquelle la recommandation doit être reportée." } }, "type": "object", "title": "WorkflowRecommendationSnoozeRequest" }, "WorkflowRecommendations": { "type": "object", "properties": { "scope_type": { "type": "string", "description": "Périmètre auquel la recommandation ou l'objet se rapporte." }, "scope_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "description": "Identifiant de la ressource du périmètre; il peut être absent pour le périmètre entité." }, "scope_label": { "type": "string", "description": "Nom lisible du périmètre des recommandations." }, "generated_at": { "type": "string", "format": "date-time", "description": "Date de génération des recommandations." }, "items": { "type": "array", "items": { "$ref": "#/components/schemas/WorkflowRecommendation" }, "description": "Résultats de la page courante." }, "bundles": { "type": "array", "items": { "$ref": "#/components/schemas/RecommendationBundle" }, "description": "Recommandations regroupées par thème et accompagnées de leurs compteurs." }, "kpis": { "$ref": "#/components/schemas/RecommendationKPIs", "description": "Indicateurs de suivi des recommandations, distincts des KPI financiers d'une opération." } }, "required": [ "scope_type", "scope_id", "scope_label", "generated_at", "items", "bundles", "kpis" ] }, "WorkflowRun": { "type": "object", "properties": { "id": { "type": "string", "format": "uuid", "description": "Identifiant MARKO de la ressource." }, "workflow_id": { "type": "string", "description": "Clé du workflow; certaines routes utilisent une chaîne, d'autres un UUID. Respectez le type de cette route." }, "workflow_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Nom du workflow à l'origine de l'exécution." }, "workflow_source": { "type": "string", "const": "custom", "description": "Origine du workflow à l'origine de l'exécution." }, "job_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Type de traitement exécuté par le job." }, "preset_key": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Clé du preset de workflow; utiliser une valeur du catalogue de presets." }, "status": { "type": "string", "description": "État de cette exécution de workflow; consulter error_message en cas d'échec et les dates de début et de fin." }, "entity_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Type de ressource auquel se rapporte la vue ou le traitement." }, "entity_id": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "description": "Identifiant de la ressource ciblée par le job, dont le type est donné par entity_type; ce n'est pas nécessairement l'entité administrative." }, "retry_count": { "type": "integer", "description": "Nombre de reprises enregistrées pour ce traitement." }, "error_message": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Détail de l'échec, lorsqu'il est disponible." }, "result": { "type": "object", "additionalProperties": true, "description": "Objet JSON métier; les clés dépendent de la source ou du preset." }, "created_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de création au format ISO 8601." }, "started_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de début du traitement." }, "completed_at": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "description": "Date de fin, lorsqu'une exécution ou un traitement est terminé." }, "trigger_mode": { "type": "string", "description": "Mode qui a déclenché cette exécution." } }, "required": [ "id", "workflow_id", "workflow_name", "workflow_source", "job_type", "preset_key", "status", "entity_type", "entity_id", "retry_count", "error_message", "result", "created_at", "started_at", "completed_at", "trigger_mode" ] }, "WorkflowRunAccepted": { "type": "object", "properties": { "workflow": { "$ref": "#/components/schemas/WorkflowDefinition", "description": "Workflow associé à l'exécution acceptée." }, "run": { "$ref": "#/components/schemas/WorkflowRun", "description": "Exécution créée ou retrouvée pour ce workflow." } }, "required": [ "workflow", "run" ] }, "WorkflowStats": { "type": "object", "properties": { "total": { "type": "integer", "description": "Nombre total d'exécutions de workflow dans ce périmètre." }, "completed": { "type": "integer", "description": "Nombre d'exécutions terminées." }, "failed": { "type": "integer", "description": "Nombre d'exécutions en échec." }, "running": { "type": "integer", "description": "Nombre d'exécutions en cours." }, "pending": { "type": "integer", "description": "Nombre d'exécutions en attente." }, "workflows_count": { "type": "integer", "description": "Nombre de workflows du périmètre." }, "custom_workflows_count": { "type": "integer", "description": "Nombre de workflows personnalisés du périmètre." }, "draft_workflows_count": { "type": "integer", "description": "Nombre de workflows à l'état de brouillon." }, "inactive_workflows_count": { "type": "integer", "description": "Nombre de workflows désactivés." } }, "required": [ "total", "completed", "failed", "running", "pending", "workflows_count", "custom_workflows_count", "draft_workflows_count", "inactive_workflows_count" ] } } }, "paths": { "/auth/token": { "post": { "operationId": "auth_token_exchange", "summary": "Obtenir un bearer court", "description": "Echange une cle API brute contre un bearer MARKO court. La signature HMAC-SHA256 est calculee avec la cle API brute sur le message canonique `MARKO-EXTERNAL-API-TOKEN-V1\\n{key_id}\\n{timestamp}\\n{nonce}`. Utilisez ensuite `Authorization: Bearer YOUR_BEARER_HERE` sur les endpoints metier.\n\nCette route échange la signature HMAC contre un bearer; aucun bearer préalable n'est requis. [Authentification](/authentication).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-auth-token-exchange" } ], "tags": [ "auth" ], "x-marko-route-group": "auth", "x-marko-required-scope": "", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalAPIBearerTokenResponse" }, "example": { "access_token": "YOUR_BEARER_HERE", "token_type": "Bearer", "expires_in": 900, "issued_at": "2026-04-23T10:00:00Z", "expires_at": "2026-04-23T10:15:00Z", "key_id": "YOUR_PUBLIC_KEY_ID", "environment": "live", "entity_slug": "clubfunding" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [], "x-codeSamples": [ { "lang": "Shell", "label": "cURL + OpenSSL", "source": "api_key=\"YOUR_API_KEY\"\nkey_id=\"YOUR_PUBLIC_KEY_ID\"\ntimestamp=\"$(date +%s)\"\nnonce=\"$(openssl rand -hex 16)\"\nmessage=\"$(printf 'MARKO-EXTERNAL-API-TOKEN-V1\\n%s\\n%s\\n%s' \"$key_id\" \"$timestamp\" \"$nonce\")\"\nsignature=\"$(printf \"%s\" \"$message\" | openssl dgst -sha256 -hmac \"$api_key\" -hex | awk '{print $2}')\"\n\ncurl -X POST \"https://partner-api.marko.fr/v1/auth/token\" \\\n -H \"Content-Type: application/json\" \\\n -H \"X-Request-ID: marko-auth-token\" \\\n --data \"$(printf '{\"key_id\":\"%s\",\"timestamp\":%s,\"nonce\":\"%s\",\"signature\":\"%s\"}' \"$key_id\" \"$timestamp\" \"$nonce\" \"$signature\")\"" }, { "lang": "Python", "label": "Python HMAC", "source": "import hashlib\nimport hmac\nimport secrets\nimport time\n\nimport requests\n\napi_key = \"YOUR_API_KEY\"\nkey_id = \"YOUR_PUBLIC_KEY_ID\"\ntimestamp = int(time.time())\nnonce = secrets.token_urlsafe(24)\nmessage = f\"MARKO-EXTERNAL-API-TOKEN-V1\\n{key_id}\\n{timestamp}\\n{nonce}\"\nsignature = hmac.new(api_key.encode(), message.encode(), hashlib.sha256).hexdigest()\n\nresp = requests.post(\n \"https://partner-api.marko.fr/v1/auth/token\",\n headers={\"X-Request-ID\": \"marko-auth-token\"},\n json={\n \"key_id\": key_id,\n \"timestamp\": timestamp,\n \"nonce\": nonce,\n \"signature\": signature,\n },\n timeout=30,\n)\nresp.raise_for_status()\naccess_token = resp.json()[\"access_token\"]" }, { "lang": "TypeScript", "label": "Node HMAC", "source": "import { createHmac, randomBytes } from \"node:crypto\"\n\nconst apiKey = \"YOUR_API_KEY\"\nconst keyId = \"YOUR_PUBLIC_KEY_ID\"\nconst timestamp = Math.floor(Date.now() / 1000)\nconst nonce = randomBytes(24).toString(\"base64url\")\nconst message = `MARKO-EXTERNAL-API-TOKEN-V1\\n${keyId}\\n${timestamp}\\n${nonce}`\nconst signature = createHmac(\"sha256\", apiKey).update(message).digest(\"hex\")\n\nconst response = await fetch(\"https://partner-api.marko.fr/v1/auth/token\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Request-ID\": \"marko-auth-token\",\n },\n body: JSON.stringify({\n key_id: keyId,\n timestamp,\n nonce,\n signature,\n }),\n})\n\nconst { access_token: accessToken } = await response.json()" } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalAPIBearerTokenExchangeRequest" }, "example": { "key_id": "examplekey01", "timestamp": 1776926400, "nonce": "UNIQUE_NONCE_16_CHARS", "signature": "0000000000000000000000000000000000000000000000000000000000000000" } } }, "required": true } } }, "/entity": { "get": { "operationId": "entity_get", "summary": "Recuperer la fiche de l'entite", "description": "Expose l'entite rattachee a la cle API, sans changer de contexte.\n\n**Scope requis :** `entity:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-entity-get" } ], "tags": [ "entity" ], "x-marko-route-group": "read", "x-marko-required-scope": "entity:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PublicEntityResponse" }, "example": { "id": "11111111-1111-1111-1111-111111111111", "name": "Clubfunding", "type": "client", "siren": "123456789", "mode_reporting": "trimestriel", "frequence_reporting": 3, "date_reference_reporting": "2026-03-31", "risk_threshold": 75, "zone_vacances": "A", "ai_enabled": true } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/portfolio/summary": { "get": { "operationId": "portfolio_summary", "summary": "Recuperer la synthese portefeuille", "description": "Retourne un resume portefeuille agrege pour l'entite de la cle, sans parametre de filtre. Les totaux excluent les ressources supprimees et les repartitions utilisent les codes de taxonomie effectifs.\n\n**Scope requis :** `portfolio:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-portfolio-summary" } ], "tags": [ "portfolio" ], "x-marko-route-group": "read", "x-marko-required-scope": "portfolio:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PublicPortfolioSummary" }, "example": { "total_operations": 12, "total_nominal": 24500000.0, "total_fonds": 2, "total_spvs": 5, "total_operateurs": 4, "operations_by_status": { "instruction": 10, "cloture": 2 }, "operations_by_classe_actif": { "residentiel": 8, "bureaux": 4 }, "operations_by_type_investissement": { "dette_senior": 9, "obligation_simple": 3 } } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/deals": { "get": { "operationId": "deals_list", "summary": "Lister les deals", "description": "Expose le pipeline CRM pre-closing de l'entité.\n\n**Scope requis :** `deals:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 200, "minimum": 1, "default": 20, "title": "Limit" }, "example": 20, "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, { "in": "query", "name": "offset", "required": false, "schema": { "type": "integer", "minimum": 0, "default": 0, "title": "Offset" }, "example": 0, "description": "Nombre de résultats à ignorer avant cette page (commence à 0)." }, { "in": "query", "name": "status", "required": false, "schema": { "anyOf": [ { "$ref": "#/components/schemas/DealStatus" }, { "type": "null" } ], "description": "Filter by deal status", "title": "Status" }, "example": "sourcing", "description": "Filter by deal status" }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-deals-list" } ], "tags": [ "deals" ], "x-marko-route-group": "read", "x-marko-required-scope": "deals:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedResponse_DealResponse_" }, "example": { "items": [ { "id": "11111111-1111-4111-8111-111111111111", "name": "Pipeline Demo", "status": "sourcing", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } ], "total": 1, "limit": 0, "offset": 0 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] }, "post": { "operationId": "deals_create", "summary": "Créer un deal", "description": "Crée un deal dans le pipeline pre-closing.\n\n**Scope requis :** `deals:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-deals-create" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "deals" ], "x-marko-route-group": "write", "x-marko-required-scope": "deals:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "201": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DealResponse" }, "example": { "id": "11111111-1111-4111-8111-111111111111", "name": "Pipeline Demo", "status": "sourcing", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DealCreate" }, "example": { "name": "Pipeline Demo", "status": "sourcing", "classe_actif": "immobilier" } } } } } }, "/deals/{deal_id}": { "get": { "operationId": "deals_get", "summary": "Récupérer un deal", "description": "Retourne un deal unitaire du pipeline.\n\n**Scope requis :** `deals:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "deal_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Deal Id" }, "example": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "description": "Paramètre deal_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-deals-get" } ], "tags": [ "deals" ], "x-marko-route-group": "read", "x-marko-required-scope": "deals:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DealResponse" }, "example": { "id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "name": "Pipeline Demo", "status": "sourcing", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] }, "put": { "operationId": "deals_update", "summary": "Mettre à jour un deal", "description": "Met à jour un deal existant du pipeline.\n\n**Scope requis :** `deals:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "deal_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Deal Id" }, "example": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "description": "Paramètre deal_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-deals-update" } ], "tags": [ "deals" ], "x-marko-route-group": "write", "x-marko-required-scope": "deals:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DealResponse" }, "example": { "id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "name": "Exemple MARKO", "status": "closing", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DealUpdate" }, "example": { "status": "closing", "responsable": "Team Origination" } } } } }, "delete": { "operationId": "deals_delete", "summary": "Supprimer un deal", "description": "Supprime logiquement un deal du pipeline.\n\n**Scope requis :** `deals:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "deal_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Deal Id" }, "example": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "description": "Paramètre deal_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-deals-delete" } ], "tags": [ "deals" ], "x-marko-route-group": "write", "x-marko-required-scope": "deals:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "204": { "description": "Successful response" }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/deals/{deal_id}/notes": { "get": { "operationId": "deals_notes_list", "summary": "Lister les notes d'un deal", "description": "Expose les notes attachées à un deal.\n\n**Scope requis :** `deals:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "deal_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Deal Id" }, "example": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "description": "Paramètre deal_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 200, "minimum": 1, "default": 20, "title": "Limit" }, "example": 20, "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, { "in": "query", "name": "offset", "required": false, "schema": { "type": "integer", "minimum": 0, "default": 0, "title": "Offset" }, "example": 0, "description": "Nombre de résultats à ignorer avant cette page (commence à 0)." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-deals-notes-list" } ], "tags": [ "deals" ], "x-marko-route-group": "read", "x-marko-required-scope": "deals:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedResponse_DealNoteResponse_" }, "example": { "items": [ { "id": "11111111-1111-4111-8111-111111111111", "deal_id": "11111111-1111-4111-8111-111111111111", "author_name": "example", "content": "Rendez-vous sponsor", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } ], "total": 1, "limit": 0, "offset": 0 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] }, "post": { "operationId": "deals_notes_create", "summary": "Créer une note de deal", "description": "Ajoute une note sur un deal du pipeline.\n\n**Scope requis :** `deals:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).", "parameters": [ { "in": "path", "name": "deal_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Deal Id" }, "example": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "description": "Paramètre deal_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-deals-notes-create" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "deals" ], "x-marko-route-group": "write", "x-marko-required-scope": "deals:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "201": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DealNoteResponse" }, "example": { "id": "11111111-1111-4111-8111-111111111111", "deal_id": "11111111-1111-4111-8111-111111111111", "author_name": "example", "content": "Rendez-vous sponsor planifié", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DealNoteCreate" }, "example": { "content": "Rendez-vous sponsor planifié" } } } } } }, "/deal-notes/{note_id}": { "delete": { "operationId": "deals_notes_delete", "summary": "Supprimer une note de deal", "description": "Supprime une note rattachée au pipeline deals.\n\n**Scope requis :** `deals:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "note_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Note Id" }, "example": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", "description": "Paramètre note_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-deals-notes-delete" } ], "tags": [ "deals" ], "x-marko-route-group": "write", "x-marko-required-scope": "deals:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "204": { "description": "Successful response" }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/fonds": { "get": { "operationId": "fonds_list", "summary": "Lister les fonds", "description": "Retourne les fonds visibles pour l'entite de la cle, par page bornee. Les en-tetes X-Marko-Limit, X-Marko-Offset et X-Marko-Has-More decrivent la page.\n\n**Scope requis :** `fonds:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 200, "minimum": 1, "default": 50, "title": "Limit" }, "example": 50, "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, { "in": "query", "name": "offset", "required": false, "schema": { "type": "integer", "minimum": 0, "default": 0, "title": "Offset" }, "example": 0, "description": "Nombre de résultats à ignorer avant cette page (commence à 0)." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-fonds-list" } ], "tags": [ "fonds" ], "x-marko-route-group": "read", "x-marko-required-scope": "fonds:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/PublicFondItem" }, "title": "Response List Fonds Public Fonds Get" }, "example": [ { "id": "22222222-2222-2222-2222-222222222222", "name": "Clubfunding Debt I", "code": "CFD1", "status": "active", "date_creation": "2024-01-15", "date_liquidation": null } ] } }, "headers": { "X-Marko-Limit": { "schema": { "type": "integer" }, "description": "Limite appliquée à la page." }, "X-Marko-Offset": { "schema": { "type": "integer" }, "description": "Offset appliqué à la page." }, "X-Marko-Has-More": { "schema": { "type": "boolean" }, "description": "true si une page suivante existe." } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] }, "post": { "operationId": "fonds_create", "summary": "Créer un fonds", "description": "Crée un fonds d'investissement dans l'entité.\n\n**Scope requis :** `fonds:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-fonds-create" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "fonds" ], "x-marko-route-group": "write", "x-marko-required-scope": "fonds:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "201": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FondResponse" }, "example": { "name": "Clubfunding Debt II", "id": "22222222-2222-2222-2222-222222222223", "entity_id": "11111111-1111-4111-8111-111111111111", "created_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FondUpdate" }, "example": { "name": "Clubfunding Debt II", "code": "CFD2", "status": "actif" } } } } } }, "/spvs": { "get": { "operationId": "spvs_list", "summary": "Lister les SPV", "description": "Permet de rechercher un SPV par nom exact insensible a la casse via `name`, et de filtrer par fonds via `fond_id`. Le filtre par nom est un controle avant creation, pas une garantie d'unicite concurrente; conservez l'identifiant MARKO et utilisez Idempotency-Key pour les ecritures. Les en-tetes X-Marko-Limit, X-Marko-Offset et X-Marko-Has-More decrivent la page.\n\n**Scope requis :** `spvs:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "query", "name": "name", "required": false, "schema": { "anyOf": [ { "type": "string", "maxLength": 255 }, { "type": "null" } ], "description": "Exact SPV name, case-insensitive and trimmed", "title": "Name", "maxLength": 255 }, "description": "Nom exact, insensible a la casse et aux espaces peripheriques.", "example": "SPV Paris 19" }, { "in": "query", "name": "fond_id", "required": false, "schema": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Fond Id" }, "example": "22222222-2222-2222-2222-222222222222", "description": "UUID MARKO du fonds." }, { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 200, "minimum": 1, "default": 50, "title": "Limit" }, "example": 50, "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, { "in": "query", "name": "offset", "required": false, "schema": { "type": "integer", "minimum": 0, "default": 0, "title": "Offset" }, "example": 0, "description": "Nombre de résultats à ignorer avant cette page (commence à 0)." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-spvs-list" } ], "tags": [ "spvs" ], "x-marko-route-group": "read", "x-marko-required-scope": "spvs:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/PublicSPVItem" }, "title": "Response List Spvs Public Spvs Get" }, "example": [ { "id": "33333333-3333-3333-3333-333333333333", "fond_id": "22222222-2222-2222-2222-222222222222", "name": "SPV Paris 19", "siren": "987654321", "forme_juridique": "SAS", "montage": "direct", "procedure_collective": "aucune", "is_draft": false, "created_at": "2026-02-01T09:15:00Z", "updated_at": "2026-03-20T10:00:00Z" } ] } }, "headers": { "X-Marko-Limit": { "schema": { "type": "integer" }, "description": "Limite appliquée à la page." }, "X-Marko-Offset": { "schema": { "type": "integer" }, "description": "Offset appliqué à la page." }, "X-Marko-Has-More": { "schema": { "type": "boolean" }, "description": "true si une page suivante existe." } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] }, "post": { "operationId": "spvs_create", "summary": "Créer une SPV", "description": "Crée une SPV sur l'entité et le fonds ciblé. La forme juridique, le SIREN et l'adresse peuvent etre fournis des la creation. Le type d'investissement reste porte par l'operation, car une meme SPV peut en regrouper plusieurs.\n\n**Scope requis :** `spvs:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-spvs-create" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "spvs" ], "x-marko-route-group": "write", "x-marko-required-scope": "spvs:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "201": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SPVResponse" }, "example": { "name": "SPV Marseille", "siren": "123456782", "forme_juridique": "SAS", "id": "33333333-3333-3333-3333-333333333334", "entity_id": "11111111-1111-4111-8111-111111111111", "adresse": "10 rue de la Republique, 13001 Marseille", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SPVUpdate" }, "example": { "name": "SPV Marseille", "fond_id": "22222222-2222-2222-2222-222222222222", "forme_juridique": "SAS", "siren": "123456782", "adresse": "10 rue de la Republique, 13001 Marseille" } } } } } }, "/operations": { "get": { "operationId": "operations_list", "summary": "Lister les operations", "description": "Supporte la recherche par nom exact insensible a la casse, la pagination, le filtrage par statut et le filtrage par SPV. Le filtre par nom est un controle avant creation, pas une garantie d'unicite concurrente; conservez l'identifiant MARKO et utilisez external_id avec Idempotency-Key.\n\n**Scope requis :** `operations:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "query", "name": "name", "required": false, "schema": { "anyOf": [ { "type": "string", "maxLength": 255 }, { "type": "null" } ], "description": "Exact operation name, case-insensitive and trimmed", "title": "Name", "maxLength": 255 }, "description": "Nom exact, insensible a la casse et aux espaces peripheriques.", "example": "Clubfunding Demo Deal" }, { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 200, "minimum": 1, "default": 50, "title": "Limit" }, "description": "Nombre maximal d'operations retournees.", "example": 20 }, { "in": "query", "name": "offset", "required": false, "schema": { "type": "integer", "minimum": 0, "default": 0, "title": "Offset" }, "description": "Nombre d'operations a ignorer avant la page retournee.", "example": 0 }, { "in": "query", "name": "status", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Filter by operation lifecycle status. Use `active` to match sourcing, instruction, travaux, commercialisation and livraison.", "title": "Status", "maxLength": 180 }, "description": "Filter by the exact entity taxonomy code. `active` expands to the five active canonical MARKO statuses.", "example": "active" }, { "in": "query", "name": "spv_id", "required": false, "schema": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Spv Id", "format": "uuid" }, "description": "Identifiant MARKO exact du SPV rattache.", "example": "33333333-3333-3333-3333-333333333333" }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operations-list" } ], "tags": [ "operations" ], "x-marko-route-group": "read", "x-marko-required-scope": "operations:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/PublicOperationItem" }, "title": "Response List Operations Public Operations Get" }, "example": [ { "id": "44444444-4444-4444-4444-444444444444", "spv_id": "33333333-3333-3333-3333-333333333333", "relationship_status": "attached", "relationship_label": "Rattachée", "name": "Clubfunding Demo Deal", "status": "instruction", "phase": "p03_financement", "type_investissement": "dette_senior", "type_operation": "acquisition_detention", "classe_actif": "residentiel", "statut_interne": "analyse", "statut_operationnel": [ "commercialisation" ], "sous_classe_actif": "residentiel_coliving", "version": 3, "created_at": "2026-03-10T08:00:00Z", "updated_at": "2026-03-21T14:30:00Z", "financial_summary": { "montant_nominal_contractuel": 2500000, "montant_total": 2500000 }, "reporting_summary": { "mode_reporting": "trimestriel", "frequence_reporting": 3, "reporting_status": "pending", "taux_completude_reporting": 68.5 } } ] } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/operations/{operation_id}": { "get": { "operationId": "operations_get", "summary": "Recuperer une operation", "description": "Retourne le detail d'une operation par son identifiant MARKO.\n\n**Scope requis :** `operations:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "operation_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Operation Id" }, "example": "44444444-4444-4444-4444-444444444444", "description": "UUID MARKO de l'opération." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operations-get" } ], "tags": [ "operations" ], "x-marko-route-group": "read", "x-marko-required-scope": "operations:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PublicOperationItem" }, "example": { "id": "44444444-4444-4444-4444-444444444444", "spv_id": "33333333-3333-3333-3333-333333333333", "relationship_status": "attached", "relationship_label": "Rattachée", "name": "Clubfunding Demo Deal", "status": "instruction", "phase": "p03_financement", "type_investissement": "dette_senior", "type_operation": "acquisition_detention", "classe_actif": "residentiel", "statut_interne": "analyse", "statut_operationnel": [ "commercialisation" ], "sous_classe_actif": "residentiel_coliving", "version": 3, "created_at": "2026-03-10T08:00:00Z", "updated_at": "2026-03-21T14:30:00Z", "financial_summary": { "montant_nominal_contractuel": 2500000, "montant_total": 2500000 }, "reporting_summary": { "mode_reporting": "trimestriel", "frequence_reporting": 3, "reporting_status": "pending", "taux_completude_reporting": 68.5 } } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Operation not found", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Not Found", "status": 404, "detail": "Operation not found", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] }, "delete": { "operationId": "operations_delete", "summary": "Supprimer une opération", "description": "Supprime logiquement une opération existante.\n\n**Scope requis :** `operations:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "operation_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Operation Id" }, "example": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "description": "UUID MARKO de l'opération." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operations-delete" } ], "tags": [ "operations" ], "x-marko-route-group": "write", "x-marko-required-scope": "operations:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "204": { "description": "Successful response" }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/operations/external/{external_id}": { "get": { "operationId": "operations_external_get", "summary": "Récupérer une opération par identifiant externe", "description": "Résout l'identifiant stable du système partenaire et retourne immédiatement l'identifiant MARKO et la ressource courante. Les codes `custom__...` sont générés par MARKO : conservez toujours le code renvoyé au lieu de le construire.\n\n**Scope requis :** `operations:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "external_id", "required": true, "schema": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_~-][A-Za-z0-9._:~-]{0,254}$", "title": "External Id" }, "example": "CF-OP-001", "description": "Identifiant stable de votre système, dans le contexte de votre intégration." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operations-external-get" } ], "tags": [ "operations" ], "x-marko-route-group": "read", "x-marko-required-scope": "operations:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalOperationResourceResponse" }, "example": { "id": "44444444-4444-4444-4444-444444444444", "spv_id": "33333333-3333-3333-3333-333333333333", "name": "ClubFunding Demo Deal", "status": "custom__a3e08c7bde__projet_emis", "data": {}, "created_at": "2026-08-22T08:00:00Z", "updated_at": "2026-08-22T08:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] }, "put": { "operationId": "operations_upsert", "summary": "Creer ou mettre a jour une operation externe", "description": "Crée ou met à jour immédiatement une opération à partir d'un identifiant partenaire stable. La réponse contient directement marko_id. Une valeur de taxonomie inconnue est créée pour l'entité, visible immédiatement et signalée dans taxonomy_additions. Le segment généré des codes `custom__...` n'est pas prévisible : le client doit conserver le code renvoyé et le réutiliser. Une création répond 201; une mise à jour, restauration ou répétition sans changement répond 200. Les notes utilisent leur endpoint dédié; seul POST /operations/batch reste asynchrone.\n\n**Scope requis :** `operations:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).", "parameters": [ { "in": "path", "name": "external_id", "required": true, "schema": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_~-][A-Za-z0-9._:~-]{0,254}$", "title": "External Id" }, "example": "CF-OP-001", "description": "Identifiant stable de votre système, dans le contexte de votre intégration." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operations-upsert" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "operations" ], "x-marko-route-group": "import", "x-marko-required-scope": "operations:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "201": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalOperationSyncUpsertResponse" }, "example": { "external_id": "CF-OP-001", "marko_id": "44444444-4444-4444-4444-444444444444", "outcome": "created", "resource": { "id": "44444444-4444-4444-4444-444444444444", "spv_id": null, "lead_operateur_id": null, "name": "Clubfunding Demo Deal", "status": "custom__a3e08c7bde__projet_emis", "type_investissement": "dette_senior", "type_operation": "acquisition_detention", "classe_actif": "residentiel", "statut_interne": "analyse", "statut_operationnel": [ "commercialisation" ], "sous_classe_actif": "residentiel_coliving", "data": { "adresse": "12 rue de la Paix, Paris" }, "created_at": "2026-08-22T08:00:00Z", "updated_at": "2026-08-22T08:00:00Z" }, "taxonomy_additions": [ { "code": "custom__a3e08c7bde__projet_emis", "dimension": "operation_status", "display_label": "Projet émis", "source_kind": "partner", "source_display_name": "ClubFunding", "is_visible": true, "is_active": true, "position": 10000, "usage_count": 0, "label_editable": true, "canonical_code": null } ], "request_id": "req_cf_operation_upsert" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "200": { "description": "Successful response for the accompanying request example", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalOperationSyncUpsertResponse" }, "example": { "external_id": "CF-OP-001", "marko_id": "44444444-4444-4444-4444-444444444444", "outcome": "updated", "resource": { "id": "44444444-4444-4444-4444-444444444444", "spv_id": null, "lead_operateur_id": null, "name": "Clubfunding Demo Deal - Mise à jour", "status": "custom__a3e08c7bde__projet_emis", "type_investissement": "dette_senior", "type_operation": "acquisition_detention", "classe_actif": "residentiel", "statut_interne": "analyse", "statut_operationnel": [ "commercialisation" ], "sous_classe_actif": "residentiel_coliving", "data": { "adresse": "14 rue de la Paix, Paris" }, "created_at": "2026-08-22T08:00:00Z", "updated_at": "2026-08-22T09:30:00Z" }, "taxonomy_additions": [], "request_id": "req_cf_operation_update" } } }, "x-marko-request-example": { "name": "Clubfunding Demo Deal - Mise à jour", "status": "custom__a3e08c7bde__projet_emis", "type_investissement": "dette_senior", "type_operation": "acquisition_detention", "classe_actif": "residentiel", "statut_interne": "analyse", "statut_operationnel": [ "commercialisation" ], "sous_classe_actif": "residentiel_coliving", "data": { "adresse": "14 rue de la Paix, Paris" }, "kpi_snapshot": { "date_reference": "2026-07-31", "crd_total": 2400000, "valeur_venale": 3500000, "ltv": 0.6857 } } }, "404": { "description": "Existing MARKO operation or related resource not found", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Not Found", "status": 404, "detail": "Existing MARKO operation or related resource not found", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalOperationUpsertRequest" }, "example": { "name": "Clubfunding Demo Deal", "status": "Projet émis", "type_investissement": "dette_senior", "type_operation": "acquisition_detention", "classe_actif": "residentiel", "statut_interne": "analyse", "statut_operationnel": [ "commercialisation" ], "sous_classe_actif": "residentiel_coliving", "data": { "adresse": "12 rue de la Paix, Paris" }, "kpi_snapshot": { "date_reference": "2026-07-15", "crd_total": 2500000, "valeur_venale": 3400000, "ltv": 0.7353 } } } } } } }, "/taxonomies": { "get": { "operationId": "taxonomies_list", "summary": "Lister une taxonomie d'entité", "description": "Retourne les options visibles décidées par l'administrateur de l'entité. Une option courante masquée peut être demandée avec current_code afin de rester affichable sans être proposée pour une nouvelle sélection.\n\n**Scope requis :** `operations:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "query", "name": "dimension", "required": false, "schema": { "anyOf": [ { "enum": [ "operation_status", "investment_type", "operation_type", "asset_class", "internal_status", "operational_status", "follow_up_category" ], "type": "string" }, { "type": "null" } ], "title": "Dimension", "enum": [ "operation_status", "investment_type", "operation_type", "asset_class", "internal_status", "operational_status", "follow_up_category" ] }, "example": "operation_status", "description": "Paramètre dimension pour cette route; type, format et contraintes ci-dessous." }, { "in": "query", "name": "current_code", "required": false, "schema": { "anyOf": [ { "type": "string", "maxLength": 180 }, { "type": "null" } ], "title": "Current Code", "maxLength": 180 }, "description": "Code courant à inclure même s'il est masqué." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-taxonomies-list" } ], "tags": [ "taxonomies" ], "x-marko-route-group": "read", "x-marko-required-scope": "operations:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EntityTaxonomyOptionListResponse" }, "example": { "items": [ { "code": "instruction", "dimension": "operation_status", "display_label": "Instruction", "source_kind": "marko", "source_display_name": "MARKO", "is_visible": true, "is_active": true, "position": 1, "usage_count": 0, "label_editable": false, "canonical_code": "instruction" } ] } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/operations/taxonomy": { "get": { "operationId": "operations_taxonomy", "summary": "Lister le socle canonique MARKO historique", "description": "Endpoint legacy: retourne uniquement le socle canonique MARKO historique. Les écritures acceptent aussi les valeurs propres à l'entité. Utilisez `GET /v1/taxonomies?dimension=...` pour la liste visible et autoritative, y compris les options ClubFunding.\n\n**Scope requis :** `operations:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operations-taxonomy" } ], "tags": [ "operations" ], "x-marko-route-group": "read", "x-marko-required-scope": "operations:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": true, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalOperationTaxonomyResponse" }, "example": { "default_status": "sourcing", "statuses": [ { "code": "sourcing", "label": "Analyse initiale" }, { "code": "instruction", "label": "Instruction" }, { "code": "travaux", "label": "Travaux" }, { "code": "commercialisation", "label": "Commercialisation" }, { "code": "livraison", "label": "Livraison" }, { "code": "cloture", "label": "Clôture" }, { "code": "perte", "label": "Perdue" } ], "statuts_internes": [ { "code": "due_diligence", "label": "Due diligence" }, { "code": "en_cours", "label": "En cours" }, { "code": "en_recouvrement", "label": "En recouvrement" }, { "code": "analyse", "label": "Analyse" }, { "code": "comite", "label": "Comité" }, { "code": "closing", "label": "Closing" }, { "code": "sain", "label": "Sain" }, { "code": "avenant", "label": "Avenant" }, { "code": "pre_contentieux", "label": "Précontentieux" }, { "code": "contentieux_judiciaire", "label": "Contentieux judiciaire" }, { "code": "lj", "label": "LJ" }, { "code": "rj_sauvegarde", "label": "RJ ou sauvegarde" }, { "code": "procedure_preventive", "label": "Procédure préventive" }, { "code": "protocole_transactionnel", "label": "Protocole transactionnel" }, { "code": "pre_contentieux_recouvrement", "label": "Précontentieux" }, { "code": "remboursement_partiel", "label": "Sortie partielle" }, { "code": "recouvrement_partiel", "label": "Recouvrement partiel" }, { "code": "termine", "label": "Terminé" } ], "statuts_operationnels": [ { "code": "montage_et_faisabilite", "label": "Montage et faisabilité" }, { "code": "offre_foncier", "label": "Offre - Foncier" }, { "code": "promesse_unilaterale_de_vente", "label": "Promesse unilatérale de vente" }, { "code": "acquisition_du_foncier", "label": "Acquisition du foncier" }, { "code": "evictions", "label": "Évictions" }, { "code": "depot_de_la_dp", "label": "Dépôt de la DP" }, { "code": "dp_purge", "label": "DP purgé" }, { "code": "depot_du_pc", "label": "Dépôt du PC" }, { "code": "pc_purge", "label": "PC purgé" }, { "code": "depot_du_pcm", "label": "Dépôt du PCM" }, { "code": "pcm_purge", "label": "PCM purgé" }, { "code": "gfa", "label": "GFA" }, { "code": "travaux", "label": "Travaux" }, { "code": "commercialisation", "label": "Commercialisation" }, { "code": "commercialisation_locative", "label": "Commercialisation locative" }, { "code": "achevement_dat", "label": "Achèvement (DAT)" }, { "code": "livraison", "label": "Livraison / Cession d'actif" }, { "code": "leve_des_reserves", "label": "Levée des réserves" }, { "code": "suivi_du_sav", "label": "Suivi du SAV" }, { "code": "decennale", "label": "Décennale" } ] } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/operations/batch": { "post": { "operationId": "operations_batch", "summary": "Importer un lot d'operations externes", "description": "Accepte jusqu'à 500 opérations, 10 000 notes et 20 Mio par requête. Le job est durable et chaque élément possède son propre résultat. `category` dans les notes est une chaine libre de 1 a 80 caracteres.\n\n**Scope requis :** `operations:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).\n\n[Import par lot, suivi et reprise](/imports-and-notes).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operations-batch" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "operations" ], "x-marko-route-group": "import", "x-marko-required-scope": "operations:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "202": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalImportAcceptedResponse" }, "example": { "job_id": "88888888-8888-8888-8888-888888888888", "status": "accepted", "status_url": "/v1/import-jobs/88888888-8888-8888-8888-888888888888", "results_url": "/v1/import-jobs/88888888-8888-8888-8888-888888888888/items", "received_counts": { "operations": 1, "notes": 1 }, "idempotency_key": "client-nightly-2026-07-15-001", "replayed": false } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalOperationBatchRequest" }, "example": { "operations": [ { "external_id": "CF-OP-001", "name": "Clubfunding Demo Deal", "status": "instruction", "data": { "adresse": "12 rue de la Paix, Paris" }, "kpi_snapshot": { "date_reference": "2026-07-15", "crd_total": 2500000 }, "notes": [ { "external_id": "CF-NOTE-001", "date": "2026-07-15T09:30:00Z", "text": "Pièces complémentaires attendues.", "category": "call" } ] } ] } } } } } }, "/operations/external/{operation_external_id}/notes/external/{note_external_id}": { "get": { "operationId": "operations_notes_external_get", "summary": "Récupérer un suivi par identifiants externes", "description": "Retourne la note uniquement si elle appartient à l'opération externe indiquée.\n\n**Scope requis :** `operations:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "operation_external_id", "required": true, "schema": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_~-][A-Za-z0-9._:~-]{0,254}$", "title": "Operation External Id" }, "example": "CF-OP-001", "description": "Identifiant externe de l'opération, appartenant à la même intégration." }, { "in": "path", "name": "note_external_id", "required": true, "schema": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_~-][A-Za-z0-9._:~-]{0,254}$", "title": "Note External Id" }, "example": "CF-NOTE-002", "description": "Paramètre note_external_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operations-notes-external-get" } ], "tags": [ "operations" ], "x-marko-route-group": "read", "x-marko-required-scope": "operations:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalNoteResourceResponse" }, "example": { "id": "55555555-5555-5555-5555-555555555555", "operation_id": "44444444-4444-4444-4444-444444444444", "date": "2026-08-22T08:00:00Z", "category": "custom__a3e08c7bde__comite", "text": "Comité: prorogation à documenter.", "description_i18n": {}, "created_at": "2026-08-22T08:00:00Z", "updated_at": "2026-08-22T08:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] }, "put": { "operationId": "operations_notes_upsert", "summary": "Importer une note de suivi externe", "description": "Crée ou met à jour immédiatement une note historique datée sur une opération référencée par son identifiant externe. La réponse contient directement son marko_id. Une catégorie inconnue devient une option d'entité visible, avec la source partenaire. Une mise à jour versionnée doit porter un source_updated_at strictement plus récent lorsque la note en possède déjà un.\n\n**Scope requis :** `operations:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).", "parameters": [ { "in": "path", "name": "operation_external_id", "required": true, "schema": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_~-][A-Za-z0-9._:~-]{0,254}$", "title": "Operation External Id" }, "example": "CF-OP-001", "description": "Identifiant externe de l'opération, appartenant à la même intégration." }, { "in": "path", "name": "note_external_id", "required": true, "schema": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_~-][A-Za-z0-9._:~-]{0,254}$", "title": "Note External Id" }, "example": "CF-NOTE-002", "description": "Paramètre note_external_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operations-notes-upsert" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "operations" ], "x-marko-route-group": "import", "x-marko-required-scope": "operations:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "201": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalNoteSyncUpsertResponse" }, "example": { "external_id": "CF-NOTE-002", "marko_id": "55555555-5555-5555-5555-555555555555", "outcome": "created", "resource": { "id": "55555555-5555-5555-5555-555555555555", "operation_id": "44444444-4444-4444-4444-444444444444", "date": "2026-07-16T14:00:00Z", "category": "custom__a3e08c7bde__comite", "text": "Comité: prorogation à documenter.", "description_i18n": { "fr": "Comité : prorogation à documenter.", "en": "Committee: extension to document." }, "source_created_at": "2026-07-16T14:00:00Z", "source_updated_at": "2026-07-16T14:00:00Z", "created_at": "2026-08-22T08:00:00Z", "updated_at": "2026-08-22T08:00:00Z" }, "taxonomy_additions": [ { "code": "custom__a3e08c7bde__comite", "dimension": "follow_up_category", "display_label": "comite", "source_kind": "partner", "source_display_name": "ClubFunding", "is_visible": true, "is_active": true, "position": 10000, "usage_count": 0, "label_editable": true, "canonical_code": null } ], "request_id": "req_cf_note_upsert" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "200": { "description": "Additional successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalNoteSyncUpsertResponse" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalNoteUpsertRequest" }, "example": { "date": "2026-07-16T14:00:00Z", "text": "Comité: prorogation à documenter.", "category": "comite", "description_i18n": { "fr": "Comité : prorogation à documenter.", "en": "Committee: extension to document." }, "source_created_at": "2026-07-16T14:00:00Z", "source_updated_at": "2026-07-16T14:00:00Z" } } } } } }, "/import-jobs/{job_id}": { "get": { "operationId": "import-jobs_get", "summary": "Suivre un job d'import", "description": "Retourne les compteurs completed, noop, failed et conflict du job durable. Pour un import d'une operation, `operation_id` est renseigne des que la cible MARKO existe; sinon `error_code` et `error_message` decrivent l'echec.\n\n**Scope requis :** `operations:read`. [Scopes et délégation](/scopes-and-delegation).\n\n[Import par lot, suivi et reprise](/imports-and-notes).", "parameters": [ { "in": "path", "name": "job_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Job Id" }, "example": "88888888-8888-8888-8888-888888888888", "description": "UUID du job durable à suivre." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-import-jobs-get" } ], "tags": [ "import-jobs" ], "x-marko-route-group": "read", "x-marko-required-scope": "operations:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalImportJobResponse" }, "example": { "job_id": "88888888-8888-8888-8888-888888888888", "status": "partial", "total_operations": 500, "total_notes": 5000, "processed_items": 5500, "completed_items": 5497, "noop_items": 1, "failed_items": 1, "conflict_items": 1, "cancel_requested": false, "accepted_at": "2026-07-16T08:00:00Z", "started_at": "2026-07-16T08:00:01Z", "completed_at": "2026-07-16T08:04:20Z", "created_at": "2026-07-16T08:00:00Z", "updated_at": "2026-07-16T08:04:20Z", "results_url": "/v1/import-jobs/88888888-8888-8888-8888-888888888888/items", "operation_id": null, "error_code": null, "error_message": null } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/import-jobs/{job_id}/items": { "get": { "operationId": "import-jobs_items", "summary": "Lister les résultats d'un import", "description": "Filtre les résultats par `status` ou `item_kind` pour diagnostiquer et reprendre un lot.\n\n**Scope requis :** `operations:read`. [Scopes et délégation](/scopes-and-delegation).\n\n[Import par lot, suivi et reprise](/imports-and-notes).", "parameters": [ { "in": "path", "name": "job_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Job Id" }, "example": "88888888-8888-8888-8888-888888888888", "description": "UUID du job durable à suivre." }, { "in": "query", "name": "status", "required": false, "schema": { "anyOf": [ { "type": "string", "maxLength": 24 }, { "type": "null" } ], "title": "Status" }, "example": "failed", "description": "Paramètre status pour cette route; type, format et contraintes ci-dessous." }, { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 500, "minimum": 1, "default": 100, "title": "Limit" }, "example": 100, "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, { "in": "query", "name": "offset", "required": false, "schema": { "type": "integer", "minimum": 0, "default": 0, "title": "Offset" }, "example": 0, "description": "Nombre de résultats à ignorer avant cette page (commence à 0)." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-import-jobs-items" }, { "name": "item_kind", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "string", "maxLength": 16 }, { "type": "null" } ], "title": "Item Kind" }, "description": "Paramètre item_kind de cette route; contraintes ci-dessous." } ], "tags": [ "import-jobs" ], "x-marko-route-group": "read", "x-marko-required-scope": "operations:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalImportItemsResponse" }, "example": { "items": [ { "id": "aaaaaaaa-8888-8888-8888-888888888888", "item_kind": "operation", "position": 42, "external_id": "CF-OP-042", "status": "failed", "attempts": 1, "error_code": "marko_http_422", "error_message": "Imported item failed MARKO validation" } ], "total": 1, "limit": 100, "offset": 0 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/import-jobs/{job_id}/retry": { "post": { "operationId": "import-jobs_retry", "summary": "Relancer les éléments échoués", "description": "Réenfile un job failed ou partial; les éléments déjà terminés restent des no-op.\n\n**Scope requis :** `operations:write`. [Scopes et délégation](/scopes-and-delegation).\n\n[Import par lot, suivi et reprise](/imports-and-notes).", "parameters": [ { "in": "path", "name": "job_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Job Id" }, "example": "88888888-8888-8888-8888-888888888888", "description": "UUID du job durable à suivre." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-import-jobs-retry" } ], "tags": [ "import-jobs" ], "x-marko-route-group": "import", "x-marko-required-scope": "operations:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalImportJobResponse" }, "example": { "job_id": "88888888-8888-8888-8888-888888888888", "status": "queued", "total_operations": 500, "total_notes": 5000, "processed_items": 0, "completed_items": 0, "noop_items": 0, "failed_items": 0, "conflict_items": 0, "cancel_requested": false, "created_at": "2026-07-16T08:00:00Z", "updated_at": "2026-07-16T08:05:00Z", "results_url": "/v1/import-jobs/88888888-8888-8888-8888-888888888888/items" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/import-jobs/{job_id}/cancel": { "post": { "operationId": "import-jobs_cancel", "summary": "Demander l'arrêt d'un import", "description": "Demande un arrêt propre au prochain point de reprise durable.\n\n**Scope requis :** `operations:write`. [Scopes et délégation](/scopes-and-delegation).\n\n[Import par lot, suivi et reprise](/imports-and-notes).", "parameters": [ { "in": "path", "name": "job_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Job Id" }, "example": "88888888-8888-8888-8888-888888888888", "description": "UUID du job durable à suivre." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-import-jobs-cancel" } ], "tags": [ "import-jobs" ], "x-marko-route-group": "import", "x-marko-required-scope": "operations:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalImportJobResponse" }, "example": { "job_id": "88888888-8888-8888-8888-888888888888", "status": "running", "total_operations": 500, "total_notes": 5000, "processed_items": 100, "completed_items": 100, "noop_items": 0, "failed_items": 0, "conflict_items": 0, "cancel_requested": true, "created_at": "2026-07-16T08:00:00Z", "updated_at": "2026-07-16T08:06:00Z", "results_url": "/v1/import-jobs/88888888-8888-8888-8888-888888888888/items" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/operations/{operation_id}/comments": { "get": { "operationId": "operations_comments_list", "summary": "Lister les notes de suivi MARKO", "description": "Retourne les notes triées par date métier avec texte et catégorie libre.\n\n**Scope requis :** `operations:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "operation_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Operation Id" }, "example": "44444444-4444-4444-4444-444444444444", "description": "UUID MARKO de l'opération." }, { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 200, "minimum": 1, "default": 20, "title": "Limit" }, "example": 20, "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, { "in": "query", "name": "offset", "required": false, "schema": { "type": "integer", "minimum": 0, "default": 0, "title": "Offset" }, "example": 0, "description": "Nombre de résultats à ignorer avant cette page (commence à 0)." }, { "in": "query", "name": "category", "required": false, "schema": { "anyOf": [ { "type": "string", "minLength": 1, "maxLength": 80 }, { "type": "null" } ], "title": "Category" }, "example": "call", "description": "Catégorie de la note; les règles exactes dépendent de la route. Pour l'import externe: chaîne de 1 à 80 caractères, libre par défaut." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operations-comments-list" }, { "name": "note_type", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Note Type" }, "description": "Paramètre note_type de cette route; contraintes ci-dessous." } ], "tags": [ "operations" ], "x-marko-route-group": "read", "x-marko-required-scope": "operations:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedResponse_CommentResponse_" }, "example": { "items": [ { "id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "operation_id": "44444444-4444-4444-4444-444444444444", "user_id": "external-api:client", "author_name": "API externe", "content": "Pièces complémentaires attendues.", "note_type": "call", "date": "2026-07-15T09:30:00Z", "text": "Pièces complémentaires attendues.", "category": "call", "is_resolved": false, "created_at": "2026-07-16T08:00:00Z", "updated_at": "2026-07-16T08:00:00Z" } ], "total": 1, "limit": 20, "offset": 0 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] }, "post": { "operationId": "operations_comments_create", "summary": "Créer une note de suivi MARKO", "description": "Crée une note sans identifiant externe; pour un import idempotent, utilisez la route notes/external. `category` est une chaine libre de 1 a 80 caracteres; valeurs conseillees: call, comite, juridique ou libre.\n\n**Scope requis :** `operations:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).", "parameters": [ { "in": "path", "name": "operation_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Operation Id" }, "example": "44444444-4444-4444-4444-444444444444", "description": "UUID MARKO de l'opération." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operations-comments-create" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "operations" ], "x-marko-route-group": "write", "x-marko-required-scope": "operations:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "201": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CommentResponse" }, "example": { "id": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", "operation_id": "11111111-1111-4111-8111-111111111111", "user_id": "example", "author_name": "example", "content": "example", "note_type": "example", "date": "2026-07-16T14:00:00Z", "text": "Comité: prorogation à documenter.", "category": "comite", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CommentCreate" }, "example": { "date": "2026-07-16T14:00:00Z", "text": "Comité: prorogation à documenter.", "category": "comite" } } } } } }, "/comments/{comment_id}": { "put": { "operationId": "comments_update", "summary": "Modifier une note de suivi", "description": "Modifie la date métier, le texte ou la catégorie d'une note MARKO.\n\n**Scope requis :** `operations:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "comment_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Comment Id" }, "example": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "description": "Paramètre comment_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-comments-update" } ], "tags": [ "comments" ], "x-marko-route-group": "write", "x-marko-required-scope": "operations:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CommentResponse" }, "example": { "id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa", "operation_id": "11111111-1111-4111-8111-111111111111", "user_id": "example", "author_name": "example", "content": "example", "note_type": "example", "date": "2026-07-16T15:00:00Z", "text": "Prorogation validée, avenant attendu.", "category": "juridique", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CommentUpdate" }, "example": { "date": "2026-07-16T15:00:00Z", "text": "Prorogation validée, avenant attendu.", "category": "juridique" } } } } }, "delete": { "operationId": "comments_delete", "summary": "Supprimer une note de suivi", "description": "Supprime la note; l'événement de suppression reste dans la chronologie.\n\n**Scope requis :** `operations:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "comment_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Comment Id" }, "example": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "description": "Paramètre comment_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-comments-delete" } ], "tags": [ "comments" ], "x-marko-route-group": "write", "x-marko-required-scope": "operations:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "204": { "description": "Successful response" }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/operations/{operation_id}/chronicle": { "get": { "operationId": "operations_chronicle", "summary": "Lire l'historique technique d'une opération", "description": "Historique paginé des transitions, changements de champs et événements d'audit.\n\n**Scope requis :** `operations:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "operation_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Operation Id" }, "example": "44444444-4444-4444-4444-444444444444", "description": "UUID MARKO de l'opération." }, { "in": "query", "name": "page", "required": false, "schema": { "type": "integer", "minimum": 1, "default": 1, "title": "Page" }, "example": 1, "description": "Numéro de page; consultez la valeur minimale et la valeur par défaut de cette route." }, { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 200, "minimum": 1, "default": 50, "title": "Limit" }, "example": 50, "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operations-chronicle" }, { "name": "entry_type", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Entry Type" }, "description": "Paramètre entry_type de cette route; contraintes ci-dessous." }, { "name": "actor_id", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Actor Id" }, "description": "Paramètre actor_id de cette route; contraintes ci-dessous." }, { "name": "date_from", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Date From" }, "description": "Paramètre date_from de cette route; contraintes ci-dessous." }, { "name": "date_to", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Date To" }, "description": "Paramètre date_to de cette route; contraintes ci-dessous." } ], "tags": [ "operations" ], "x-marko-route-group": "read", "x-marko-required-scope": "operations:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ChronicleResponse" }, "example": { "items": [], "total": 0, "page": 1, "pages": 0, "limit": 50 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/operations/{operation_id}/chronicle/narrative": { "get": { "operationId": "operations_chronicle_narrative", "summary": "Lire la chronologie narrative d'une opération", "description": "Agrège notamment les notes de suivi. Pour une note importée, metadata expose note_date, note_text et note_category.\n\n**Scope requis :** `operations:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "operation_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Operation Id" }, "example": "44444444-4444-4444-4444-444444444444", "description": "UUID MARKO de l'opération." }, { "in": "query", "name": "category", "required": false, "schema": { "anyOf": [ { "$ref": "#/components/schemas/OperationChronicleCategory" }, { "type": "null" } ] }, "example": "comment", "description": "Catégorie de la note; les règles exactes dépendent de la route. Pour l'import externe: chaîne de 1 à 80 caractères, libre par défaut." }, { "in": "query", "name": "page", "required": false, "schema": { "type": "integer", "minimum": 1, "default": 1, "title": "Page" }, "example": 1, "description": "Numéro de page; consultez la valeur minimale et la valeur par défaut de cette route." }, { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 200, "minimum": 1, "default": 50, "title": "Limit" }, "example": 50, "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operations-chronicle-narrative" }, { "name": "date_from", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Date From" }, "description": "Paramètre date_from de cette route; contraintes ci-dessous." }, { "name": "date_to", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "string", "format": "date-time" }, { "type": "null" } ], "title": "Date To" }, "description": "Paramètre date_to de cette route; contraintes ci-dessous." } ], "tags": [ "operations" ], "x-marko-route-group": "read", "x-marko-required-scope": "operations:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OperationChronicle" }, "example": { "operation_id": "44444444-4444-4444-4444-444444444444", "entries": [ { "id": "cm_aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "timestamp": "2026-07-15T09:30:00Z", "category": "comment", "title": "Note d'appel ajoutée via l'API externe", "description": "Pièces complémentaires attendues.", "severity": "info", "metadata": { "note_date": "2026-07-15T09:30:00Z", "note_text": "Pièces complémentaires attendues.", "note_category": "call" } } ], "total": 1, "page": 1, "pages": 1, "limit": 50, "sources_queried": [ "comments" ] } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/documents": { "get": { "operationId": "documents_list", "summary": "Lister les documents", "description": "Peut filtrer sur une operation MARKO ou une `operation_external_id`.\n\n**Scope requis :** `documents:read`. [Scopes et délégation](/scopes-and-delegation).\n\n[Documents et upload](/documents-guide).", "parameters": [ { "in": "query", "name": "operation_external_id", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Operation External Id" }, "example": "CF-OP-001", "description": "Identifiant externe de l'opération, appartenant à la même intégration." }, { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 200, "minimum": 1, "default": 50, "title": "Limit" }, "example": 20, "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, { "in": "query", "name": "offset", "required": false, "schema": { "type": "integer", "minimum": 0, "default": 0, "title": "Offset" }, "example": 0, "description": "Nombre de résultats à ignorer avant cette page (commence à 0)." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-documents-list" }, { "name": "operation_id", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Operation Id" }, "description": "UUID MARKO de l'opération." } ], "tags": [ "documents" ], "x-marko-route-group": "read", "x-marko-required-scope": "documents:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/PublicDocumentItem" }, "title": "Response List Documents Public Documents Get" }, "example": [ { "id": "55555555-5555-5555-5555-555555555555", "operation_id": "44444444-4444-4444-4444-444444444444", "spv_id": "33333333-3333-3333-3333-333333333333", "fond_id": null, "type": "term_sheet", "filename": "term-sheet.pdf", "state": "active", "version": 1, "storage_path": "https://partner-api.marko.fr/api/documents/download/clubfunding/55555555-5555-5555-5555-555555555555?exp=1760000000&sig=abc123", "partner_metadata": { "langue": "fr" }, "created_at": "2026-03-18T11:00:00Z" } ] } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/documents/{document_id}": { "get": { "operationId": "documents_get", "summary": "Recuperer un document", "description": "Retourne le metadata d'un document et son URL de telechargement si disponible.\n\n**Scope requis :** `documents:read`. [Scopes et délégation](/scopes-and-delegation).\n\n[Documents et upload](/documents-guide).", "parameters": [ { "in": "path", "name": "document_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Document Id" }, "example": "55555555-5555-5555-5555-555555555555", "description": "UUID MARKO du document." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-documents-get" } ], "tags": [ "documents" ], "x-marko-route-group": "read", "x-marko-required-scope": "documents:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PublicDocumentItem" }, "example": { "id": "55555555-5555-5555-5555-555555555555", "operation_id": "44444444-4444-4444-4444-444444444444", "spv_id": "33333333-3333-3333-3333-333333333333", "fond_id": null, "type": "term_sheet", "filename": "term-sheet.pdf", "state": "active", "version": 1, "storage_path": "https://partner-api.marko.fr/api/documents/download/clubfunding/55555555-5555-5555-5555-555555555555?exp=1760000000&sig=abc123", "partner_metadata": { "langue": "fr" }, "created_at": "2026-03-18T11:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] }, "put": { "operationId": "documents_update", "summary": "Mettre à jour un document", "description": "Met à jour les métadonnées d'un document existant.\n\n**Scope requis :** `documents:write`. [Scopes et délégation](/scopes-and-delegation).\n\n[Documents et upload](/documents-guide).", "parameters": [ { "in": "path", "name": "document_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Document Id" }, "example": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "description": "UUID MARKO du document." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-documents-update" } ], "tags": [ "documents" ], "x-marko-route-group": "write", "x-marko-required-scope": "documents:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PublicDocumentItem" }, "example": { "id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "type": "example", "filename": "reporting-maj.pdf", "state": "example", "version": 0, "created_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DocumentUpdate" }, "example": { "filename": "reporting-maj.pdf", "type": "reporting" } } } } }, "delete": { "operationId": "documents_delete", "summary": "Supprimer un document", "description": "Supprime logiquement un document existant.\n\n**Scope requis :** `documents:write`. [Scopes et délégation](/scopes-and-delegation).\n\n[Documents et upload](/documents-guide).", "parameters": [ { "in": "path", "name": "document_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Document Id" }, "example": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "description": "UUID MARKO du document." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-documents-delete" } ], "tags": [ "documents" ], "x-marko-route-group": "write", "x-marko-required-scope": "documents:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "204": { "description": "Successful response" }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/documents/{document_id}/attach-operation": { "post": { "operationId": "documents_attach-operation", "summary": "Rattacher un document à une opération", "description": "Rattache atomiquement un document non affecté à une opération MARKO. Une relance avec la même clé d'idempotence rejoue la première réponse; une nouvelle intention échoue si le document est déjà rattaché.\n\n**Scope requis :** `documents:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).\n\n[Documents et upload](/documents-guide).", "parameters": [ { "in": "path", "name": "document_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Document Id" }, "example": "55555555-5555-5555-5555-555555555555", "description": "UUID MARKO du document." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-documents-attach-operation" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "documents" ], "x-marko-route-group": "write", "x-marko-required-scope": "documents:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PublicDocumentItem" }, "example": { "id": "55555555-5555-5555-5555-555555555555", "operation_id": "44444444-4444-4444-4444-444444444444", "spv_id": null, "fond_id": null, "type": "term_sheet", "filename": "term-sheet.pdf", "state": "active", "version": 2, "storage_path": null, "partner_metadata": { "langue": "fr" }, "created_at": "2026-03-18T11:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DocumentAttachOperationRequest" }, "example": { "operation_id": "44444444-4444-4444-4444-444444444444" } } } } } }, "/documents/external/{external_id}": { "put": { "operationId": "documents_create", "summary": "Creer le metadata d'un document", "description": "Route idempotente pour declarer un document avant upload physique.\n\n**Scope requis :** `documents:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).\n\n[Documents et upload](/documents-guide).", "parameters": [ { "in": "path", "name": "external_id", "required": true, "schema": { "type": "string", "title": "External Id", "pattern": "^[A-Za-z0-9_~-][A-Za-z0-9._:~-]{0,254}$", "minLength": 1, "maxLength": 255 }, "example": "CF-DOC-001", "description": "Identifiant stable de votre système, dans le contexte de votre intégration." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-documents-create" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "documents" ], "x-marko-route-group": "write", "x-marko-required-scope": "documents:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Référence documentaire existante ou réponse rejouée.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalDocumentResponse" }, "example": { "external_id": "CF-DOC-001", "document_id": "55555555-5555-5555-5555-555555555555", "created": true, "document": { "id": "55555555-5555-5555-5555-555555555555", "operation_id": "44444444-4444-4444-4444-444444444444", "spv_id": "33333333-3333-3333-3333-333333333333", "fond_id": null, "type": "term_sheet", "filename": "term-sheet.pdf", "state": "active", "version": 1, "storage_path": null, "partner_metadata": { "langue": "fr" }, "created_at": "2026-03-26T09:10:00Z" } } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "201": { "description": "Document créé; conserve son identifiant externe et son document_id.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalDocumentResponse" }, "example": { "external_id": "CF-DOC-001", "document_id": "55555555-5555-5555-5555-555555555555", "created": true, "document": { "id": "55555555-5555-5555-5555-555555555555", "operation_id": "44444444-4444-4444-4444-444444444444", "spv_id": "33333333-3333-3333-3333-333333333333", "fond_id": null, "type": "term_sheet", "filename": "term-sheet.pdf", "state": "active", "version": 1, "storage_path": null, "partner_metadata": { "langue": "fr" }, "created_at": "2026-03-26T09:10:00Z" } } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalDocumentCreateRequest" }, "example": { "operation_external_id": "CF-OP-001", "type": "term_sheet", "filename": "term-sheet.pdf", "partner_metadata": { "langue": "fr" } } } } } } }, "/documents/external/{external_id}/upload": { "put": { "operationId": "documents_upload", "summary": "Uploader un document", "description": "Upload multipart/form-data idempotent avec rattachement a une operation via `operation_id` ou `operation_external_id`.\n\n**Scope requis :** `documents:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).\n\n[Documents et upload](/documents-guide).", "parameters": [ { "in": "path", "name": "external_id", "required": true, "schema": { "type": "string", "title": "External Id", "pattern": "^[A-Za-z0-9_~-][A-Za-z0-9._:~-]{0,254}$", "minLength": 1, "maxLength": 255 }, "example": "CF-DOC-001", "description": "Identifiant stable de votre système, dans le contexte de votre intégration." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-documents-upload" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "documents" ], "x-marko-route-group": "upload", "x-marko-required-scope": "documents:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Référence documentaire existante ou réponse rejouée.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalDocumentResponse" }, "example": { "external_id": "CF-DOC-001", "document_id": "55555555-5555-5555-5555-555555555555", "created": true, "document": { "id": "55555555-5555-5555-5555-555555555555", "operation_id": "44444444-4444-4444-4444-444444444444", "spv_id": "33333333-3333-3333-3333-333333333333", "fond_id": null, "type": "term_sheet", "filename": "term-sheet.pdf", "state": "active", "version": 1, "storage_path": "https://partner-api.marko.fr/api/documents/download/clubfunding/55555555-5555-5555-5555-555555555555?exp=1760000000&sig=abc123", "partner_metadata": { "langue": "fr" }, "created_at": "2026-03-26T09:12:00Z" } } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "201": { "description": "Document créé; conserve son identifiant externe et son document_id.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalDocumentResponse" }, "example": { "external_id": "CF-DOC-001", "document_id": "55555555-5555-5555-5555-555555555555", "created": true, "document": { "id": "55555555-5555-5555-5555-555555555555", "operation_id": "44444444-4444-4444-4444-444444444444", "spv_id": "33333333-3333-3333-3333-333333333333", "fond_id": null, "type": "term_sheet", "filename": "term-sheet.pdf", "state": "active", "version": 1, "storage_path": "https://partner-api.marko.fr/api/documents/download/clubfunding/55555555-5555-5555-5555-555555555555?exp=1760000000&sig=abc123", "partner_metadata": { "langue": "fr" }, "created_at": "2026-03-26T09:12:00Z" } } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "multipart/form-data": { "schema": { "$ref": "#/components/schemas/Body_upload_document_public_documents_external__external_id__upload_put" }, "example": { "type": "term_sheet", "operation_external_id": "CF-OP-001", "partner_metadata": "{\"langue\":\"fr\"}", "file": "./term-sheet.pdf" } } } } } }, "/users": { "get": { "operationId": "users_list", "summary": "Lister les utilisateurs de l'entité", "description": "Expose les utilisateurs Better Auth rattachés à l'entité de la clé.\n\n**Scope requis :** `users:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 200, "minimum": 1, "default": 20, "title": "Limit" }, "example": 20, "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, { "in": "query", "name": "offset", "required": false, "schema": { "type": "integer", "minimum": 0, "default": 0, "title": "Offset" }, "example": 0, "description": "Nombre de résultats à ignorer avant cette page (commence à 0)." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-list" } ], "tags": [ "users" ], "x-marko-route-group": "read", "x-marko-required-scope": "users:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EntityAdminUserListResponse" }, "example": { "items": [ { "id": "usr_001", "email": "ops@clubfunding.fr", "name": "Ops Clubfunding", "role": "entity_tech", "status": "approved", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z", "is_pending_invite": false } ], "total": 1 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] }, "post": { "operationId": "users_create", "summary": "Inviter un utilisateur", "description": "Crée un utilisateur d'entité et déclenche le flux d'activation Better Auth.\n\n**Scope requis :** `users:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-create" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "users" ], "x-marko-route-group": "write", "x-marko-required-scope": "users:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "201": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EntityAdminUserResponse" }, "example": { "id": "usr_002", "email": "new.user@clubfunding.fr", "name": "Nouveau User", "role": "viewer", "status": "approved", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z", "is_pending_invite": false } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EntityAdminUserCreate" }, "example": { "email": "new.user@clubfunding.fr", "name": "Nouveau User", "role": "viewer" } } } } } }, "/users/{user_id}": { "put": { "operationId": "users_update", "summary": "Mettre à jour un utilisateur", "description": "Met à jour le rôle d'un utilisateur de l'entité.\n\n**Scope requis :** `users:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "user_id", "required": true, "schema": { "type": "string", "title": "User Id" }, "example": "usr_001", "description": "Identifiant utilisateur MARKO; il n'est pas nécessairement un UUID." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-update" } ], "tags": [ "users" ], "x-marko-route-group": "write", "x-marko-required-scope": "users:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EntityAdminUserResponse" }, "example": { "id": "usr_001", "email": "integration@example.com", "name": "Exemple MARKO", "role": "entity_tech", "status": "approved", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z", "is_pending_invite": false } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EntityAdminUserUpdate" }, "example": { "role": "entity_tech" } } } } }, "delete": { "operationId": "users_delete", "summary": "Retirer un utilisateur", "description": "Annule immédiatement une invitation non activée ou retire les accès d'un compte actif et lance son workflow durable d'effacement RGPD.\n\n**Scope requis :** `users:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).", "parameters": [ { "in": "path", "name": "user_id", "required": true, "schema": { "type": "string", "title": "User Id" }, "example": "usr_002", "description": "Identifiant utilisateur MARKO; il n'est pas nécessairement un UUID." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-delete" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "users" ], "x-marko-route-group": "write", "x-marko-required-scope": "users:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "202": { "description": "Retrait d'accès et effacement durable acceptés pour un compte actif.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserRemovalResponse" }, "example": { "action": "offboarding_accepted", "status": "in_progress", "privacy_case_id": "00000000-0000-0000-0000-000000000001", "replayed": false, "manual_review_required": false } } }, "headers": { "Idempotency-Key": { "schema": { "type": "string" }, "description": "Clé d'idempotence utilisée pour l'action." }, "X-Marko-Idempotency-Key-Source": { "schema": { "type": "string", "enum": [ "client", "server" ] }, "description": "Origine de la clé utilisée." }, "X-Marko-Idempotency-TTL-Seconds": { "schema": { "type": "integer" }, "description": "Durée de rétention annoncée pour cette action, en secondes." } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "200": { "description": "Invitation non activée annulée immédiatement.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserRemovalResponse" }, "example": { "action": "offboarding_accepted", "status": "in_progress", "privacy_case_id": "00000000-0000-0000-0000-000000000001", "replayed": false, "manual_review_required": false } } }, "headers": { "Idempotency-Key": { "schema": { "type": "string" }, "description": "Clé d'idempotence utilisée pour l'action." }, "X-Marko-Idempotency-Key-Source": { "schema": { "type": "string", "enum": [ "client", "server" ] }, "description": "Origine de la clé utilisée." }, "X-Marko-Idempotency-TTL-Seconds": { "schema": { "type": "integer" }, "description": "Durée de rétention annoncée pour cette action, en secondes." } } } }, "security": [ { "BearerAuth": [] } ] } }, "/users/{user_id}/actions/suspend": { "post": { "operationId": "users_suspend", "summary": "Suspendre un utilisateur", "description": "Suspend un utilisateur activé de l'entité.\n\n**Scope requis :** `users:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "user_id", "required": true, "schema": { "type": "string", "title": "User Id" }, "example": "usr_001", "description": "Identifiant utilisateur MARKO; il n'est pas nécessairement un UUID." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-suspend" } ], "tags": [ "users" ], "x-marko-route-group": "write", "x-marko-required-scope": "users:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EntityAdminUserResponse" }, "example": { "id": "usr_001", "email": "integration@example.com", "name": "Exemple MARKO", "status": "suspended", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z", "is_pending_invite": false } } }, "headers": { "Idempotency-Key": { "schema": { "type": "string" }, "description": "Clé d'idempotence utilisée pour l'action." }, "X-Marko-Idempotency-Key-Source": { "schema": { "type": "string", "enum": [ "client", "server" ] }, "description": "Origine de la clé utilisée." }, "X-Marko-Idempotency-TTL-Seconds": { "schema": { "type": "integer" }, "description": "Durée de rétention annoncée pour cette action, en secondes." } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/users/{user_id}/actions/unsuspend": { "post": { "operationId": "users_unsuspend", "summary": "Réactiver un utilisateur", "description": "Réactive un utilisateur suspendu.\n\n**Scope requis :** `users:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "user_id", "required": true, "schema": { "type": "string", "title": "User Id" }, "example": "usr_001", "description": "Identifiant utilisateur MARKO; il n'est pas nécessairement un UUID." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-unsuspend" } ], "tags": [ "users" ], "x-marko-route-group": "write", "x-marko-required-scope": "users:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EntityAdminUserResponse" }, "example": { "id": "usr_001", "email": "integration@example.com", "name": "Exemple MARKO", "status": "approved", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z", "is_pending_invite": false } } }, "headers": { "Idempotency-Key": { "schema": { "type": "string" }, "description": "Clé d'idempotence utilisée pour l'action." }, "X-Marko-Idempotency-Key-Source": { "schema": { "type": "string", "enum": [ "client", "server" ] }, "description": "Origine de la clé utilisée." }, "X-Marko-Idempotency-TTL-Seconds": { "schema": { "type": "integer" }, "description": "Durée de rétention annoncée pour cette action, en secondes." } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/users/{user_id}/actions/resend-invitation": { "post": { "operationId": "users_resend-invitation", "summary": "Renvoyer une invitation", "description": "Régénère le flux d'activation pour un utilisateur non activé.\n\n**Scope requis :** `users:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).", "parameters": [ { "in": "path", "name": "user_id", "required": true, "schema": { "type": "string", "title": "User Id" }, "example": "usr_002", "description": "Identifiant utilisateur MARKO; il n'est pas nécessairement un UUID." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-resend-invitation" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "users" ], "x-marko-route-group": "write", "x-marko-required-scope": "users:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "204": { "description": "Successful response" }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/users/{user_id}/actions/reset-password": { "post": { "operationId": "users_reset-password", "summary": "Déclencher un reset mot de passe", "description": "Déclenche le flux Better Auth de reset ou réactivation.\n\n**Scope requis :** `users:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).", "parameters": [ { "in": "path", "name": "user_id", "required": true, "schema": { "type": "string", "title": "User Id" }, "example": "usr_001", "description": "Identifiant utilisateur MARKO; il n'est pas nécessairement un UUID." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-reset-password" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "users" ], "x-marko-route-group": "write", "x-marko-required-scope": "users:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "204": { "description": "Successful response" }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/users/me": { "get": { "operationId": "users_me_get", "summary": "Lire le profil d'un utilisateur délégué", "description": "Nécessite exactement un header `X-Marko-Delegated-User-Id` ou `X-Marko-Delegated-User-Email` pour résoudre le sujet utilisateur dans la même entité.\n\n**Scope requis :** `users:read`. [Scopes et délégation](/scopes-and-delegation).\n\n**Délégation utilisateur :** exactement un header `X-Marko-Delegated-User-Id` ou `X-Marko-Delegated-User-Email`.\n\n**Accès complémentaire :** allowlist utilisateur explicite sur la clé et capacité `user_self_service`. Le sujet doit être approuvé et appartenir à la même entité.", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-me-get" }, { "name": "X-Marko-Delegated-User-Id", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." }, { "name": "X-Marko-Delegated-User-Email", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." } ], "tags": [ "users" ], "x-marko-route-group": "read", "x-marko-required-scope": "users:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserResponse" }, "example": { "id": "usr_001", "email": "ops@clubfunding.fr", "name": "Ops Clubfunding", "role": "viewer", "status": "approved", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z", "is_pending_invite": false } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Bad Request — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] }, "put": { "operationId": "users_me_update", "summary": "Mettre à jour le profil d'un utilisateur délégué", "description": "Met à jour le profil du sujet utilisateur délégué résolu via header.\n\n**Scope requis :** `users:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Délégation utilisateur :** exactement un header `X-Marko-Delegated-User-Id` ou `X-Marko-Delegated-User-Email`.\n\n**Accès complémentaire :** allowlist utilisateur explicite sur la clé et capacité `user_self_service`. Le sujet doit être approuvé et appartenir à la même entité.", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-me-update" }, { "name": "X-Marko-Delegated-User-Id", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." }, { "name": "X-Marko-Delegated-User-Email", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." } ], "tags": [ "users" ], "x-marko-route-group": "write", "x-marko-required-scope": "users:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserResponse" }, "example": { "id": "usr_001", "email": "integration@example.com", "name": "Ops Clubfunding", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z", "is_pending_invite": false } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Bad Request — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserUpdate" }, "example": { "name": "Ops Clubfunding", "first_name": "Ops", "last_name": "Team" } } } } } }, "/users/me/preferences": { "get": { "operationId": "users_preferences_get", "summary": "Lire les préférences d'un utilisateur délégué", "description": "Retourne les préférences du sujet utilisateur délégué résolu via header.\n\n**Scope requis :** `users:read`. [Scopes et délégation](/scopes-and-delegation).\n\n**Délégation utilisateur :** exactement un header `X-Marko-Delegated-User-Id` ou `X-Marko-Delegated-User-Email`.\n\n**Accès complémentaire :** allowlist utilisateur explicite sur la clé et capacité `user_self_service`. Le sujet doit être approuvé et appartenir à la même entité.", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-preferences-get" }, { "name": "X-Marko-Delegated-User-Id", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." }, { "name": "X-Marko-Delegated-User-Email", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." } ], "tags": [ "users" ], "x-marko-route-group": "read", "x-marko-required-scope": "users:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserPreferencesResponse" }, "example": { "user_id": "usr_001", "preferences": { "locale": "fr" }, "alert_budget_daily": 5, "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Bad Request — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] }, "put": { "operationId": "users_preferences_update", "summary": "Mettre à jour les préférences d'un utilisateur délégué", "description": "Met à jour les préférences du sujet utilisateur délégué résolu via header.\n\n**Scope requis :** `users:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Délégation utilisateur :** exactement un header `X-Marko-Delegated-User-Id` ou `X-Marko-Delegated-User-Email`.\n\n**Accès complémentaire :** allowlist utilisateur explicite sur la clé et capacité `user_self_service`. Le sujet doit être approuvé et appartenir à la même entité.", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-preferences-update" }, { "name": "X-Marko-Delegated-User-Id", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." }, { "name": "X-Marko-Delegated-User-Email", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." } ], "tags": [ "users" ], "x-marko-route-group": "write", "x-marko-required-scope": "users:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserPreferencesResponse" }, "example": { "user_id": "usr_001", "preferences": { "locale": "fr" }, "alert_budget_daily": 8, "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Bad Request — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserPreferencesUpdate" }, "example": { "preferences": { "locale": "fr" }, "alert_budget_daily": 8 } } } } } }, "/users/me/alert-preferences": { "get": { "operationId": "users_alert-preferences_get", "summary": "Lire les préférences d'alerte d'un utilisateur délégué", "description": "Retourne les préférences d'alerte du sujet utilisateur délégué résolu via header.\n\n**Scope requis :** `users:read`. [Scopes et délégation](/scopes-and-delegation).\n\n**Délégation utilisateur :** exactement un header `X-Marko-Delegated-User-Id` ou `X-Marko-Delegated-User-Email`.\n\n**Accès complémentaire :** allowlist utilisateur explicite sur la clé et capacité `user_self_service`. Le sujet doit être approuvé et appartenir à la même entité.", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-alert-preferences-get" }, { "name": "X-Marko-Delegated-User-Id", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." }, { "name": "X-Marko-Delegated-User-Email", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." } ], "tags": [ "users" ], "x-marko-route-group": "read", "x-marko-required-scope": "users:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/UserAlertPreferenceResponse" }, "title": "Response Get Partner User Alert Preferences Public Users Me Alert Preferences Get" }, "example": [ { "id": "11111111-1111-4111-8111-111111111111", "user_id": "example", "alert_type": "task_overdue", "enabled": true, "min_severity": "warning", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } ] } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Bad Request — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] }, "put": { "operationId": "users_alert-preferences_update", "summary": "Mettre à jour les préférences d'alerte d'un utilisateur délégué", "description": "Met à jour les préférences d'alerte du sujet utilisateur délégué résolu via header.\n\n**Scope requis :** `users:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Délégation utilisateur :** exactement un header `X-Marko-Delegated-User-Id` ou `X-Marko-Delegated-User-Email`.\n\n**Accès complémentaire :** allowlist utilisateur explicite sur la clé et capacité `user_self_service`. Le sujet doit être approuvé et appartenir à la même entité.", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-alert-preferences-update" }, { "name": "X-Marko-Delegated-User-Id", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." }, { "name": "X-Marko-Delegated-User-Email", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." } ], "tags": [ "users" ], "x-marko-route-group": "write", "x-marko-required-scope": "users:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/UserAlertPreferenceResponse" }, "title": "Response Update Partner User Alert Preferences Public Users Me Alert Preferences Put" }, "example": [ { "id": "11111111-1111-4111-8111-111111111111", "user_id": "example", "alert_type": "task_overdue", "enabled": true, "min_severity": "warning", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } ] } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Bad Request — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserAlertPreferenceUpdate" }, "example": { "preferences": [ { "alert_type": "task_overdue", "enabled": true, "min_severity": "warning" } ] } } } } } }, "/users/me/saved-views": { "get": { "operationId": "users_saved-views_list", "summary": "Lister les vues sauvegardées du sujet délégué", "description": "Exige un sujet utilisateur délégué résolu via header, une allowlist explicite sur la clé, et la capacité `saved_views`.\n\n**Scope requis :** `users:read`. [Scopes et délégation](/scopes-and-delegation).\n\n**Délégation utilisateur :** exactement un header `X-Marko-Delegated-User-Id` ou `X-Marko-Delegated-User-Email`.\n\n**Accès complémentaire :** allowlist utilisateur explicite sur la clé et capacité `saved_views`. Le sujet doit être approuvé et appartenir à la même entité.", "parameters": [ { "in": "query", "name": "entity_type", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Entity Type" }, "example": "operations", "description": "Paramètre entity_type pour cette route; type, format et contraintes ci-dessous." }, { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 1000, "minimum": 1, "default": 100, "title": "Limit" }, "example": 20, "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, { "in": "query", "name": "offset", "required": false, "schema": { "type": "integer", "minimum": 0, "default": 0, "title": "Offset" }, "example": 0, "description": "Nombre de résultats à ignorer avant cette page (commence à 0)." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-saved-views-list" }, { "name": "X-Marko-Delegated-User-Id", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." }, { "name": "X-Marko-Delegated-User-Email", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." } ], "tags": [ "users" ], "x-marko-route-group": "read", "x-marko-required-scope": "users:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/SavedViewResponse" }, "title": "Response List Partner Saved Views Public Users Me Saved Views Get" }, "example": [ { "id": "11111111-1111-1111-1111-111111111111", "user_id": "example", "entity_type": "operations", "name": "Pipeline closing", "filters": {}, "columns": [], "sort": {}, "is_default": false, "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } ] } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Bad Request — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] }, "post": { "operationId": "users_saved-views_create", "summary": "Créer une vue sauvegardée pour le sujet délégué", "description": "Exige une allowlist explicite sur la clé et la capacité `saved_views`.\n\n**Scope requis :** `users:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Délégation utilisateur :** exactement un header `X-Marko-Delegated-User-Id` ou `X-Marko-Delegated-User-Email`.\n\n**Accès complémentaire :** allowlist utilisateur explicite sur la clé et capacité `saved_views`. Le sujet doit être approuvé et appartenir à la même entité.\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-saved-views-create" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } }, { "name": "X-Marko-Delegated-User-Id", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." }, { "name": "X-Marko-Delegated-User-Email", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." } ], "tags": [ "users" ], "x-marko-route-group": "write", "x-marko-required-scope": "users:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "201": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SavedViewResponse" }, "example": { "id": "11111111-1111-1111-1111-111111111111", "user_id": "example", "entity_type": "operations", "name": "Pipeline closing", "filters": {}, "columns": [], "sort": {}, "is_default": false, "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SavedViewCreate" }, "example": { "entity_type": "operations", "name": "Vue exemple", "filters": {}, "columns": [ "name", "status" ], "sort": { "sort_by": "updated_at", "sort_order": "desc" } } } } } } }, "/users/me/saved-views/{view_id}": { "get": { "operationId": "users_saved-views_get", "summary": "Lire une vue sauvegardée du sujet délégué", "description": "Retourne une vue sauvegardée possédée par le sujet utilisateur délégué.\n\n**Scope requis :** `users:read`. [Scopes et délégation](/scopes-and-delegation).\n\n**Délégation utilisateur :** exactement un header `X-Marko-Delegated-User-Id` ou `X-Marko-Delegated-User-Email`.\n\n**Accès complémentaire :** allowlist utilisateur explicite sur la clé et capacité `saved_views`. Le sujet doit être approuvé et appartenir à la même entité.", "parameters": [ { "in": "path", "name": "view_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "View Id" }, "example": "11111111-1111-1111-1111-111111111111", "description": "Paramètre view_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-saved-views-get" }, { "name": "X-Marko-Delegated-User-Id", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." }, { "name": "X-Marko-Delegated-User-Email", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." } ], "tags": [ "users" ], "x-marko-route-group": "read", "x-marko-required-scope": "users:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SavedViewResponse" }, "example": { "id": "11111111-1111-1111-1111-111111111111", "user_id": "example", "entity_type": "operations", "name": "Pipeline closing", "filters": {}, "columns": [], "sort": {}, "is_default": false, "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Bad Request — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] }, "put": { "operationId": "users_saved-views_update", "summary": "Mettre à jour une vue sauvegardée du sujet délégué", "description": "Exige une allowlist explicite sur la clé et la capacité `saved_views`.\n\n**Scope requis :** `users:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Délégation utilisateur :** exactement un header `X-Marko-Delegated-User-Id` ou `X-Marko-Delegated-User-Email`.\n\n**Accès complémentaire :** allowlist utilisateur explicite sur la clé et capacité `saved_views`. Le sujet doit être approuvé et appartenir à la même entité.", "parameters": [ { "in": "path", "name": "view_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "View Id" }, "example": "11111111-1111-1111-1111-111111111111", "description": "Paramètre view_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-saved-views-update" }, { "name": "X-Marko-Delegated-User-Id", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." }, { "name": "X-Marko-Delegated-User-Email", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." } ], "tags": [ "users" ], "x-marko-route-group": "write", "x-marko-required-scope": "users:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SavedViewResponse" }, "example": { "id": "11111111-1111-1111-1111-111111111111", "user_id": "example", "entity_type": "example", "name": "Pipeline closing v2", "filters": {}, "columns": [], "sort": {}, "is_default": true, "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Bad Request — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SavedViewUpdate" }, "example": { "name": "Pipeline closing v2", "is_default": true } } } } }, "delete": { "operationId": "users_saved-views_delete", "summary": "Supprimer une vue sauvegardée du sujet délégué", "description": "Exige une allowlist explicite sur la clé et la capacité `saved_views`.\n\n**Scope requis :** `users:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Délégation utilisateur :** exactement un header `X-Marko-Delegated-User-Id` ou `X-Marko-Delegated-User-Email`.\n\n**Accès complémentaire :** allowlist utilisateur explicite sur la clé et capacité `saved_views`. Le sujet doit être approuvé et appartenir à la même entité.", "parameters": [ { "in": "path", "name": "view_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "View Id" }, "example": "11111111-1111-1111-1111-111111111111", "description": "Paramètre view_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-saved-views-delete" }, { "name": "X-Marko-Delegated-User-Id", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." }, { "name": "X-Marko-Delegated-User-Email", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." } ], "tags": [ "users" ], "x-marko-route-group": "write", "x-marko-required-scope": "users:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "204": { "description": "Successful response" }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Bad Request — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/users/me/custom-dashboards": { "get": { "operationId": "users_custom-dashboards_list", "summary": "Lister les dashboards personnalisés du sujet délégué", "description": "Exige une allowlist explicite sur la clé et la capacité `custom_dashboards`.\n\n**Scope requis :** `users:read`. [Scopes et délégation](/scopes-and-delegation).\n\n**Délégation utilisateur :** exactement un header `X-Marko-Delegated-User-Id` ou `X-Marko-Delegated-User-Email`.\n\n**Accès complémentaire :** allowlist utilisateur explicite sur la clé et capacité `custom_dashboards`. Le sujet doit être approuvé et appartenir à la même entité.", "parameters": [ { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 1000, "minimum": 1, "default": 100, "title": "Limit" }, "example": 20, "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, { "in": "query", "name": "offset", "required": false, "schema": { "type": "integer", "minimum": 0, "default": 0, "title": "Offset" }, "example": 0, "description": "Nombre de résultats à ignorer avant cette page (commence à 0)." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-custom-dashboards-list" }, { "name": "X-Marko-Delegated-User-Id", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." }, { "name": "X-Marko-Delegated-User-Email", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." } ], "tags": [ "users" ], "x-marko-route-group": "read", "x-marko-required-scope": "users:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/CustomDashboardListResponse" }, "title": "Response List Partner Custom Dashboards Public Users Me Custom Dashboards Get" }, "example": [ { "id": "22222222-2222-2222-2222-222222222222", "name": "Pilotage portefeuille", "description": null, "is_shared": false, "widget_count": 3, "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } ] } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Bad Request — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "503": { "description": "Service Unavailable — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] }, "post": { "operationId": "users_custom-dashboards_create", "summary": "Créer un dashboard personnalisé pour le sujet délégué", "description": "Exige une allowlist explicite sur la clé et la capacité `custom_dashboards`.\n\n**Scope requis :** `users:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Délégation utilisateur :** exactement un header `X-Marko-Delegated-User-Id` ou `X-Marko-Delegated-User-Email`.\n\n**Accès complémentaire :** allowlist utilisateur explicite sur la clé et capacité `custom_dashboards`. Le sujet doit être approuvé et appartenir à la même entité.\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-custom-dashboards-create" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } }, { "name": "X-Marko-Delegated-User-Id", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." }, { "name": "X-Marko-Delegated-User-Email", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." } ], "tags": [ "users" ], "x-marko-route-group": "write", "x-marko-required-scope": "users:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "201": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CustomDashboardResponse" }, "example": { "id": "22222222-2222-2222-2222-222222222222", "name": "Pilotage portefeuille", "description": null, "user_id": "example", "layout": [], "filters": {}, "is_shared": false, "share_token": null, "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CustomDashboardCreate" }, "example": { "name": "Pilotage portefeuille", "layout": [ { "widget_type": "kpi_card", "title": "Total nominal" } ], "filters": { "fund_id": "fond_001" } } } } } } }, "/users/me/custom-dashboards/{dashboard_id}": { "get": { "operationId": "users_custom-dashboards_get", "summary": "Lire un dashboard personnalisé du sujet délégué", "description": "Retourne un dashboard possédé par le sujet utilisateur délégué.\n\n**Scope requis :** `users:read`. [Scopes et délégation](/scopes-and-delegation).\n\n**Délégation utilisateur :** exactement un header `X-Marko-Delegated-User-Id` ou `X-Marko-Delegated-User-Email`.\n\n**Accès complémentaire :** allowlist utilisateur explicite sur la clé et capacité `custom_dashboards`. Le sujet doit être approuvé et appartenir à la même entité.", "parameters": [ { "in": "path", "name": "dashboard_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Dashboard Id" }, "example": "22222222-2222-2222-2222-222222222222", "description": "Paramètre dashboard_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-custom-dashboards-get" }, { "name": "X-Marko-Delegated-User-Id", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." }, { "name": "X-Marko-Delegated-User-Email", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." } ], "tags": [ "users" ], "x-marko-route-group": "read", "x-marko-required-scope": "users:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CustomDashboardResponse" }, "example": { "id": "22222222-2222-2222-2222-222222222222", "name": "Pilotage portefeuille", "description": null, "user_id": "example", "layout": [], "filters": {}, "is_shared": false, "share_token": null, "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Bad Request — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] }, "put": { "operationId": "users_custom-dashboards_update", "summary": "Mettre à jour un dashboard personnalisé du sujet délégué", "description": "Exige une allowlist explicite sur la clé et la capacité `custom_dashboards`.\n\n**Scope requis :** `users:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Délégation utilisateur :** exactement un header `X-Marko-Delegated-User-Id` ou `X-Marko-Delegated-User-Email`.\n\n**Accès complémentaire :** allowlist utilisateur explicite sur la clé et capacité `custom_dashboards`. Le sujet doit être approuvé et appartenir à la même entité.", "parameters": [ { "in": "path", "name": "dashboard_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Dashboard Id" }, "example": "22222222-2222-2222-2222-222222222222", "description": "Paramètre dashboard_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-custom-dashboards-update" }, { "name": "X-Marko-Delegated-User-Id", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." }, { "name": "X-Marko-Delegated-User-Email", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." } ], "tags": [ "users" ], "x-marko-route-group": "write", "x-marko-required-scope": "users:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CustomDashboardResponse" }, "example": { "id": "22222222-2222-2222-2222-222222222222", "name": "Pilotage portefeuille v2", "description": null, "user_id": "example", "layout": [], "filters": {}, "is_shared": false, "share_token": null, "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Bad Request — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "409": { "description": "Conflict — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CustomDashboardUpdate" }, "example": { "name": "Pilotage portefeuille v2", "is_shared": false } } } } }, "delete": { "operationId": "users_custom-dashboards_delete", "summary": "Supprimer un dashboard personnalisé du sujet délégué", "description": "Exige une allowlist explicite sur la clé et la capacité `custom_dashboards`.\n\n**Scope requis :** `users:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Délégation utilisateur :** exactement un header `X-Marko-Delegated-User-Id` ou `X-Marko-Delegated-User-Email`.\n\n**Accès complémentaire :** allowlist utilisateur explicite sur la clé et capacité `custom_dashboards`. Le sujet doit être approuvé et appartenir à la même entité.", "parameters": [ { "in": "path", "name": "dashboard_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Dashboard Id" }, "example": "22222222-2222-2222-2222-222222222222", "description": "Paramètre dashboard_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-custom-dashboards-delete" }, { "name": "X-Marko-Delegated-User-Id", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." }, { "name": "X-Marko-Delegated-User-Email", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." } ], "tags": [ "users" ], "x-marko-route-group": "write", "x-marko-required-scope": "users:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "204": { "description": "Successful response" }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Bad Request — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "409": { "description": "Conflict — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/users/me/rgpd/export": { "get": { "operationId": "users_rgpd_export", "summary": "Exporter les données personnelles du sujet délégué", "description": "Exige une allowlist explicite sur la clé et la capacité `rgpd_export`.\n\n**Scope requis :** `users:read`. [Scopes et délégation](/scopes-and-delegation).\n\n**Délégation utilisateur :** exactement un header `X-Marko-Delegated-User-Id` ou `X-Marko-Delegated-User-Email`.\n\n**Accès complémentaire :** allowlist utilisateur explicite sur la clé et capacité `rgpd_export`. Le sujet doit être approuvé et appartenir à la même entité.\n\n[Export, inventaire et effacement RGPD](/privacy-guide).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-rgpd-export" }, { "name": "X-Marko-Delegated-User-Id", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." }, { "name": "X-Marko-Delegated-User-Email", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." } ], "tags": [ "users" ], "x-marko-route-group": "read", "x-marko-required-scope": "users:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DelegatedPrivacyExport" }, "example": { "schema_version": "marko_privacy_export/v2", "scope_version": "example", "personal_source_registry_version": "example", "export_id": "11111111-1111-4111-8111-111111111111", "export_date": "2026-10-01T10:00:00Z", "user_id": "usr_001", "data_environment": "example", "profile": { "id": "example", "email": "ops@clubfunding.fr", "name": "Exemple MARKO", "first_name": null, "last_name": null, "role": "example", "status": "instruction", "entity_slug": null, "created_at": null, "updated_at": null }, "preferences": {}, "notifications": [], "audit_entries": [], "demo_state": [], "privacy_cases": [], "pappers_request_metadata": [], "entity_databases": { "scope": "example", "entity_slugs": [], "data_environment": "example", "entities": [] }, "manifest": { "schema_version": "example", "scope_version": "example", "requested_entity_slug": "example", "requested_data_environment": "example", "data_scopes": [], "generated_at": "2026-10-01T10:00:00Z", "complete": false, "required_source_count": 0, "completed_required_source_count": 0, "failed_required_sources": [], "sources": [], "limitations": [], "manifest_sha256": "example", "privacy_case_status": "example", "final_status_after_delivery": "example", "case_finalization_pending": false, "certificate_reference": null, "temporary_download_url": null } } } }, "headers": { "Content-Disposition": { "schema": { "type": "string" }, "description": "attachment; filename=marko_rgpd_export.json" }, "Cache-Control": { "schema": { "type": "string" }, "description": "no-store" }, "X-Marko-Export-Schema": { "schema": { "type": "string" }, "description": "marko_privacy_export/v2" }, "X-Marko-Privacy-Case-Id": { "schema": { "type": "string", "format": "uuid" }, "description": "Identifiant du dossier associé à cet export." } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Bad Request — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/users/me/rgpd/inventory": { "get": { "operationId": "users_rgpd_inventory", "summary": "Lister l'inventaire RGPD du sujet délégué", "description": "Exige une allowlist explicite sur la clé et la capacité `rgpd_inventory`.\n\n**Scope requis :** `users:read`. [Scopes et délégation](/scopes-and-delegation).\n\n**Délégation utilisateur :** exactement un header `X-Marko-Delegated-User-Id` ou `X-Marko-Delegated-User-Email`.\n\n**Accès complémentaire :** allowlist utilisateur explicite sur la clé et capacité `rgpd_inventory`. Le sujet doit être approuvé et appartenir à la même entité.\n\n[Export, inventaire et effacement RGPD](/privacy-guide).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-rgpd-inventory" }, { "name": "X-Marko-Delegated-User-Id", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." }, { "name": "X-Marko-Delegated-User-Email", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." } ], "tags": [ "users" ], "x-marko-route-group": "read", "x-marko-required-scope": "users:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DelegatedDataInventory" }, "example": { "user_id": "usr_001", "auth_database": { "user": { "table": "example", "fields": [], "pii_fields": [], "has_data": true } }, "entity_databases": { "scope": "example", "entity_slugs": [], "warnings": [], "tables_with_user_references": [], "note": "example", "entities": [] } } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Bad Request — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/users/me/rgpd/erasure": { "delete": { "operationId": "users_rgpd_erasure", "summary": "Exercer le droit à l'effacement pour le sujet délégué", "description": "Exige une allowlist explicite sur la clé et la capacité `rgpd_erasure`, avec `{\"confirm\": true}`.\n\n**Scope requis :** `users:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Délégation utilisateur :** exactement un header `X-Marko-Delegated-User-Id` ou `X-Marko-Delegated-User-Email`.\n\n**Accès complémentaire :** allowlist utilisateur explicite sur la clé et capacité `rgpd_erasure`. Le sujet doit être approuvé et appartenir à la même entité.\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).\n\n[Export, inventaire et effacement RGPD](/privacy-guide).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-users-rgpd-erasure" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } }, { "name": "X-Marko-Delegated-User-Id", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." }, { "name": "X-Marko-Delegated-User-Email", "in": "header", "required": false, "schema": { "type": "string" }, "description": "Fournir exactement un des deux headers de délégation (Id ou Email), dans la même entité. Ils sont mutuellement exclusifs. Voir le guide Scopes et délégation." } ], "tags": [ "users" ], "x-marko-route-group": "write", "x-marko-required-scope": "users:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Dossier d'effacement terminé; réponse limitée aux métadonnées.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DelegatedErasureResult" }, "example": { "privacy_case_id": "11111111-1111-4111-8111-111111111111", "status": "intake", "result_mode": "metadata_only", "reconciliation_required": false, "manual_review_required": false, "certificate_reference": null, "completed_at": null, "actions": [ "delegated_erasure_completed" ], "replayed": false } } }, "headers": { "Idempotency-Key": { "schema": { "type": "string" }, "description": "Clé d'idempotence utilisée pour l'action." }, "X-Marko-Idempotency-Key-Source": { "schema": { "type": "string", "enum": [ "client", "server" ] }, "description": "Origine de la clé utilisée." }, "X-Marko-Idempotency-TTL-Seconds": { "schema": { "type": "integer" }, "description": "Durée de rétention annoncée pour cette action, en secondes." } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "503": { "description": "Service Unavailable — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "202": { "description": "Effacement durable accepté; le dossier n'est pas encore terminé.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DelegatedErasureResult" } } }, "headers": { "Idempotency-Key": { "schema": { "type": "string" }, "description": "Clé d'idempotence utilisée pour l'action." }, "X-Marko-Idempotency-Key-Source": { "schema": { "type": "string", "enum": [ "client", "server" ] }, "description": "Origine de la clé utilisée." }, "X-Marko-Idempotency-TTL-Seconds": { "schema": { "type": "integer" }, "description": "Durée de rétention annoncée pour cette action, en secondes." } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DelegatedUserErasureRequest" }, "example": { "confirm": true } } } } } }, "/settings": { "get": { "operationId": "settings_get", "summary": "Lire les paramètres de l'entité", "description": "Expose les paramètres métier et branding de l'entité.\n\n**Scope requis :** `settings:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-settings-get" } ], "tags": [ "settings" ], "x-marko-route-group": "read", "x-marko-required-scope": "settings:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EntityAdminSettingsResponse" }, "example": { "id": "11111111-1111-1111-1111-111111111111", "name": "Clubfunding", "type": "example", "mode_reporting": "trimestriel", "frequence_reporting": 3, "risk_threshold": 75, "portfolio_goals": {}, "ai_enabled": true } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] }, "put": { "operationId": "settings_update", "summary": "Mettre à jour les paramètres de l'entité", "description": "Met à jour les paramètres de reporting et de branding de l'entité.\n\n**Scope requis :** `settings:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-settings-update" } ], "tags": [ "settings" ], "x-marko-route-group": "write", "x-marko-required-scope": "settings:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EntityAdminSettingsResponse" }, "example": { "id": "example", "name": "Exemple MARKO", "type": "example", "mode_reporting": "example", "frequence_reporting": 0, "risk_threshold": 80, "zone_vacances": "A", "portfolio_goals": {} } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "503": { "description": "Service Unavailable — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EntityAdminSettingsUpdate" }, "example": { "risk_threshold": 80, "zone_vacances": "A" } } }, "required": true } } }, "/rcci/summary": { "get": { "operationId": "rcci_summary", "summary": "Synthèse RCCI", "description": "Agrège les covenants en tension, les documents manquants et les opérations à risque de l'entité.\n\n**Scope requis :** `portfolio:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "query", "name": "risk_threshold", "required": false, "schema": { "type": "integer", "maximum": 100, "minimum": 0, "description": "Seuil de score de risque", "default": 40, "title": "Risk Threshold" }, "example": 40, "description": "Seuil de score de risque" }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-rcci-summary" } ], "tags": [ "rcci" ], "x-marko-route-group": "read", "x-marko-required-scope": "portfolio:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RCCISummaryResponse" }, "example": { "covenants_breach_count": 2, "covenants_warning_count": 3, "documents_missing_count": 4, "operations_at_risk_count": 1, "covenants": [], "documents": [], "risk_operations": [] } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/field-definitions": { "get": { "operationId": "field-definitions_list", "summary": "Lister le dictionnaire de champs", "description": "Expose le référentiel métier des champs MARKO avec filtres et pagination.\n\n**Scope requis :** `operations:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 200, "minimum": 1, "default": 20, "title": "Limit" }, "example": 20, "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, { "in": "query", "name": "offset", "required": false, "schema": { "type": "integer", "minimum": 0, "default": 0, "title": "Offset" }, "example": 0, "description": "Nombre de résultats à ignorer avant cette page (commence à 0)." }, { "in": "query", "name": "importance", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Filter by importance (essentielle, utile, optionnelle)", "title": "Importance" }, "example": "essentielle", "description": "Filter by importance (essentielle, utile, optionnelle)" }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-field-definitions-list" }, { "name": "verticale", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Filter by verticale", "title": "Verticale" }, "description": "Filter by verticale" }, { "name": "page_onglet", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Filter by page/onglet", "title": "Page Onglet" }, "description": "Filter by page/onglet" }, { "name": "source_type", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Filter by source_type (document, calculation, hybrid, manual)", "title": "Source Type" }, "description": "Filter by source_type (document, calculation, hybrid, manual)" }, { "name": "value_type", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Filter by value_type", "title": "Value Type" }, "description": "Filter by value_type" }, { "name": "search", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Search by label_fr or field_key", "title": "Search" }, "description": "Search by label_fr or field_key" } ], "tags": [ "field-definitions" ], "x-marko-route-group": "read", "x-marko-required-scope": "operations:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedResponse_FieldDefinitionListResponse_" }, "example": { "items": [ { "id": "11111111-1111-1111-1111-111111111111", "field_key": "montant_pret", "table_name": "example", "column_name": "example", "label_fr": "Montant du prêt", "value_type": "texte", "importance": "essentielle", "is_required": false, "source_type": "document" } ], "total": 1, "limit": 20, "offset": 0 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/field-definitions/by-key/{field_key}": { "get": { "operationId": "field-definitions_by-key", "summary": "Récupérer une définition de champ par clé", "description": "Retourne la définition détaillée d'un champ métier par field_key.\n\n**Scope requis :** `operations:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "field_key", "required": true, "schema": { "type": "string", "title": "Field Key" }, "example": "montant_pret", "description": "Paramètre field_key pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-field-definitions-by-key" } ], "tags": [ "field-definitions" ], "x-marko-route-group": "read", "x-marko-required-scope": "operations:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FieldDefinitionResponse" }, "example": { "id": "11111111-1111-1111-1111-111111111111", "field_key": "montant_pret", "table_name": "example", "column_name": "example", "label_fr": "Montant du prêt", "value_type": "texte", "importance": "essentielle", "is_required": false, "source_type": "document", "alert_1_enabled": false, "alert_2_enabled": false, "name_modifiable": false, "value_modifiable": false, "requires_human_validation": false, "version": 0, "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/field-definitions/{field_id}": { "get": { "operationId": "field-definitions_get", "summary": "Récupérer une définition de champ", "description": "Retourne la définition détaillée d'un champ métier par identifiant.\n\n**Scope requis :** `operations:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "field_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Field Id" }, "example": "11111111-1111-1111-1111-111111111111", "description": "Paramètre field_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-field-definitions-get" } ], "tags": [ "field-definitions" ], "x-marko-route-group": "read", "x-marko-required-scope": "operations:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FieldDefinitionResponse" }, "example": { "id": "11111111-1111-1111-1111-111111111111", "field_key": "montant_pret", "table_name": "example", "column_name": "example", "label_fr": "Montant du prêt", "value_type": "texte", "importance": "essentielle", "is_required": false, "source_type": "document", "alert_1_enabled": false, "alert_2_enabled": false, "name_modifiable": false, "value_modifiable": false, "requires_human_validation": false, "version": 0, "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/fonds/{fond_id}": { "get": { "operationId": "fonds_get", "summary": "Récupérer un fonds", "description": "Retourne le détail d'un fonds MARKO.\n\n**Scope requis :** `fonds:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "fond_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Fond Id" }, "example": "22222222-2222-2222-2222-222222222222", "description": "UUID MARKO du fonds." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-fonds-get" } ], "tags": [ "fonds" ], "x-marko-route-group": "read", "x-marko-required-scope": "fonds:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FondResponse" }, "example": { "name": "Clubfunding Debt I", "id": "22222222-2222-2222-2222-222222222222", "entity_id": "11111111-1111-4111-8111-111111111111", "created_at": "2026-10-01T10:00:00Z", "spv_count": 4 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] }, "put": { "operationId": "fonds_update", "summary": "Mettre à jour un fonds", "description": "Met à jour les métadonnées d'un fonds.\n\n**Scope requis :** `fonds:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "fond_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Fond Id" }, "example": "22222222-2222-2222-2222-222222222222", "description": "UUID MARKO du fonds." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-fonds-update" } ], "tags": [ "fonds" ], "x-marko-route-group": "write", "x-marko-required-scope": "fonds:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FondResponse" }, "example": { "name": "Clubfunding Debt I Updated", "id": "22222222-2222-2222-2222-222222222222", "entity_id": "11111111-1111-4111-8111-111111111111", "created_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FondUpdate" }, "example": { "name": "Clubfunding Debt I Updated" } } } } }, "delete": { "operationId": "fonds_delete", "summary": "Supprimer un fonds", "description": "Supprime logiquement un fonds.\n\n**Scope requis :** `fonds:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "fond_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Fond Id" }, "example": "22222222-2222-2222-2222-222222222222", "description": "UUID MARKO du fonds." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-fonds-delete" } ], "tags": [ "fonds" ], "x-marko-route-group": "write", "x-marko-required-scope": "fonds:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "204": { "description": "Successful response" }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/spvs/external/{external_id}": { "get": { "operationId": "spvs_external_get", "summary": "Récupérer une SPV par identifiant externe", "description": "Résout l'identifiant stable du partenaire vers la SPV MARKO.\n\n**Scope requis :** `spvs:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "external_id", "required": true, "schema": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_~-][A-Za-z0-9._:~-]{0,254}$", "title": "External Id" }, "example": "CF-SPV-001", "description": "Identifiant stable de votre système, dans le contexte de votre intégration." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-spvs-external-get" } ], "tags": [ "spvs" ], "x-marko-route-group": "read", "x-marko-required-scope": "spvs:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SPVResponse" }, "example": { "id": "33333333-3333-3333-3333-333333333333", "entity_id": "11111111-1111-1111-1111-111111111111", "name": "SPV Paris 19", "forme_juridique": "SAS", "siren": "123456782", "adresse": "10 rue de la République, 75019 Paris", "created_at": "2026-08-22T08:00:00Z", "updated_at": "2026-08-22T08:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] }, "put": { "operationId": "spvs_external_upsert", "summary": "Créer ou mettre à jour une SPV externe", "description": "Upsert synchrone par identifiant partenaire. Une ressource MARKO supprimée logiquement est restaurée avec le même UUID. existing_marko_id permet de lier explicitement une SPV existante lors du premier envoi.\n\n**Scope requis :** `spvs:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).", "parameters": [ { "in": "path", "name": "external_id", "required": true, "schema": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_~-][A-Za-z0-9._:~-]{0,254}$", "title": "External Id" }, "example": "CF-SPV-001", "description": "Identifiant stable de votre système, dans le contexte de votre intégration." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-spvs-external-upsert" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "spvs" ], "x-marko-route-group": "write", "x-marko-required-scope": "spvs:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "201": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalSPVSyncUpsertResponse" }, "example": { "external_id": "CF-SPV-001", "marko_id": "33333333-3333-3333-3333-333333333333", "outcome": "created", "resource": { "id": "33333333-3333-3333-3333-333333333333", "entity_id": "11111111-1111-1111-1111-111111111111", "name": "SPV Paris 19", "created_at": "2026-08-22T08:00:00Z", "updated_at": "2026-08-22T08:00:00Z" }, "taxonomy_additions": [], "request_id": "req_cf_spv_upsert" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "200": { "description": "Additional successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalSPVSyncUpsertResponse" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalSPVUpsertRequest" }, "example": { "name": "SPV Paris 19", "forme_juridique": "SAS", "siren": "123456782", "adresse": "10 rue de la République, 75019 Paris" } } } } } }, "/spvs/{spv_id}": { "get": { "operationId": "spvs_get", "summary": "Récupérer une SPV", "description": "Retourne le détail d'une SPV MARKO.\n\n**Scope requis :** `spvs:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "spv_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Spv Id" }, "example": "33333333-3333-3333-3333-333333333333", "description": "UUID MARKO de la SPV." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-spvs-get" } ], "tags": [ "spvs" ], "x-marko-route-group": "read", "x-marko-required-scope": "spvs:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SPVResponse" }, "example": { "name": "SPV Paris 19", "id": "33333333-3333-3333-3333-333333333333", "entity_id": "11111111-1111-4111-8111-111111111111", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] }, "put": { "operationId": "spvs_update", "summary": "Mettre à jour une SPV", "description": "Met à jour les attributs d'une SPV.\n\n**Scope requis :** `spvs:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "spv_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Spv Id" }, "example": "33333333-3333-3333-3333-333333333333", "description": "UUID MARKO de la SPV." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-spvs-update" } ], "tags": [ "spvs" ], "x-marko-route-group": "write", "x-marko-required-scope": "spvs:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SPVResponse" }, "example": { "name": "SPV Paris 19 Updated", "id": "33333333-3333-3333-3333-333333333333", "entity_id": "11111111-1111-4111-8111-111111111111", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SPVUpdate" }, "example": { "name": "SPV Paris 19 Updated" } } } } }, "delete": { "operationId": "spvs_delete", "summary": "Supprimer une SPV", "description": "Supprime logiquement une SPV.\n\n**Scope requis :** `spvs:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "spv_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Spv Id" }, "example": "33333333-3333-3333-3333-333333333333", "description": "UUID MARKO de la SPV." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-spvs-delete" } ], "tags": [ "spvs" ], "x-marko-route-group": "write", "x-marko-required-scope": "spvs:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "204": { "description": "Successful response" }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/search": { "get": { "operationId": "search_global", "summary": "Recherche globale", "description": "Recherche transversale sur operations, operateurs, SPV, fonds et documents.\n\n**Scope requis :** `search:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "query", "name": "q", "required": true, "schema": { "type": "string", "minLength": 2, "maxLength": 200, "description": "Search query", "title": "Q" }, "example": "marko", "description": "Search query" }, { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 20, "minimum": 1, "description": "Max results per group", "default": 5, "title": "Limit" }, "example": 5, "description": "Max results per group" }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-search-global" } ], "tags": [ "search" ], "x-marko-route-group": "read", "x-marko-required-scope": "search:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SearchResponse" }, "example": { "query": "marko", "groups": [], "total": 0 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/search/content": { "get": { "operationId": "search_content", "summary": "Recherche plein texte documentaire", "description": "Recherche full-text dans le contenu documentaire indexé.\n\n**Scope requis :** `search:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "query", "name": "q", "required": true, "schema": { "type": "string", "minLength": 2, "maxLength": 200, "description": "Full-text search query", "title": "Q" }, "example": "covenant", "description": "Full-text search query" }, { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 50, "minimum": 1, "description": "Max results", "default": 10, "title": "Limit" }, "example": 10, "description": "Max results" }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-search-content" } ], "tags": [ "search" ], "x-marko-route-group": "read", "x-marko-required-scope": "search:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ContentSearchResponse" }, "example": { "query": "covenant", "results": [], "total": 0 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/operateurs": { "get": { "operationId": "operateurs_list", "summary": "Lister les opérateurs", "description": "Expose les opérateurs et leurs métadonnées principales. Utilisez `name` pour une correspondance exacte insensible à la casse ou `search` pour une recherche partielle; ces filtres sont mutuellement exclusifs.\n\n**Scope requis :** `operateurs:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "query", "name": "name", "required": false, "schema": { "anyOf": [ { "type": "string", "maxLength": 255 }, { "type": "null" } ], "description": "Exact operator name, case-insensitive and trimmed; cannot be combined with search", "title": "Name", "maxLength": 255 }, "description": "Nom exact, insensible à la casse et aux espaces périphériques; ne peut pas être combiné avec `search`.", "example": "Promoteur Demo" }, { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 200, "minimum": 1, "default": 20, "title": "Limit" }, "description": "Nombre maximal de résultats.", "example": 20 }, { "in": "query", "name": "offset", "required": false, "schema": { "type": "integer", "minimum": 0, "default": 0, "title": "Offset" }, "description": "Décalage de pagination.", "example": 0 }, { "in": "query", "name": "search", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Partial name or SIREN search; cannot be combined with name", "title": "Search" }, "description": "Recherche partielle littérale sur le nom ou le SIREN; ne peut pas être combinée avec `name`." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operateurs-list" } ], "tags": [ "operateurs" ], "x-marko-route-group": "read", "x-marko-required-scope": "operateurs:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedResponse_OperateurResponse_" }, "example": { "items": [ { "name": "Promoteur Demo", "type": "promoteur", "id": "11111111-1111-4111-8111-111111111111", "data": {}, "source_extraction": false, "litiges_en_cours": false, "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } ], "total": 1, "limit": 0, "offset": 0 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Bad Request — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] }, "post": { "operationId": "operateurs_create", "summary": "Créer un opérateur", "description": "Crée un opérateur dans l'entité.\n\n**Scope requis :** `operateurs:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operateurs-create" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "operateurs" ], "x-marko-route-group": "write", "x-marko-required-scope": "operateurs:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "201": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OperateurResponse" }, "example": { "name": "Nouveau Promoteur", "id": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", "data": {}, "source_extraction": false, "litiges_en_cours": false, "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OperateurCreate" }, "example": { "name": "Nouveau Promoteur", "siren": "732829320", "type": "promoteur" } } } } } }, "/operateurs/external/{external_id}": { "get": { "operationId": "operateurs_external_get", "summary": "Récupérer un opérateur par identifiant externe", "description": "Résout l'identifiant stable du partenaire vers l'opérateur MARKO.\n\n**Scope requis :** `operateurs:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "external_id", "required": true, "schema": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_~-][A-Za-z0-9._:~-]{0,254}$", "title": "External Id" }, "example": "CF-OPERATEUR-001", "description": "Identifiant stable de votre système, dans le contexte de votre intégration." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operateurs-external-get" } ], "tags": [ "operateurs" ], "x-marko-route-group": "read", "x-marko-required-scope": "operateurs:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OperateurResponse" }, "example": { "id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa", "name": "Promoteur Demo", "siren": null, "data": {}, "source_extraction": false, "litiges_en_cours": false, "created_at": "2026-08-22T08:00:00Z", "updated_at": "2026-08-22T08:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] }, "put": { "operationId": "operateurs_external_upsert", "summary": "Créer ou mettre à jour un opérateur externe", "description": "Upsert synchrone par identifiant partenaire, sans exiger de SIREN. Une ressource supprimée logiquement est restaurée avec le même UUID; existing_marko_id lie explicitement une cible existante lors du premier envoi.\n\n**Scope requis :** `operateurs:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).", "parameters": [ { "in": "path", "name": "external_id", "required": true, "schema": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9_~-][A-Za-z0-9._:~-]{0,254}$", "title": "External Id" }, "example": "CF-OPERATEUR-001", "description": "Identifiant stable de votre système, dans le contexte de votre intégration." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operateurs-external-upsert" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "operateurs" ], "x-marko-route-group": "write", "x-marko-required-scope": "operateurs:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "201": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalOperateurSyncUpsertResponse" }, "example": { "external_id": "CF-OPERATEUR-001", "marko_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa", "outcome": "created", "resource": { "id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa", "name": "Promoteur Demo", "data": {}, "source_extraction": false, "litiges_en_cours": false, "created_at": "2026-08-22T08:00:00Z", "updated_at": "2026-08-22T08:00:00Z" }, "taxonomy_additions": [], "request_id": "req_cf_operateur_upsert" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "200": { "description": "Additional successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalOperateurSyncUpsertResponse" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExternalOperateurUpsertRequest" }, "example": { "name": "Promoteur Demo", "type": "promoteur", "data": {} } } } } } }, "/operateurs/{operateur_id}": { "get": { "operationId": "operateurs_get", "summary": "Récupérer un opérateur", "description": "Retourne le détail d'un opérateur.\n\n**Scope requis :** `operateurs:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "operateur_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Operateur Id" }, "example": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "description": "UUID MARKO de l'opérateur." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operateurs-get" } ], "tags": [ "operateurs" ], "x-marko-route-group": "read", "x-marko-required-scope": "operateurs:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OperateurResponse" }, "example": { "name": "Promoteur Demo", "id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "data": {}, "source_extraction": false, "litiges_en_cours": false, "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] }, "put": { "operationId": "operateurs_update", "summary": "Mettre à jour un opérateur", "description": "Met à jour l'identité ou les données d'un opérateur.\n\n**Scope requis :** `operateurs:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "operateur_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Operateur Id" }, "example": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "description": "UUID MARKO de l'opérateur." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operateurs-update" } ], "tags": [ "operateurs" ], "x-marko-route-group": "write", "x-marko-required-scope": "operateurs:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OperateurResponse" }, "example": { "name": "Promoteur Demo Updated", "id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "data": {}, "source_extraction": false, "litiges_en_cours": false, "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OperateurUpdate" }, "example": { "name": "Promoteur Demo Updated" } } } } }, "delete": { "operationId": "operateurs_delete", "summary": "Supprimer un opérateur", "description": "Supprime logiquement un opérateur.\n\n**Scope requis :** `operateurs:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "operateur_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Operateur Id" }, "example": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "description": "UUID MARKO de l'opérateur." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operateurs-delete" } ], "tags": [ "operateurs" ], "x-marko-route-group": "write", "x-marko-required-scope": "operateurs:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "204": { "description": "Successful response" }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/operateurs/{operateur_id}/third-party-risks": { "get": { "operationId": "operateurs_third-party-risks_list", "summary": "Lister les risques tiers d'un opérateur", "description": "Expose les événements de surveillance tiers rattachés à un opérateur.\n\n**Scope requis :** `third_party_risks:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "operateur_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Operateur Id" }, "example": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "description": "UUID MARKO de l'opérateur." }, { "in": "query", "name": "active_only", "required": false, "schema": { "type": "boolean", "description": "Only unresolved events", "default": false, "title": "Active Only" }, "example": true, "description": "Only unresolved events" }, { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 200, "minimum": 1, "default": 50, "title": "Limit" }, "example": 20, "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, { "in": "query", "name": "offset", "required": false, "schema": { "type": "integer", "minimum": 0, "default": 0, "title": "Offset" }, "example": 0, "description": "Nombre de résultats à ignorer avant cette page (commence à 0)." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operateurs-third-party-risks-list" }, { "name": "source", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Filter by source", "title": "Source" }, "description": "Filter by source" }, { "name": "severity", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "description": "Filter by severity", "title": "Severity" }, "description": "Filter by severity" } ], "tags": [ "operateurs" ], "x-marko-route-group": "read", "x-marko-required-scope": "third_party_risks:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedResponse_ThirdPartyRiskResponse_" }, "example": { "items": [ { "id": "11111111-1111-4111-8111-111111111111", "operateur_id": "11111111-1111-4111-8111-111111111111", "source": "example", "event_type": "example", "severity": "warning", "title": "Publication BODACC", "detected_at": "2026-10-01T10:00:00Z", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } ], "total": 1, "limit": 0, "offset": 0 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] }, "post": { "operationId": "operateurs_third-party-risks_create", "summary": "Créer un événement de risque tiers", "description": "Ajoute manuellement un événement de risque tiers pour un opérateur.\n\n**Scope requis :** `third_party_risks:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).", "parameters": [ { "in": "path", "name": "operateur_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Operateur Id" }, "example": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "description": "UUID MARKO de l'opérateur." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operateurs-third-party-risks-create" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "operateurs" ], "x-marko-route-group": "write", "x-marko-required-scope": "third_party_risks:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "201": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ThirdPartyRiskResponse" }, "example": { "id": "11111111-1111-4111-8111-111111111111", "operateur_id": "11111111-1111-4111-8111-111111111111", "source": "example", "event_type": "example", "severity": "warning", "title": "Alerte manuelle", "detected_at": "2026-10-01T10:00:00Z", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ThirdPartyRiskCreate" }, "example": { "operateur_id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "source": "manual", "event_type": "watchlist", "severity": "warning", "title": "Alerte manuelle" } } } } } }, "/operateurs/{operateur_id}/third-party-risks/summary": { "get": { "operationId": "operateurs_third-party-risks_summary", "summary": "Résumé des risques tiers", "description": "Retourne le score de risque tiers et les compteurs agrégés d'un opérateur.\n\n**Scope requis :** `third_party_risks:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "operateur_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Operateur Id" }, "example": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "description": "UUID MARKO de l'opérateur." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operateurs-third-party-risks-summary" } ], "tags": [ "operateurs" ], "x-marko-route-group": "read", "x-marko-required-scope": "third_party_risks:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ThirdPartyRiskSummary" }, "example": { "operateur_id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "active_events": 1, "risk_score": 42.0 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/operateurs/{operateur_id}/third-party-risks/{event_id}/resolve": { "post": { "operationId": "operateurs_third-party-risks_resolve", "summary": "Résoudre un risque tiers", "description": "Marque un événement tiers comme résolu.\n\n**Scope requis :** `third_party_risks:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "operateur_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Operateur Id" }, "example": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "description": "UUID MARKO de l'opérateur." }, { "in": "path", "name": "event_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Event Id" }, "example": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", "description": "Paramètre event_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operateurs-third-party-risks-resolve" } ], "tags": [ "operateurs" ], "x-marko-route-group": "write", "x-marko-required-scope": "third_party_risks:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ThirdPartyRiskResponse" }, "example": { "id": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", "operateur_id": "11111111-1111-4111-8111-111111111111", "source": "example", "event_type": "example", "severity": "example", "title": "example", "detected_at": "2026-10-01T10:00:00Z", "is_resolved": true, "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ThirdPartyRiskResolve" }, "example": { "resolved_at": "2026-04-13T10:00:00Z" } } } } } }, "/alerts": { "get": { "operationId": "alerts_list", "summary": "Lister les alertes", "description": "Expose la projection alertes de l'entité avec filtres.\n\n**Scope requis :** `alerts:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 200, "minimum": 1, "default": 20, "title": "Limit" }, "example": 20, "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, { "in": "query", "name": "offset", "required": false, "schema": { "type": "integer", "minimum": 0, "default": 0, "title": "Offset" }, "example": 0, "description": "Nombre de résultats à ignorer avant cette page (commence à 0)." }, { "in": "query", "name": "active_only", "required": false, "schema": { "type": "boolean", "default": false, "title": "Active Only" }, "example": true, "description": "Paramètre active_only pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-alerts-list" } ], "tags": [ "alerts" ], "x-marko-route-group": "read", "x-marko-required-scope": "alerts:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedResponse_AlertResponse_" }, "example": { "items": [ { "id": "11111111-1111-4111-8111-111111111111", "type": "example", "severity": "critical", "title": "Covenant en alerte", "target_url": "example", "read": false, "created_at": "2026-10-01T10:00:00Z" } ], "total": 1, "limit": 0, "offset": 0 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/alerts/{alert_id}": { "get": { "operationId": "alerts_get", "summary": "Récupérer une alerte", "description": "Retourne une alerte unitaire.\n\n**Scope requis :** `alerts:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "alert_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Alert Id" }, "example": "aaaaaaaa-1111-1111-1111-111111111111", "description": "Paramètre alert_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-alerts-get" } ], "tags": [ "alerts" ], "x-marko-route-group": "read", "x-marko-required-scope": "alerts:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AlertResponse" }, "example": { "id": "aaaaaaaa-1111-1111-1111-111111111111", "type": "example", "severity": "example", "title": "Covenant en alerte", "target_url": "example", "read": false, "created_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/alerts/{alert_id}/actions/acknowledge": { "post": { "operationId": "alerts_acknowledge", "summary": "Accuser réception d'une alerte", "description": "Passe l'alerte au statut acknowledged.\n\n**Scope requis :** `alerts:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "alert_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Alert Id" }, "example": "aaaaaaaa-1111-1111-1111-111111111111", "description": "Paramètre alert_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-alerts-acknowledge" } ], "tags": [ "alerts" ], "x-marko-route-group": "write", "x-marko-required-scope": "alerts:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AlertResponse" }, "example": { "id": "aaaaaaaa-1111-1111-1111-111111111111", "type": "example", "severity": "example", "title": "example", "target_url": "example", "read": false, "alert_status": "acknowledged", "created_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/alerts/{alert_id}/actions/resolve": { "post": { "operationId": "alerts_resolve", "summary": "Résoudre une alerte", "description": "Passe l'alerte au statut resolved.\n\n**Scope requis :** `alerts:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "alert_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Alert Id" }, "example": "aaaaaaaa-1111-1111-1111-111111111111", "description": "Paramètre alert_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-alerts-resolve" } ], "tags": [ "alerts" ], "x-marko-route-group": "write", "x-marko-required-scope": "alerts:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AlertResponse" }, "example": { "id": "aaaaaaaa-1111-1111-1111-111111111111", "type": "example", "severity": "example", "title": "example", "target_url": "example", "read": false, "alert_status": "resolved", "created_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/alerts/{alert_id}/actions/snooze": { "post": { "operationId": "alerts_snooze", "summary": "Mettre une alerte en snooze", "description": "Snooze une alerte pour quelques jours.\n\n**Scope requis :** `alerts:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "alert_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Alert Id" }, "example": "aaaaaaaa-1111-1111-1111-111111111111", "description": "Paramètre alert_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-alerts-snooze" } ], "tags": [ "alerts" ], "x-marko-route-group": "write", "x-marko-required-scope": "alerts:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AlertResponse" }, "example": { "id": "aaaaaaaa-1111-1111-1111-111111111111", "type": "example", "severity": "example", "title": "example", "target_url": "example", "read": false, "alert_status": "snoozed", "created_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AlertSnoozeRequest" }, "example": { "days": 7 } } } } } }, "/notifications": { "get": { "operationId": "notifications_list", "summary": "Lister les notifications", "description": "Expose les notifications de l'entité.\n\n**Scope requis :** `notifications:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 200, "minimum": 1, "default": 20, "title": "Limit" }, "example": 20, "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, { "in": "query", "name": "offset", "required": false, "schema": { "type": "integer", "minimum": 0, "default": 0, "title": "Offset" }, "example": 0, "description": "Nombre de résultats à ignorer avant cette page (commence à 0)." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-notifications-list" } ], "tags": [ "notifications" ], "x-marko-route-group": "read", "x-marko-required-scope": "notifications:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedResponse_NotificationResponse_" }, "example": { "items": [ { "id": "11111111-1111-4111-8111-111111111111", "type": "example", "severity": "example", "title": "Nouveau document", "target_url": "example", "read": false, "created_at": "2026-10-01T10:00:00Z" } ], "total": 1, "limit": 0, "offset": 0 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] }, "post": { "operationId": "notifications_create", "summary": "Créer une notification", "description": "Crée une notification ciblée dans l'entité.\n\n**Scope requis :** `notifications:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-notifications-create" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "notifications" ], "x-marko-route-group": "write", "x-marko-required-scope": "notifications:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "201": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationResponse" }, "example": { "id": "dddddddd-dddd-dddd-dddd-dddddddddddd", "type": "example", "severity": "example", "title": "Push partenaire", "target_url": "example", "read": false, "created_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationCreate" }, "example": { "type": "custom", "severity": "info", "title": "Push partenaire", "target_url": "/dashboard" } } } } } }, "/notifications/unread-count": { "get": { "operationId": "notifications_unread-count", "summary": "Compter les notifications non lues", "description": "Retourne le compteur unread et le flag critique.\n\n**Scope requis :** `notifications:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-notifications-unread-count" } ], "tags": [ "notifications" ], "x-marko-route-group": "read", "x-marko-required-scope": "notifications:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UnreadCountResponse" }, "example": { "count": 3, "has_critical": true } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/notifications/{notification_id}": { "get": { "operationId": "notifications_get", "summary": "Récupérer une notification", "description": "Retourne une notification unitaire.\n\n**Scope requis :** `notifications:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "notification_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Notification Id" }, "example": "cccccccc-cccc-cccc-cccc-cccccccccccc", "description": "Paramètre notification_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-notifications-get" } ], "tags": [ "notifications" ], "x-marko-route-group": "read", "x-marko-required-scope": "notifications:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationResponse" }, "example": { "id": "cccccccc-cccc-cccc-cccc-cccccccccccc", "type": "example", "severity": "example", "title": "Nouveau document", "target_url": "example", "read": false, "created_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] }, "delete": { "operationId": "notifications_delete", "summary": "Supprimer une notification", "description": "Supprime une notification de l'entité.\n\n**Scope requis :** `notifications:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "notification_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Notification Id" }, "example": "cccccccc-cccc-cccc-cccc-cccccccccccc", "description": "Paramètre notification_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-notifications-delete" } ], "tags": [ "notifications" ], "x-marko-route-group": "write", "x-marko-required-scope": "notifications:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "204": { "description": "Successful response" }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/notifications/{notification_id}/actions/read": { "post": { "operationId": "notifications_mark-read", "summary": "Marquer une notification comme lue", "description": "Passe le drapeau read à true.\n\n**Scope requis :** `notifications:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "notification_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Notification Id" }, "example": "cccccccc-cccc-cccc-cccc-cccccccccccc", "description": "Paramètre notification_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-notifications-mark-read" } ], "tags": [ "notifications" ], "x-marko-route-group": "write", "x-marko-required-scope": "notifications:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationResponse" }, "example": { "id": "cccccccc-cccc-cccc-cccc-cccccccccccc", "type": "example", "severity": "example", "title": "example", "target_url": "example", "read": true, "created_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/notifications/actions/read-all": { "post": { "operationId": "notifications_read-all", "summary": "Marquer tout comme lu", "description": "Marque toutes les notifications comme lues.\n\n**Scope requis :** `notifications:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-notifications-read-all" } ], "tags": [ "notifications" ], "x-marko-route-group": "write", "x-marko-required-scope": "notifications:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationReadAllResult" }, "example": { "marked_read": 12 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/notifications/{notification_id}/actions/false-positive": { "post": { "operationId": "notifications_false-positive", "summary": "Qualifier un faux positif", "description": "Marque une notification comme faux positif sans la supprimer.\n\n**Scope requis :** `notifications:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "notification_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Notification Id" }, "example": "cccccccc-cccc-cccc-cccc-cccccccccccc", "description": "Paramètre notification_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-notifications-false-positive" } ], "tags": [ "notifications" ], "x-marko-route-group": "write", "x-marko-required-scope": "notifications:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationResponse" }, "example": { "id": "cccccccc-cccc-cccc-cccc-cccccccccccc", "type": "example", "severity": "example", "title": "example", "target_url": "example", "read": false, "was_false_positive": true, "created_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/calendar/events": { "get": { "operationId": "calendar_list", "summary": "Lister les événements calendrier", "description": "Expose les échéances et événements persistés de l'entité.\n\n**Scope requis :** `calendar:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 200, "minimum": 1, "default": 20, "title": "Limit" }, "example": 20, "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, { "in": "query", "name": "offset", "required": false, "schema": { "type": "integer", "minimum": 0, "default": 0, "title": "Offset" }, "example": 0, "description": "Nombre de résultats à ignorer avant cette page (commence à 0)." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-calendar-list" } ], "tags": [ "calendar" ], "x-marko-route-group": "read", "x-marko-required-scope": "calendar:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CalendarEventListResponse" }, "example": { "items": [ { "title": "AG annuelle", "event_date": "2026-10-01", "event_type": "ag_date", "id": "11111111-1111-4111-8111-111111111111", "entity_id": "11111111-1111-4111-8111-111111111111", "source": "example", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } ], "total": 1 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] }, "post": { "operationId": "calendar_create", "summary": "Créer un événement calendrier", "description": "Crée un événement manuel ou IA persisté.\n\n**Scope requis :** `calendar:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-calendar-create" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "calendar" ], "x-marko-route-group": "write", "x-marko-required-scope": "calendar:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "201": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CalendarEventResponse" }, "example": { "title": "AG annuelle", "event_date": "2026-10-01", "event_type": "example", "id": "eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeef", "entity_id": "11111111-1111-4111-8111-111111111111", "source": "example", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CalendarEventCreate" }, "example": { "title": "AG annuelle", "event_date": "2026-06-30", "event_type": "ag_date" } } } } } }, "/calendar/events/{event_id}": { "get": { "operationId": "calendar_get", "summary": "Récupérer un événement calendrier", "description": "Retourne un événement calendrier unitaire.\n\n**Scope requis :** `calendar:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "event_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Event Id" }, "example": "eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee", "description": "Paramètre event_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-calendar-get" } ], "tags": [ "calendar" ], "x-marko-route-group": "read", "x-marko-required-scope": "calendar:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CalendarEventResponse" }, "example": { "title": "AG annuelle", "event_date": "2026-10-01", "event_type": "example", "id": "eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee", "entity_id": "11111111-1111-4111-8111-111111111111", "source": "example", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] }, "put": { "operationId": "calendar_update", "summary": "Mettre à jour un événement calendrier", "description": "Met à jour un événement calendrier.\n\n**Scope requis :** `calendar:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "event_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Event Id" }, "example": "eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee", "description": "Paramètre event_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-calendar-update" } ], "tags": [ "calendar" ], "x-marko-route-group": "write", "x-marko-required-scope": "calendar:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CalendarEventResponse" }, "example": { "title": "AG annuelle validée", "event_date": "2026-10-01", "event_type": "example", "id": "eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee", "entity_id": "11111111-1111-4111-8111-111111111111", "source": "example", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } }, "409": { "description": "Conflict — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CalendarEventUpdate" }, "example": { "title": "AG annuelle validée" } } } } }, "delete": { "operationId": "calendar_delete", "summary": "Supprimer un événement calendrier", "description": "Supprime un événement calendrier.\n\n**Scope requis :** `calendar:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "event_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Event Id" }, "example": "eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee", "description": "Paramètre event_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-calendar-delete" } ], "tags": [ "calendar" ], "x-marko-route-group": "write", "x-marko-required-scope": "calendar:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "204": { "description": "Successful response" }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/calendar/events/{event_id}/actions/accept": { "post": { "operationId": "calendar_accept", "summary": "Accepter un événement IA", "description": "Accepte un événement proposé.\n\n**Scope requis :** `calendar:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "event_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Event Id" }, "example": "eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee", "description": "Paramètre event_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-calendar-accept" } ], "tags": [ "calendar" ], "x-marko-route-group": "write", "x-marko-required-scope": "calendar:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CalendarEventResponse" }, "example": { "title": "example", "event_date": "2026-10-01", "event_type": "example", "id": "eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee", "entity_id": "11111111-1111-4111-8111-111111111111", "source": "example", "accepted": true, "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/calendar/events/{event_id}/actions/reject": { "post": { "operationId": "calendar_reject", "summary": "Rejeter un événement IA", "description": "Rejette un événement proposé.\n\n**Scope requis :** `calendar:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "event_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Event Id" }, "example": "eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee", "description": "Paramètre event_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-calendar-reject" } ], "tags": [ "calendar" ], "x-marko-route-group": "write", "x-marko-required-scope": "calendar:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CalendarEventResponse" }, "example": { "title": "example", "event_date": "2026-10-01", "event_type": "example", "id": "eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee", "entity_id": "11111111-1111-4111-8111-111111111111", "source": "example", "accepted": false, "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/enrichment/siren/{siren}": { "get": { "operationId": "enrichment_siren", "summary": "Lire les données société locales par SIREN", "description": "Retourne uniquement les données déjà en cache ou présentes dans la base locale. Cet endpoint de lecture ne déclenche aucun appel facturable.\n\n**Scope requis :** `operateurs:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "siren", "required": true, "schema": { "type": "string", "title": "Siren" }, "example": "552120222", "description": "SIREN français sur 9 chiffres; le service vérifie aussi le checksum lorsque la route le prévoit." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-enrichment-siren" } ], "tags": [ "enrichment" ], "x-marko-route-group": "read", "x-marko-required-scope": "operateurs:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SIRENEnrichmentResponse" }, "example": { "success": true, "data": { "siren": "552120222", "raison_sociale": "Societe Generale", "forme_juridique": "SA", "source": "manual", "is_radiee": false }, "cached": false, "error": null } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/enrichment/siren/{siren}/resolve": { "post": { "operationId": "enrichment_siren_resolve", "summary": "Résoudre une société par SIREN via Pappers", "description": "Résout d'abord les données locales puis réserve de façon idempotente tout appel Pappers facturable. Requiert le header Idempotency-Key.\n\n**Scope requis :** `operateurs:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).", "parameters": [ { "in": "path", "name": "siren", "required": true, "schema": { "type": "string", "title": "Siren" }, "example": "552120222", "description": "SIREN français sur 9 chiffres; le service vérifie aussi le checksum lorsque la route le prévoit." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-enrichment-siren-resolve" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "enrichment" ], "x-marko-route-group": "write", "x-marko-required-scope": "operateurs:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SIRENEnrichmentResponse" }, "example": { "success": true, "data": { "siren": "552120222", "raison_sociale": "Societe Generale", "forme_juridique": "SA", "source": "pappers", "is_radiee": false }, "cached": false, "error": null } } }, "headers": { "Idempotency-Key": { "schema": { "type": "string" }, "description": "Clé d'idempotence utilisée pour l'action." }, "X-Marko-Idempotency-Key-Source": { "schema": { "type": "string", "enum": [ "client", "server" ] }, "description": "Origine de la clé utilisée." }, "X-Marko-Idempotency-TTL-Seconds": { "schema": { "type": "integer" }, "description": "Durée de rétention annoncée pour cette action, en secondes." } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/enrichment/siren/{siren}/validate": { "get": { "operationId": "enrichment_siren_validate", "summary": "Valider un SIREN", "description": "Vérifie le format et le checksum Luhn d'un SIREN sans appeler un provider externe.\n\n**Scope requis :** `operateurs:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "siren", "required": true, "schema": { "type": "string", "title": "Siren" }, "example": "552120222", "description": "SIREN français sur 9 chiffres; le service vérifie aussi le checksum lorsque la route le prévoit." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-enrichment-siren-validate" } ], "tags": [ "enrichment" ], "x-marko-route-group": "read", "x-marko-required-scope": "operateurs:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SIRENValidationResponse" }, "example": { "siren": "552120222", "valid": true, "luhn_valid": true, "message": null } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/enrichment/siren/{siren}/cache": { "delete": { "operationId": "enrichment_siren_invalidate-cache", "summary": "Invalider le cache SIREN", "description": "Supprime l'entrée de cache. Une nouvelle résolution provider exige ensuite POST /v1/enrichment/siren/{siren}/resolve.\n\n**Scope requis :** `operateurs:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "siren", "required": true, "schema": { "type": "string", "title": "Siren" }, "example": "552120222", "description": "SIREN français sur 9 chiffres; le service vérifie aussi le checksum lorsque la route le prévoit." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-enrichment-siren-invalidate-cache" } ], "tags": [ "enrichment" ], "x-marko-route-group": "write", "x-marko-required-scope": "operateurs:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "204": { "description": "Successful response" }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/operations/{operation_id}/repayments": { "get": { "operationId": "operations_repayments_list", "summary": "Lister l'historique de remboursements", "description": "Retourne les remboursements saisis sur une opération avec pagination.\n\n**Scope requis :** `operations:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "operation_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Operation Id" }, "example": "44444444-4444-4444-4444-444444444444", "description": "UUID MARKO de l'opération." }, { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 200, "minimum": 1, "default": 20, "title": "Limit" }, "example": 20, "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, { "in": "query", "name": "offset", "required": false, "schema": { "type": "integer", "minimum": 0, "default": 0, "title": "Offset" }, "example": 0, "description": "Nombre de résultats à ignorer avant cette page (commence à 0)." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operations-repayments-list" } ], "tags": [ "operations" ], "x-marko-route-group": "read", "x-marko-required-scope": "operations:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedResponse_RepaymentHistoryResponse_" }, "example": { "items": [ { "id": "99999999-9999-9999-9999-999999999999", "operation_id": "44444444-4444-4444-4444-444444444444", "date": "2026-03-31", "principal": "50000.00", "interest": "4200.00", "total": "54200.00", "remaining_balance": "950000.00", "source": "manual", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } ], "total": 1, "limit": 20, "offset": 0 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] }, "post": { "operationId": "operations_repayments_create", "summary": "Créer un remboursement", "description": "Enregistre un remboursement sur une opération.\n\n**Scope requis :** `operations:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).", "parameters": [ { "in": "path", "name": "operation_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Operation Id" }, "example": "44444444-4444-4444-4444-444444444444", "description": "UUID MARKO de l'opération." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-operations-repayments-create" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "operations" ], "x-marko-route-group": "write", "x-marko-required-scope": "operations:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "201": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RepaymentHistoryResponse" }, "example": { "id": "99999999-9999-9999-9999-999999999999", "operation_id": "44444444-4444-4444-4444-444444444444", "date": "2026-03-31", "principal": "50000.00", "interest": "4200.00", "total": "54200.00", "remaining_balance": "950000.00", "source": "manual", "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RepaymentHistoryCreate" }, "example": { "date": "2026-03-31", "principal": "50000.00", "interest": "4200.00", "total": "54200.00", "remaining_balance": "950000.00", "source": "manual" } } } } } }, "/reports/inrev": { "get": { "operationId": "reports_inrev", "summary": "Exporter le reporting INREV", "description": "Génère le classeur INREV standard de l'entité au format XLSX.\n\n**Scope requis :** `reporting:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-reports-inrev" } ], "tags": [ "reports" ], "x-marko-route-group": "read", "x-marko-required-scope": "reporting:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": { "schema": { "type": "string", "format": "binary" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "501": { "description": "Not Implemented — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/reporting/templates": { "get": { "operationId": "reporting_list", "summary": "Lister les templates de reporting", "description": "Expose les templates de reporting configurés pour l'entité.\n\n**Scope requis :** `reporting:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 200, "minimum": 1, "default": 20, "title": "Limit" }, "example": 20, "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, { "in": "query", "name": "offset", "required": false, "schema": { "type": "integer", "minimum": 0, "default": 0, "title": "Offset" }, "example": 0, "description": "Nombre de résultats à ignorer avant cette page (commence à 0)." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-reporting-list" } ], "tags": [ "reporting" ], "x-marko-route-group": "read", "x-marko-required-scope": "reporting:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReportingTemplatePage" }, "example": { "items": [ { "id": "11111111-1111-4111-8111-111111111111", "name": "Quarterly Pack", "template_type": "quarterly", "format": "example", "version": 0, "is_default": false, "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } ], "total": 1, "limit": 0, "offset": 0 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "503": { "description": "Service Unavailable — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] }, "post": { "operationId": "reporting_create", "summary": "Créer un template de reporting", "description": "Crée un template de reporting personnalisé.\n\n**Scope requis :** `reporting:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-reporting-create" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "reporting" ], "x-marko-route-group": "write", "x-marko-required-scope": "reporting:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "201": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReportingTemplateResponse" }, "example": { "id": "ffffffff-ffff-ffff-ffff-fffffffffffe", "name": "Quarterly Pack", "template_type": "example", "format": "example", "version": 0, "is_default": false, "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReportingTemplateCreate" }, "example": { "name": "Quarterly Pack", "template_type": "quarterly", "format": "pdf" } } } } } }, "/reporting/templates/{template_id}": { "get": { "operationId": "reporting_get", "summary": "Récupérer un template de reporting", "description": "Retourne le détail d'un template de reporting.\n\n**Scope requis :** `reporting:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "template_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Template Id" }, "example": "ffffffff-ffff-ffff-ffff-ffffffffffff", "description": "Paramètre template_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-reporting-get" } ], "tags": [ "reporting" ], "x-marko-route-group": "read", "x-marko-required-scope": "reporting:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReportingTemplateResponse" }, "example": { "id": "ffffffff-ffff-ffff-ffff-ffffffffffff", "name": "Quarterly Pack", "template_type": "example", "format": "example", "version": 0, "is_default": false, "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] }, "put": { "operationId": "reporting_update", "summary": "Mettre à jour un template de reporting", "description": "Met à jour un template existant.\n\n**Scope requis :** `reporting:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "template_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Template Id" }, "example": "ffffffff-ffff-ffff-ffff-ffffffffffff", "description": "Paramètre template_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-reporting-update" } ], "tags": [ "reporting" ], "x-marko-route-group": "write", "x-marko-required-scope": "reporting:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReportingTemplateResponse" }, "example": { "id": "ffffffff-ffff-ffff-ffff-ffffffffffff", "name": "Quarterly Pack v2", "template_type": "example", "format": "example", "version": 0, "is_default": false, "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReportingTemplateUpdate" }, "example": { "name": "Quarterly Pack v2" } } } } }, "delete": { "operationId": "reporting_delete", "summary": "Supprimer un template de reporting", "description": "Supprime un template de reporting non système.\n\n**Scope requis :** `reporting:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "template_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Template Id" }, "example": "ffffffff-ffff-ffff-ffff-ffffffffffff", "description": "Paramètre template_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-reporting-delete" } ], "tags": [ "reporting" ], "x-marko-route-group": "write", "x-marko-required-scope": "reporting:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "204": { "description": "Successful response" }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/reporting/templates/{template_id}/preview": { "get": { "operationId": "reporting_preview", "summary": "Prévisualiser un template de reporting", "description": "Retourne un aperçu tabulaire d'un template.\n\n**Scope requis :** `reporting:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "template_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Template Id" }, "example": "ffffffff-ffff-ffff-ffff-ffffffffffff", "description": "Paramètre template_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 50, "minimum": 1, "default": 10, "title": "Limit" }, "example": 10, "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-reporting-preview" } ], "tags": [ "reporting" ], "x-marko-route-group": "read", "x-marko-required-scope": "reporting:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReportingTemplatePreview" }, "example": { "template": { "id": "11111111-1111-4111-8111-111111111111", "name": "Exemple MARKO", "template_type": "example", "format": "example", "version": 0, "is_default": false, "created_at": "2026-10-01T10:00:00Z", "updated_at": "2026-10-01T10:00:00Z" }, "headers": [ "operation_name", "status" ], "rows": [ { "operation_name": "Demo Deal", "status": "instruction" } ], "total_rows": 0 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/workflows/presets": { "get": { "operationId": "workflows_presets", "summary": "Lister les presets de workflows", "description": "Expose les presets d'automatisation supportés.\n\n**Scope requis :** `workflows:read`. [Scopes et délégation](/scopes-and-delegation).\n\n[Workflows et extraction IA](/workflows-guide).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-workflows-presets" } ], "tags": [ "workflows" ], "x-marko-route-group": "read", "x-marko-required-scope": "workflows:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/WorkflowPreset" } }, "example": [ { "key": "kpi-monthly-snapshot", "label": "Snapshot KPI mensuel", "type": "example", "scope": "example", "impact": "example", "default_schedule_kind": "example", "default_schedule_config": {}, "config_defaults": {}, "fields": [] } ] } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/workflows": { "get": { "operationId": "workflows_list", "summary": "Lister les workflows", "description": "Expose les automatisations système et personnalisées de l'entité.\n\n**Scope requis :** `workflows:read`. [Scopes et délégation](/scopes-and-delegation).\n\n[Workflows et extraction IA](/workflows-guide).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-workflows-list" } ], "tags": [ "workflows" ], "x-marko-route-group": "read", "x-marko-required-scope": "workflows:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/WorkflowDefinition" } }, "example": [ { "id": "kpi-monthly-snapshot", "name": "Exemple MARKO", "description": "example", "type": "example", "schedule": "example", "enabled": true, "custom": false, "editable": false, "deletable": false, "toggleable": false, "source": "example", "scope": "example", "impact": "example", "job_types": [], "preset_key": null, "status": "instruction", "schedule_kind": null, "schedule_config": {}, "config": {}, "last_run_at": null, "next_run_at": null, "last_error": null } ] } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/workflows/{workflow_id}/actions/toggle": { "post": { "operationId": "workflows_toggle", "summary": "Activer ou désactiver un workflow", "description": "Bascule l'état d'un workflow système ou personnalisé.\n\n**Scope requis :** `workflows:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).\n\n[Workflows et extraction IA](/workflows-guide).", "parameters": [ { "in": "path", "name": "workflow_id", "required": true, "schema": { "type": "string", "title": "Workflow Id" }, "example": "kpi-monthly-snapshot", "description": "Clé du workflow; certaines routes utilisent une chaîne, d'autres un UUID. Respectez le type de cette route." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-workflows-toggle" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "workflows" ], "x-marko-route-group": "write", "x-marko-required-scope": "workflows:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WorkflowDefinition" }, "example": { "id": "kpi-monthly-snapshot", "name": "Exemple MARKO", "description": "example", "type": "example", "schedule": "example", "enabled": false, "custom": false, "editable": false, "deletable": false, "toggleable": false, "source": "example", "scope": "example", "impact": "example", "job_types": [], "preset_key": null, "status": "instruction", "schedule_kind": null, "schedule_config": {}, "config": {}, "last_run_at": null, "next_run_at": null, "last_error": null } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/workflows/workflow-definitions": { "post": { "operationId": "workflows_create", "summary": "Créer un workflow personnalisé", "description": "Crée une définition de workflow personnalisée.\n\n**Scope requis :** `workflows:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).\n\n[Workflows et extraction IA](/workflows-guide).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-workflows-create" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "workflows" ], "x-marko-route-group": "write", "x-marko-required-scope": "workflows:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "201": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WorkflowDefinition" }, "example": { "id": "custom-workflow-1", "name": "Exemple MARKO", "description": "example", "type": "example", "schedule": "example", "enabled": false, "custom": true, "editable": false, "deletable": false, "toggleable": false, "source": "example", "scope": "example", "impact": "example", "job_types": [], "preset_key": null, "status": "instruction", "schedule_kind": null, "schedule_config": {}, "config": {}, "last_run_at": null, "next_run_at": null, "last_error": null } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WorkflowDefinitionCreate" }, "example": { "name": "Run closing kickoff tasks", "preset_key": "closing_kickoff_tasks" } } }, "required": true } } }, "/workflows/workflow-definitions/{definition_id}": { "put": { "operationId": "workflows_update", "summary": "Mettre à jour un workflow personnalisé", "description": "Met à jour une définition de workflow personnalisée.\n\n**Scope requis :** `workflows:write`. [Scopes et délégation](/scopes-and-delegation).\n\n[Workflows et extraction IA](/workflows-guide).", "parameters": [ { "in": "path", "name": "definition_id", "required": true, "schema": { "type": "string", "title": "Definition Id" }, "example": "custom-workflow-1", "description": "Paramètre definition_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-workflows-update" } ], "tags": [ "workflows" ], "x-marko-route-group": "write", "x-marko-required-scope": "workflows:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WorkflowDefinition" }, "example": { "id": "custom-workflow-1", "name": "Exemple MARKO", "description": "Workflow updated by smoke runner", "type": "example", "schedule": "example", "enabled": false, "custom": false, "editable": false, "deletable": false, "toggleable": false, "source": "example", "scope": "example", "impact": "example", "job_types": [], "preset_key": null, "status": "instruction", "schedule_kind": null, "schedule_config": {}, "config": {}, "last_run_at": null, "next_run_at": null, "last_error": null } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WorkflowDefinitionUpdate" }, "example": { "description": "Workflow updated by smoke runner" } } } } }, "delete": { "operationId": "workflows_delete", "summary": "Supprimer un workflow personnalisé", "description": "Supprime une définition de workflow personnalisée.\n\n**Scope requis :** `workflows:write`. [Scopes et délégation](/scopes-and-delegation).\n\n[Workflows et extraction IA](/workflows-guide).", "parameters": [ { "in": "path", "name": "definition_id", "required": true, "schema": { "type": "string", "title": "Definition Id" }, "example": "custom-workflow-1", "description": "Paramètre definition_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-workflows-delete" } ], "tags": [ "workflows" ], "x-marko-route-group": "write", "x-marko-required-scope": "workflows:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "204": { "description": "Successful response" }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/workflows/workflow-definitions/{definition_id}/run": { "post": { "operationId": "workflows_run", "summary": "Lancer un workflow maintenant", "description": "Déclenche une exécution manuelle d'un workflow personnalisé.\n\n**Scope requis :** `workflows:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).\n\n[Workflows et extraction IA](/workflows-guide).", "parameters": [ { "in": "path", "name": "definition_id", "required": true, "schema": { "type": "string", "title": "Definition Id" }, "example": "custom-workflow-1", "description": "Paramètre definition_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-workflows-run" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "workflows" ], "x-marko-route-group": "write", "x-marko-required-scope": "workflows:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "202": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WorkflowRunAccepted" }, "example": { "workflow": { "id": "custom-workflow-1", "name": "Exemple MARKO", "description": "example", "type": "example", "schedule": "example", "enabled": false, "custom": false, "editable": false, "deletable": false, "toggleable": false, "source": "example", "scope": "example", "impact": "example", "job_types": [], "preset_key": null, "status": "instruction", "schedule_kind": null, "schedule_config": {}, "config": {}, "last_run_at": null, "next_run_at": null, "last_error": null }, "run": { "id": "11111111-1111-4111-8111-111111111111", "workflow_id": "example", "workflow_name": null, "workflow_source": "custom", "job_type": null, "preset_key": null, "status": "queued", "entity_type": null, "entity_id": null, "retry_count": 0, "error_message": null, "result": {}, "created_at": null, "started_at": null, "completed_at": null, "trigger_mode": "example" } } } }, "headers": { "Idempotency-Key": { "schema": { "type": "string" }, "description": "Clé d'idempotence utilisée pour l'action." }, "X-Marko-Idempotency-Key-Source": { "schema": { "type": "string", "enum": [ "client", "server" ] }, "description": "Origine de la clé utilisée." }, "X-Marko-Idempotency-TTL-Seconds": { "schema": { "type": "integer" }, "description": "Durée de rétention annoncée pour cette action, en secondes." } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/workflows/ai-extraction-jobs": { "post": { "operationId": "workflows_ai-extraction-jobs_create", "summary": "Créer un job AI extraction", "description": "Place un job d'extraction IA dans la file gouvernée pour un document.\n\n**Scope requis :** `ai_extraction:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).\n\n[Workflows et extraction IA](/workflows-guide).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-workflows-ai-extraction-jobs-create" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "workflows" ], "x-marko-route-group": "write", "x-marko-required-scope": "ai_extraction:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "202": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProcessingJobHistoryItem" }, "example": { "id": "11111111-1111-4111-8111-111111111111", "workflow_id": null, "workflow_name": null, "workflow_source": "system", "job_type": "ai_extraction", "preset_key": null, "status": "pending", "entity_type": null, "entity_id": null, "retry_count": 0, "error_message": null, "result": {}, "document_id": null, "operation_id": null, "filename": null, "document_type": null, "suggestions_count": null, "pending_suggestions": null, "applied_suggestions": null, "summary": null, "created_at": null, "started_at": null, "completed_at": null } } }, "headers": { "Idempotency-Key": { "schema": { "type": "string" }, "description": "Clé d'idempotence utilisée pour l'action." }, "X-Marko-Idempotency-Key-Source": { "schema": { "type": "string", "enum": [ "client", "server" ] }, "description": "Origine de la clé utilisée." }, "X-Marko-Idempotency-TTL-Seconds": { "schema": { "type": "integer" }, "description": "Durée de rétention annoncée pour cette action, en secondes." } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } }, "404": { "description": "Not Found — refus déclaré dans le handler ou un helper de cette route.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AiExtractionJobCreateRequest" }, "example": { "document_id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "operation_id": null } } } } }, "get": { "operationId": "workflows_ai-extraction-jobs_list", "summary": "Lister les jobs AI extraction", "description": "Expose les jobs d'extraction IA de l'entité.\n\n**Scope requis :** `ai_extraction:read`. [Scopes et délégation](/scopes-and-delegation).\n\n[Workflows et extraction IA](/workflows-guide).", "parameters": [ { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 200, "minimum": 1, "default": 20, "title": "Limit" }, "example": 20, "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, { "in": "query", "name": "offset", "required": false, "schema": { "type": "integer", "minimum": 0, "default": 0, "title": "Offset" }, "example": 0, "description": "Nombre de résultats à ignorer avant cette page (commence à 0)." }, { "in": "query", "name": "status", "required": false, "schema": { "anyOf": [ { "$ref": "#/components/schemas/JobStatus" }, { "type": "null" } ], "description": "Filter by job status", "title": "Status" }, "example": "completed", "description": "Filter by job status" }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-workflows-ai-extraction-jobs-list" } ], "tags": [ "workflows" ], "x-marko-route-group": "read", "x-marko-required-scope": "ai_extraction:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedResponse_AIExtractionJobResponse_" }, "example": { "items": [ { "id": "11111111-1111-4111-8111-111111111111", "status": "completed", "created_at": "2026-10-01T10:00:00Z" } ], "total": 1, "limit": 0, "offset": 0 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/workflows/ai-extraction-jobs/{job_id}": { "get": { "operationId": "workflows_ai-extraction-jobs_get", "summary": "Récupérer un job AI extraction", "description": "Retourne le détail d'un job d'extraction IA.\n\n**Scope requis :** `ai_extraction:read`. [Scopes et délégation](/scopes-and-delegation).\n\n[Workflows et extraction IA](/workflows-guide).", "parameters": [ { "in": "path", "name": "job_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Job Id" }, "example": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "description": "UUID du job durable à suivre." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-workflows-ai-extraction-jobs-get" } ], "tags": [ "workflows" ], "x-marko-route-group": "read", "x-marko-required-scope": "ai_extraction:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AIExtractionJobResponse" }, "example": { "id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "status": "completed", "created_at": "2026-10-01T10:00:00Z" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/workflows/history": { "get": { "operationId": "workflows_history", "summary": "Lister l'historique workflows", "description": "Expose l'historique d'exécution des jobs et workflows.\n\n**Scope requis :** `workflows:read`. [Scopes et délégation](/scopes-and-delegation).\n\n[Workflows et extraction IA](/workflows-guide).", "parameters": [ { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 200, "minimum": 1, "default": 20, "title": "Limit" }, "example": 20, "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, { "in": "query", "name": "offset", "required": false, "schema": { "type": "integer", "minimum": 0, "default": 0, "title": "Offset" }, "example": 0, "description": "Nombre de résultats à ignorer avant cette page (commence à 0)." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-workflows-history" } ], "tags": [ "workflows" ], "x-marko-route-group": "read", "x-marko-required-scope": "workflows:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WorkflowHistoryPage" }, "example": { "items": [ { "id": "11111111-1111-4111-8111-111111111111", "workflow_id": "example", "workflow_name": null, "workflow_source": "custom", "job_type": null, "preset_key": null, "status": "completed", "entity_type": null, "entity_id": null, "retry_count": 0, "error_message": null, "result": {}, "created_at": null, "started_at": null, "completed_at": null, "trigger_mode": "example" } ], "total": 1, "limit": 0, "offset": 0 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/workflows/stats": { "get": { "operationId": "workflows_stats", "summary": "Statistiques workflows", "description": "Expose un résumé des exécutions workflows.\n\n**Scope requis :** `workflows:read`. [Scopes et délégation](/scopes-and-delegation).\n\n[Workflows et extraction IA](/workflows-guide).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-workflows-stats" } ], "tags": [ "workflows" ], "x-marko-route-group": "read", "x-marko-required-scope": "workflows:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WorkflowStats" }, "example": { "total": 0, "completed": 0, "failed": 0, "running": 0, "pending": 0, "workflows_count": 0, "custom_workflows_count": 0, "draft_workflows_count": 0, "inactive_workflows_count": 0 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/workflows/recommendations": { "get": { "operationId": "workflows_recommendations", "summary": "Lister les recommandations d'automatisation", "description": "Expose les recommandations d'automatisation calculées pour l'entité.\n\n**Scope requis :** `workflows:read`. [Scopes et délégation](/scopes-and-delegation).\n\n[Workflows et extraction IA](/workflows-guide).", "parameters": [ { "in": "query", "name": "scope_type", "required": false, "schema": { "type": "string", "default": "entity", "title": "Scope Type", "enum": [ "entity", "fund", "spv", "operation" ] }, "example": "entity", "description": "Périmètre auquel la recommandation ou l'objet se rapporte." }, { "in": "query", "name": "only_high_priority", "required": false, "schema": { "type": "boolean", "default": false, "title": "Only High Priority" }, "example": false, "description": "Limiter aux recommandations de priorité élevée." }, { "in": "query", "name": "include_dismissed", "required": false, "schema": { "type": "boolean", "default": false, "title": "Include Dismissed" }, "example": false, "description": "Inclure les recommandations classées comme non pertinentes." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-workflows-recommendations" }, { "name": "scope_id", "in": "query", "required": false, "schema": { "anyOf": [ { "type": "string", "format": "uuid" }, { "type": "null" } ], "title": "Scope Id" }, "description": "Paramètre scope_id de cette route; contraintes ci-dessous." } ], "tags": [ "workflows" ], "x-marko-route-group": "read", "x-marko-required-scope": "workflows:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WorkflowRecommendations" }, "example": { "scope_type": "entity", "scope_id": null, "scope_label": "Entity", "generated_at": "2026-10-01T10:00:00Z", "items": [], "bundles": [], "kpis": { "recommendations_total": 0, "recommendation_acceptance_rate": 0, "recommendation_dismiss_rate": 0, "recommendation_snooze_rate": 0, "time_to_activation_after_recommendation_hours": null, "prefill_edit_rate": 0, "workflow_disabled_soon_after_activation_rate": 0, "workflow_utility_score": 0, "monthly_false_positive_count": 0, "monthly_false_negative_proxy_count": 0 } } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/workflows/recommendations/preview": { "post": { "operationId": "workflows_recommendations-preview", "summary": "Prévisualiser les recommandations d'automatisation", "description": "Calcule une vue de recommandations sans persister d'état serveur.\n\n**Scope requis :** `workflows:read`. [Scopes et délégation](/scopes-and-delegation).\n\n[Workflows et extraction IA](/workflows-guide).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-workflows-recommendations-preview" } ], "tags": [ "workflows" ], "x-marko-route-group": "read", "x-marko-required-scope": "workflows:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WorkflowRecommendations" }, "example": { "scope_type": "entity", "scope_id": null, "scope_label": "Entity", "generated_at": "2026-10-01T10:00:00Z", "items": [], "bundles": [], "kpis": { "recommendations_total": 0, "recommendation_acceptance_rate": 0, "recommendation_dismiss_rate": 0, "recommendation_snooze_rate": 0, "time_to_activation_after_recommendation_hours": null, "prefill_edit_rate": 0, "workflow_disabled_soon_after_activation_rate": 0, "workflow_utility_score": 0, "monthly_false_positive_count": 0, "monthly_false_negative_proxy_count": 0 } } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WorkflowRecommendationPreviewRequest" }, "example": { "scope_type": "entity", "scope_id": null, "only_high_priority": false, "include_dismissed": false } } }, "required": true } } }, "/workflows/recommendations/materialize": { "post": { "operationId": "workflows_recommendations_materialize", "summary": "Préparer une recommandation pour décision", "description": "Persiste une seule recommandation prévisualisée avant acceptation, report ou rejet.\n\n**Scope requis :** `workflows:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).\n\n[Workflows et extraction IA](/workflows-guide).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-workflows-recommendations-materialize" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "workflows" ], "x-marko-route-group": "write", "x-marko-required-scope": "workflows:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WorkflowRecommendation" }, "example": { "id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", "scope_type": "entity", "scope_id": null, "bundle_key": "example", "bundle_label": "example", "workflow_key": "example", "workflow_label": "example", "workflow_type": "example", "title": "example", "description": "example", "expected_impact": "example", "score": 0, "confidence": 0, "priority": "critical", "priority_label": "example", "reason_codes": [], "evidence": [], "prefill": {}, "status": "proposed", "feedback": {}, "impact_metrics": {} } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WorkflowRecommendationMaterializeRequest" }, "example": { "scope_type": "entity", "scope_id": null, "bundle_key": "reporting", "workflow_key": "reporting_sponsor_escalation" } } }, "required": true } } }, "/workflows/recommendations/{recommendation_id}/accept": { "post": { "operationId": "workflows_recommendations_accept", "summary": "Accepter une recommandation", "description": "Acquitte une recommandation d'automatisation côté entité.\n\n**Scope requis :** `workflows:write`. [Scopes et délégation](/scopes-and-delegation).\n\n[Workflows et extraction IA](/workflows-guide).", "parameters": [ { "in": "path", "name": "recommendation_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Recommendation Id" }, "example": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", "description": "Paramètre recommendation_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-workflows-recommendations-accept" } ], "tags": [ "workflows" ], "x-marko-route-group": "write", "x-marko-required-scope": "workflows:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WorkflowRecommendation" }, "example": { "id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", "scope_type": "entity", "scope_id": null, "bundle_key": "example", "bundle_label": "example", "workflow_key": "example", "workflow_label": "example", "workflow_type": "example", "title": "example", "description": "example", "expected_impact": "example", "score": 0, "confidence": 0, "priority": "critical", "priority_label": "example", "reason_codes": [], "evidence": [], "prefill": {}, "status": "accepted", "feedback": {}, "impact_metrics": {} } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WorkflowRecommendationDecisionRequest" }, "example": { "note": "Automatisation validée" } } } } } }, "/workflows/recommendations/{recommendation_id}/dismiss": { "post": { "operationId": "workflows_recommendations_dismiss", "summary": "Rejeter une recommandation", "description": "Classe une recommandation comme non pertinente.\n\n**Scope requis :** `workflows:write`. [Scopes et délégation](/scopes-and-delegation).\n\n[Workflows et extraction IA](/workflows-guide).", "parameters": [ { "in": "path", "name": "recommendation_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Recommendation Id" }, "example": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", "description": "Paramètre recommendation_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-workflows-recommendations-dismiss" } ], "tags": [ "workflows" ], "x-marko-route-group": "write", "x-marko-required-scope": "workflows:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WorkflowRecommendation" }, "example": { "id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", "scope_type": "entity", "scope_id": null, "bundle_key": "example", "bundle_label": "example", "workflow_key": "example", "workflow_label": "example", "workflow_type": "example", "title": "example", "description": "example", "expected_impact": "example", "score": 0, "confidence": 0, "priority": "critical", "priority_label": "example", "reason_codes": [], "evidence": [], "prefill": {}, "status": "dismissed", "feedback": {}, "impact_metrics": {} } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WorkflowRecommendationDecisionRequest" }, "example": { "note": "Pas adapté", "reason": "context_mismatch" } } } } } }, "/workflows/recommendations/{recommendation_id}/snooze": { "post": { "operationId": "workflows_recommendations_snooze", "summary": "Reporter une recommandation", "description": "Snooze une recommandation pendant quelques jours ou jusqu'à une date donnée.\n\n**Scope requis :** `workflows:write`. [Scopes et délégation](/scopes-and-delegation).\n\n[Workflows et extraction IA](/workflows-guide).", "parameters": [ { "in": "path", "name": "recommendation_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Recommendation Id" }, "example": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", "description": "Paramètre recommendation_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-workflows-recommendations-snooze" } ], "tags": [ "workflows" ], "x-marko-route-group": "write", "x-marko-required-scope": "workflows:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WorkflowRecommendation" }, "example": { "id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", "scope_type": "entity", "scope_id": null, "bundle_key": "example", "bundle_label": "example", "workflow_key": "example", "workflow_label": "example", "workflow_type": "example", "title": "example", "description": "example", "expected_impact": "example", "score": 0, "confidence": 0, "priority": "critical", "priority_label": "example", "reason_codes": [], "evidence": [], "prefill": {}, "status": "snoozed", "feedback": {}, "impact_metrics": {} } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WorkflowRecommendationSnoozeRequest" }, "example": { "days": 14 } } } } } }, "/workflows/recommendations/{recommendation_id}/create-workflow": { "post": { "operationId": "workflows_recommendations_create-workflow", "summary": "Créer un workflow depuis une recommandation", "description": "Instancie un workflow personnalisé prérempli à partir d'une recommandation validée.\n\n**Scope requis :** `workflows:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).\n\n[Workflows et extraction IA](/workflows-guide).", "parameters": [ { "in": "path", "name": "recommendation_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Recommendation Id" }, "example": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", "description": "Paramètre recommendation_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-workflows-recommendations-create-workflow" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "workflows" ], "x-marko-route-group": "write", "x-marko-required-scope": "workflows:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "201": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WorkflowDefinition" }, "example": { "id": "custom-1234", "name": "Exemple MARKO", "description": "example", "type": "example", "schedule": "example", "enabled": true, "custom": true, "editable": false, "deletable": false, "toggleable": false, "source": "example", "scope": "example", "impact": "example", "job_types": [], "preset_key": null, "status": "instruction", "schedule_kind": null, "schedule_config": {}, "config": {}, "last_run_at": null, "next_run_at": null, "last_error": null } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/tasks": { "get": { "operationId": "tasks_aggregate", "summary": "Lister les tâches agrégées", "description": "Expose les tâches Kanban agrégées de l'entité.\n\n**Scope requis :** `tasks:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "maximum": 200, "minimum": 1, "default": 20, "title": "Limit" }, "example": 20, "description": "Nombre maximal de résultats sur cette page; bornes et valeur par défaut ci-dessous." }, { "in": "query", "name": "offset", "required": false, "schema": { "type": "integer", "minimum": 0, "default": 0, "title": "Offset" }, "example": 0, "description": "Nombre de résultats à ignorer avant cette page (commence à 0)." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-tasks-aggregate" } ], "tags": [ "tasks" ], "x-marko-route-group": "read", "x-marko-required-scope": "tasks:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedResponse_KanbanTaskResponse_" }, "example": { "items": [ { "id": "11111111-1111-4111-8111-111111111111", "target_type": "operation", "target_name": "example", "target_url": "example", "titre": "example", "statut": "example", "categorie": "example", "sort_order": 0 } ], "total": 1, "limit": 0, "offset": 0 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/operations/{operation_id}/tasks": { "get": { "operationId": "tasks_list", "summary": "Lister les tâches d'une opération", "description": "Expose les tâches Kanban d'une opération donnée.\n\n**Scope requis :** `tasks:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "operation_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Operation Id" }, "example": "44444444-4444-4444-4444-444444444444", "description": "UUID MARKO de l'opération." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-tasks-list" } ], "tags": [ "tasks" ], "x-marko-route-group": "read", "x-marko-required-scope": "tasks:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/KanbanTaskResponse" }, "title": "Response List Operation Tasks Public V2 Operations Operation Id Tasks Get" }, "example": [ { "id": "11111111-1111-4111-8111-111111111111", "target_type": "operation", "target_name": "example", "target_url": "example", "titre": "example", "statut": "example", "categorie": "example", "sort_order": 0 } ] } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] }, "post": { "operationId": "tasks_create", "summary": "Créer une tâche", "description": "Crée une tâche Kanban pour une opération.\n\n**Scope requis :** `tasks:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).", "parameters": [ { "in": "path", "name": "operation_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Operation Id" }, "example": "44444444-4444-4444-4444-444444444444", "description": "UUID MARKO de l'opération." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-tasks-create" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "tasks" ], "x-marko-route-group": "write", "x-marko-required-scope": "tasks:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "201": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/KanbanTaskResponse" }, "example": { "id": "11111111-aaaa-bbbb-cccc-222222222223", "target_type": "operation", "target_name": "example", "target_url": "example", "titre": "Relancer opérateur", "statut": "example", "categorie": "example", "sort_order": 0 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/KanbanTaskCreate" }, "example": { "titre": "Relancer opérateur", "statut": "todo" } } } } } }, "/tasks/{task_id}": { "get": { "operationId": "tasks_get", "summary": "Récupérer une tâche", "description": "Retourne une tâche Kanban unitaire.\n\n**Scope requis :** `tasks:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "task_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Task Id" }, "example": "11111111-aaaa-bbbb-cccc-222222222222", "description": "Paramètre task_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-tasks-get" } ], "tags": [ "tasks" ], "x-marko-route-group": "read", "x-marko-required-scope": "tasks:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/KanbanTaskResponse" }, "example": { "id": "11111111-aaaa-bbbb-cccc-222222222222", "target_type": "operation", "target_name": "example", "target_url": "example", "titre": "example", "statut": "example", "categorie": "example", "sort_order": 0 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] }, "put": { "operationId": "tasks_update", "summary": "Mettre à jour une tâche", "description": "Met à jour une tâche Kanban.\n\n**Scope requis :** `tasks:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "task_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Task Id" }, "example": "11111111-aaaa-bbbb-cccc-222222222222", "description": "Paramètre task_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-tasks-update" } ], "tags": [ "tasks" ], "x-marko-route-group": "write", "x-marko-required-scope": "tasks:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/KanbanTaskResponse" }, "example": { "id": "11111111-aaaa-bbbb-cccc-222222222222", "target_type": "operation", "target_name": "example", "target_url": "example", "titre": "example", "statut": "prep", "categorie": "example", "sort_order": 0 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/KanbanTaskUpdate" }, "example": { "statut": "prep" } } } } }, "delete": { "operationId": "tasks_delete", "summary": "Archiver une tâche", "description": "Archive une tâche Kanban.\n\n**Scope requis :** `tasks:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "task_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Task Id" }, "example": "11111111-aaaa-bbbb-cccc-222222222222", "description": "Paramètre task_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-tasks-delete" } ], "tags": [ "tasks" ], "x-marko-route-group": "write", "x-marko-required-scope": "tasks:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "204": { "description": "Successful response" }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } }, "/tasks/reorder": { "put": { "operationId": "tasks_reorder", "summary": "Réordonner une tâche", "description": "Déplace une tâche dans le board Kanban.\n\n**Scope requis :** `tasks:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-tasks-reorder" } ], "tags": [ "tasks" ], "x-marko-route-group": "write", "x-marko-required-scope": "tasks:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/KanbanTaskResponse" }, "example": { "id": "11111111-aaaa-bbbb-cccc-222222222222", "target_type": "operation", "target_name": "example", "target_url": "example", "titre": "example", "statut": "in_progress", "categorie": "example", "sort_order": 0 } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/KanbanTaskReorder" }, "example": { "task_id": "11111111-aaaa-bbbb-cccc-222222222222", "new_status": "in_progress", "new_sort_order": 2 } } }, "required": true } } }, "/tasks/labels": { "get": { "operationId": "tasks_labels", "summary": "Lister les labels de tâches", "description": "Expose les labels Kanban disponibles.\n\n**Scope requis :** `tasks:read`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-tasks-labels" } ], "tags": [ "tasks" ], "x-marko-route-group": "read", "x-marko-required-scope": "tasks:read", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "200": { "description": "Successful response", "content": { "application/json": { "schema": { "items": { "$ref": "#/components/schemas/KanbanLabelResponse" }, "type": "array", "title": "Response List Task Labels Public V2 Tasks Labels Get" }, "example": [ { "id": "11111111-1111-4111-8111-111111111111", "name": "Urgent", "color": "example" } ] } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] }, "post": { "operationId": "tasks_labels-create", "summary": "Créer un label de tâche", "description": "Crée un label Kanban.\n\n**Scope requis :** `tasks:write`. [Scopes et délégation](/scopes-and-delegation).\n\n**Idempotence :** header `Idempotency-Key` obligatoire. Pour reprendre la même mutation, réutiliser la même clé et le même contenu. [Écritures et idempotence](/writes-and-idempotency).", "parameters": [ { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-tasks-labels-create" }, { "in": "header", "name": "Idempotency-Key", "required": true, "description": "Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.", "schema": { "type": "string", "maxLength": 255, "pattern": "^[!-~]+$" } } ], "tags": [ "tasks" ], "x-marko-route-group": "write", "x-marko-required-scope": "tasks:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "201": { "description": "Successful response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/KanbanLabelResponse" }, "example": { "id": "11111111-1111-4111-8111-111111111111", "name": "Urgent", "color": "example" } } } }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } }, "400": { "description": "Invalid Idempotency-Key header", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.", "request_id": "req_example_partner_call" } } } }, "409": { "description": "Idempotency or write target conflict", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Conflict", "status": 409, "detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.", "request_id": "req_example_partner_call" } } } }, "428": { "description": "Required Idempotency-Key header is missing", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Precondition Required", "status": 428, "detail": "The Idempotency-Key header is required.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/KanbanLabelCreate" }, "example": { "name": "Urgent", "color": "#ef4444" } } }, "required": true } } }, "/tasks/labels/{label_id}": { "delete": { "operationId": "tasks_labels-delete", "summary": "Supprimer un label de tâche", "description": "Supprime un label Kanban.\n\n**Scope requis :** `tasks:write`. [Scopes et délégation](/scopes-and-delegation).", "parameters": [ { "in": "path", "name": "label_id", "required": true, "schema": { "type": "string", "format": "uuid", "title": "Label Id" }, "example": "22222222-bbbb-cccc-dddd-333333333333", "description": "Paramètre label_id pour cette route; type, format et contraintes ci-dessous." }, { "in": "header", "name": "X-Request-ID", "required": false, "description": "Partner-generated correlation identifier echoed in logs and error payloads.", "schema": { "type": "string" }, "example": "marko-tasks-labels-delete" } ], "tags": [ "tasks" ], "x-marko-route-group": "write", "x-marko-required-scope": "tasks:write", "x-marko-stability": "ga", "x-marko-audience": "partner", "deprecated": false, "responses": { "204": { "description": "Successful response" }, "401": { "description": "Authentication required", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unauthorized", "status": 401, "detail": "A valid bearer token is required.", "request_id": "req_example_partner_call" } } } }, "403": { "description": "Scope, route or IP restriction", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Forbidden", "status": 403, "detail": "The API key does not allow this operation.", "request_id": "req_example_partner_call" } } } }, "422": { "description": "Validation failed", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Unprocessable Content", "status": 422, "detail": "The request payload or parameters are invalid.", "request_id": "req_example_partner_call" } } } }, "429": { "description": "Rate limit or progressive ban", "headers": { "Retry-After": { "description": "Cooldown in seconds before retrying the request.", "schema": { "type": "string" } } }, "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Too Many Requests", "status": 429, "detail": "The request rate limit was exceeded.", "request_id": "req_example_partner_call" } } } }, "500": { "description": "Unexpected server error", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ProblemDetails" }, "example": { "type": "about:blank", "title": "Internal Server Error", "status": 500, "detail": "An unexpected server error occurred.", "request_id": "req_example_partner_call" } } } } }, "security": [ { "BearerAuth": [] } ] } } }, "tags": [ { "name": "auth", "x-group": "Authentification" }, { "name": "entity", "x-group": "Entité" }, { "name": "portfolio", "x-group": "Portefeuille" }, { "name": "deals", "x-group": "Deals" }, { "name": "fonds", "x-group": "Fonds" }, { "name": "spvs", "x-group": "SPV" }, { "name": "operations", "x-group": "Opérations" }, { "name": "taxonomies", "x-group": "Taxonomies" }, { "name": "import-jobs", "x-group": "Imports par lot" }, { "name": "comments", "x-group": "Commentaires" }, { "name": "documents", "x-group": "Documents" }, { "name": "users", "x-group": "Utilisateurs" }, { "name": "settings", "x-group": "Paramètres" }, { "name": "rcci", "x-group": "Conformité RCCI" }, { "name": "field-definitions", "x-group": "Champs métier" }, { "name": "search", "x-group": "Recherche" }, { "name": "operateurs", "x-group": "Opérateurs" }, { "name": "alerts", "x-group": "Alertes" }, { "name": "notifications", "x-group": "Notifications" }, { "name": "calendar", "x-group": "Calendrier" }, { "name": "enrichment", "x-group": "Enrichissement SIREN" }, { "name": "reports", "x-group": "Exports" }, { "name": "reporting", "x-group": "Templates de reporting" }, { "name": "workflows", "x-group": "Workflows et extraction IA" }, { "name": "tasks", "x-group": "Tâches" } ], "x-documentation-provenance": { "backend_sha": "b9badc11212153540db71870ed8b975cd00a2e3c", "public_contract_sha256": "287553d69742f95813fd93133528093df2a94772fc6096837f14de6258126745", "source": "https://partner-api.marko.fr/v1/openapi.json", "schema_source": "Runtime-matching Pydantic models and reviewed public serializers" } }