{
    "openapi": "3.1.0",
    "info": {
        "title": "Middle Folio API",
        "version": "1.0.0",
        "description": "Pilotez votre compte Middle Folio : portfolios, CV, entreprises, offres et candidatures. Authentification par clé API (Bearer). Les clés de mode test (mf_test_…) n’enregistrent rien."
    },
    "servers": [
        {
            "url": "https://middlefolio.online/api/v1"
        }
    ],
    "security": [
        {
            "bearerAuth": []
        }
    ],
    "paths": {
        "/me": {
            "get": {
                "operationId": "me_show",
                "summary": "Profil du titulaire de la clé.",
                "description": "",
                "tags": [
                    "Compte"
                ],
                "x-required-scope": "read",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "first_name": {
                                                    "type": "string"
                                                },
                                                "last_name": {
                                                    "type": "string"
                                                },
                                                "username": {
                                                    "type": "string"
                                                },
                                                "email": {
                                                    "type": "string"
                                                },
                                                "email_verified": {
                                                    "type": "boolean"
                                                },
                                                "secondary_email": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "phone_number": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "secondary_phone_number": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "locale": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "avatar": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "created_at": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000004",
                                        "first_name": "Awa",
                                        "last_name": "Diallo",
                                        "username": "awa-diallo",
                                        "email": "awa.diallo@example.com",
                                        "email_verified": true,
                                        "secondary_email": null,
                                        "phone_number": null,
                                        "secondary_phone_number": null,
                                        "locale": null,
                                        "avatar": null,
                                        "created_at": "2026-09-15T09:30:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            },
            "patch": {
                "operationId": "me_update",
                "summary": "Modifie le profil (l’e-mail principal et la photo restent réservés à l’interface web).",
                "description": "",
                "tags": [
                    "Compte"
                ],
                "x-required-scope": "write",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "first_name": {
                                                    "type": "string"
                                                },
                                                "last_name": {
                                                    "type": "string"
                                                },
                                                "username": {
                                                    "type": "string"
                                                },
                                                "email": {
                                                    "type": "string"
                                                },
                                                "email_verified": {
                                                    "type": "boolean"
                                                },
                                                "secondary_email": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "phone_number": {
                                                    "type": "string"
                                                },
                                                "secondary_phone_number": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "locale": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "avatar": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "created_at": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000004",
                                        "first_name": "Awa",
                                        "last_name": "Diallo",
                                        "username": "awa-diallo",
                                        "email": "awa.diallo@example.com",
                                        "email_verified": true,
                                        "secondary_email": null,
                                        "phone_number": "+221 77 123 45 67",
                                        "secondary_phone_number": null,
                                        "locale": null,
                                        "avatar": null,
                                        "created_at": "2026-09-15T09:30:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "first_name": {
                                        "type": "string",
                                        "description": "Prénom"
                                    },
                                    "last_name": {
                                        "type": "string",
                                        "description": "Nom"
                                    },
                                    "username": {
                                        "type": "string",
                                        "description": "Nom d’utilisateur unique"
                                    },
                                    "secondary_email": {
                                        "type": "string",
                                        "description": "E-mail secondaire"
                                    },
                                    "phone_number": {
                                        "type": "string",
                                        "description": "Téléphone"
                                    },
                                    "secondary_phone_number": {
                                        "type": "string",
                                        "description": "Second téléphone"
                                    }
                                }
                            },
                            "example": {
                                "first_name": "Awa",
                                "last_name": "Diallo",
                                "phone_number": "+221 77 123 45 67"
                            }
                        }
                    }
                }
            }
        },
        "/me/locale": {
            "patch": {
                "operationId": "me_locale",
                "summary": "Change la langue du compte (interface et e-mails).",
                "description": "",
                "tags": [
                    "Compte"
                ],
                "x-required-scope": "write",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "first_name": {
                                                    "type": "string"
                                                },
                                                "last_name": {
                                                    "type": "string"
                                                },
                                                "username": {
                                                    "type": "string"
                                                },
                                                "email": {
                                                    "type": "string"
                                                },
                                                "email_verified": {
                                                    "type": "boolean"
                                                },
                                                "secondary_email": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "phone_number": {
                                                    "type": "string"
                                                },
                                                "secondary_phone_number": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "locale": {
                                                    "type": "string"
                                                },
                                                "avatar": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "created_at": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000004",
                                        "first_name": "Awa",
                                        "last_name": "Diallo",
                                        "username": "awa-diallo",
                                        "email": "awa.diallo@example.com",
                                        "email_verified": true,
                                        "secondary_email": null,
                                        "phone_number": "+221 77 123 45 67",
                                        "secondary_phone_number": null,
                                        "locale": "en",
                                        "avatar": null,
                                        "created_at": "2026-09-15T09:30:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "locale": {
                                        "type": "string",
                                        "enum": [
                                            "fr",
                                            "en"
                                        ],
                                        "description": "Langue"
                                    }
                                },
                                "required": [
                                    "locale"
                                ]
                            },
                            "example": {
                                "locale": "en"
                            }
                        }
                    }
                }
            }
        },
        "/me/photo": {
            "put": {
                "operationId": "me_photo_update",
                "summary": "Définit la photo de profil (image de la bibliothèque, copiée vers la photo du compte).",
                "description": "Indisponible avec une clé de test (409) : écrit un fichier.",
                "tags": [
                    "Compte"
                ],
                "x-required-scope": "write",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "first_name": {
                                                    "type": "string"
                                                },
                                                "last_name": {
                                                    "type": "string"
                                                },
                                                "username": {
                                                    "type": "string"
                                                },
                                                "email": {
                                                    "type": "string"
                                                },
                                                "email_verified": {
                                                    "type": "boolean"
                                                },
                                                "secondary_email": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "phone_number": {
                                                    "type": "string"
                                                },
                                                "secondary_phone_number": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "locale": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "avatar": {
                                                    "type": "string"
                                                },
                                                "created_at": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000004",
                                        "first_name": "Awa",
                                        "last_name": "Diallo",
                                        "username": "awa-diallo",
                                        "email": "awa.diallo@example.com",
                                        "email_verified": true,
                                        "secondary_email": null,
                                        "phone_number": "+221 77 123 45 67",
                                        "secondary_phone_number": null,
                                        "locale": null,
                                        "avatar": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000022.png",
                                        "created_at": "2026-09-15T09:30:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "media_id": {
                                        "type": "string",
                                        "description": "Identifiant d’une image de la bibliothèque (POST /files)"
                                    }
                                },
                                "required": [
                                    "media_id"
                                ]
                            },
                            "example": {
                                "media_id": "01j9z000000000000000000021"
                            }
                        }
                    }
                }
            },
            "delete": {
                "operationId": "me_photo_destroy",
                "summary": "Retire la photo de profil.",
                "description": "Indisponible avec une clé de test (409) : supprime un fichier.",
                "tags": [
                    "Compte"
                ],
                "x-required-scope": "write",
                "parameters": [],
                "responses": {
                    "204": {
                        "description": "Supprimé"
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/me/plan": {
            "get": {
                "operationId": "me_plan",
                "summary": "Formule courante, capacités (quotas, droits) et usage du compte.",
                "description": "",
                "tags": [
                    "Compte"
                ],
                "x-required-scope": "read",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "plan": {
                                                    "type": "object",
                                                    "properties": {
                                                        "key": {
                                                            "type": "string"
                                                        },
                                                        "name": {
                                                            "type": "string"
                                                        }
                                                    }
                                                },
                                                "capabilities": {
                                                    "type": "object",
                                                    "properties": {
                                                        "max_portfolios": {
                                                            "type": "integer"
                                                        },
                                                        "max_cvs": {
                                                            "type": "integer"
                                                        },
                                                        "max_cv_downloads_per_month": {
                                                            "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                        },
                                                        "max_letter_downloads_per_month": {
                                                            "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                        },
                                                        "max_companies": {
                                                            "type": "integer"
                                                        },
                                                        "max_sections_per_portfolio": {
                                                            "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                        },
                                                        "max_entries_per_section": {
                                                            "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                        },
                                                        "max_cv_sections": {
                                                            "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                        },
                                                        "max_cv_entries_per_section": {
                                                            "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                        },
                                                        "custom_branding": {
                                                            "type": "boolean"
                                                        },
                                                        "custom_document_branding": {
                                                            "type": "boolean"
                                                        },
                                                        "custom_theme": {
                                                            "type": "boolean"
                                                        },
                                                        "premium_themes": {
                                                            "type": "boolean"
                                                        },
                                                        "contact_form": {
                                                            "type": "boolean"
                                                        },
                                                        "location_info": {
                                                            "type": "boolean"
                                                        },
                                                        "portfolio_site": {
                                                            "type": "boolean"
                                                        },
                                                        "company_site": {
                                                            "type": "boolean"
                                                        },
                                                        "analytics_tier": {
                                                            "type": "string"
                                                        },
                                                        "company_analytics_tier": {
                                                            "type": "string"
                                                        },
                                                        "job_matching": {
                                                            "type": "boolean"
                                                        },
                                                        "job_matching_ai": {
                                                            "type": "boolean"
                                                        },
                                                        "company_ats": {
                                                            "type": "boolean"
                                                        },
                                                        "company_ats_ai": {
                                                            "type": "boolean"
                                                        },
                                                        "api_access": {
                                                            "type": "boolean"
                                                        }
                                                    }
                                                },
                                                "usage": {
                                                    "type": "object",
                                                    "properties": {
                                                        "portfolios_count": {
                                                            "type": "integer"
                                                        },
                                                        "cvs_count": {
                                                            "type": "integer"
                                                        },
                                                        "companies_count": {
                                                            "type": "integer"
                                                        },
                                                        "storage_used_bytes": {
                                                            "type": "integer"
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "plan": {
                                            "key": "premium",
                                            "name": "Premium"
                                        },
                                        "capabilities": {
                                            "max_portfolios": 10,
                                            "max_cvs": 20,
                                            "max_cv_downloads_per_month": null,
                                            "max_letter_downloads_per_month": null,
                                            "max_companies": 5,
                                            "max_sections_per_portfolio": null,
                                            "max_entries_per_section": null,
                                            "max_cv_sections": null,
                                            "max_cv_entries_per_section": null,
                                            "custom_branding": true,
                                            "custom_document_branding": true,
                                            "custom_theme": true,
                                            "premium_themes": true,
                                            "contact_form": true,
                                            "location_info": true,
                                            "portfolio_site": true,
                                            "company_site": true,
                                            "analytics_tier": "advanced",
                                            "company_analytics_tier": "advanced",
                                            "job_matching": true,
                                            "job_matching_ai": true,
                                            "company_ats": true,
                                            "company_ats_ai": true,
                                            "api_access": true
                                        },
                                        "usage": {
                                            "portfolios_count": 0,
                                            "cvs_count": 0,
                                            "companies_count": 0,
                                            "storage_used_bytes": 0
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/me/key": {
            "get": {
                "operationId": "me_key",
                "summary": "Permissions de la clé utilisée : niveau par zone et entreprises autorisées.",
                "description": "Utile à un assistant IA pour savoir ce qu’il peut faire avant d’agir. Ne demande aucune permission particulière.",
                "tags": [
                    "Compte"
                ],
                "x-required-scope": "read",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "name": {
                                                    "type": "string"
                                                },
                                                "mode": {
                                                    "type": "string"
                                                },
                                                "permissions": {
                                                    "type": "object",
                                                    "properties": {
                                                        "account": {
                                                            "type": "string"
                                                        },
                                                        "files": {
                                                            "type": "string"
                                                        },
                                                        "portfolios": {
                                                            "type": "string"
                                                        },
                                                        "cvs": {
                                                            "type": "string"
                                                        },
                                                        "companies": {
                                                            "type": "string"
                                                        },
                                                        "offers": {
                                                            "type": "string"
                                                        },
                                                        "applications": {
                                                            "type": "string"
                                                        }
                                                    }
                                                },
                                                "companies": {
                                                    "type": "string"
                                                },
                                                "expires_at": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "name": "Test",
                                        "mode": "live",
                                        "permissions": {
                                            "account": "write",
                                            "files": "write",
                                            "portfolios": "write",
                                            "cvs": "write",
                                            "companies": "write",
                                            "offers": "write",
                                            "applications": "write"
                                        },
                                        "companies": "all",
                                        "expires_at": null
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/me/referral": {
            "get": {
                "operationId": "me_referral",
                "summary": "Code et lien de parrainage, nombre de filleuls (lecture seule).",
                "description": "",
                "tags": [
                    "Compte"
                ],
                "x-required-scope": "read",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "code": {
                                                    "type": "string"
                                                },
                                                "link": {
                                                    "type": "string"
                                                },
                                                "is_eligible": {
                                                    "type": "boolean"
                                                },
                                                "referrals_count": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "code": "UPHWF6FC",
                                        "link": "https://middlefolio.online/register?ref=UPHWF6FC",
                                        "is_eligible": false,
                                        "referrals_count": 0
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/files": {
            "get": {
                "operationId": "files_index",
                "summary": "Bibliothèque de fichiers : fournit les identifiants pour les champs *_media_ids et media_id.",
                "description": "",
                "tags": [
                    "Fichiers"
                ],
                "x-required-scope": "read",
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Numéro de page (défaut 1)",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Éléments par page (1 à 100, défaut 25)",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "id": {
                                                        "type": "string"
                                                    },
                                                    "url": {
                                                        "type": "string"
                                                    },
                                                    "position": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "alt_text": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "original_filename": {
                                                        "type": "string"
                                                    },
                                                    "mime_type": {
                                                        "type": "string"
                                                    },
                                                    "size": {
                                                        "type": "integer"
                                                    },
                                                    "collection": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "is_attached": {
                                                        "type": "boolean"
                                                    },
                                                    "created_at": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        },
                                        "links": {
                                            "type": "object",
                                            "properties": {
                                                "first": {
                                                    "type": "string"
                                                },
                                                "last": {
                                                    "type": "string"
                                                },
                                                "prev": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "next": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "current_page": {
                                                    "type": "integer"
                                                },
                                                "from": {
                                                    "type": "integer"
                                                },
                                                "last_page": {
                                                    "type": "integer"
                                                },
                                                "links": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "url": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "label": {
                                                                "type": "string"
                                                            },
                                                            "page": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "active": {
                                                                "type": "boolean"
                                                            }
                                                        }
                                                    }
                                                },
                                                "path": {
                                                    "type": "string"
                                                },
                                                "per_page": {
                                                    "type": "integer"
                                                },
                                                "to": {
                                                    "type": "integer"
                                                },
                                                "total": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": [
                                        {
                                            "id": "01j9z000000000000000000017",
                                            "url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000018.png",
                                            "position": null,
                                            "alt_text": null,
                                            "original_filename": "logo.png",
                                            "mime_type": "image/png",
                                            "size": 106,
                                            "collection": null,
                                            "is_attached": false,
                                            "created_at": "2026-09-15T09:30:00+00:00"
                                        },
                                        {
                                            "id": "01j9z000000000000000000019",
                                            "url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000020.png",
                                            "position": null,
                                            "alt_text": null,
                                            "original_filename": "couverture.png",
                                            "mime_type": "image/png",
                                            "size": 106,
                                            "collection": null,
                                            "is_attached": false,
                                            "created_at": "2026-09-15T09:30:00+00:00"
                                        }
                                    ],
                                    "links": {
                                        "first": "https://middlefolio.online/api/v1/files?page=1",
                                        "last": "https://middlefolio.online/api/v1/files?page=1",
                                        "prev": null,
                                        "next": null
                                    },
                                    "meta": {
                                        "current_page": 1,
                                        "from": 1,
                                        "last_page": 1,
                                        "links": [
                                            {
                                                "url": null,
                                                "label": "&laquo; Précédent",
                                                "page": null,
                                                "active": false
                                            },
                                            {
                                                "url": "https://middlefolio.online/api/v1/files?page=1",
                                                "label": "1",
                                                "page": 1,
                                                "active": true
                                            }
                                        ],
                                        "path": "https://middlefolio.online/api/v1/files",
                                        "per_page": 25,
                                        "to": 9,
                                        "total": 9
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            },
            "post": {
                "operationId": "files_store",
                "summary": "Téléverse une image (jpg, png, webp, gif) ou un PDF dans la bibliothèque et renvoie son identifiant.",
                "description": "Deux formes : multipart/form-data (champ `file`, `name` facultatif) ou JSON (`content_base64` + `filename`, pour les clients sans multipart comme MCP). Taille maximale 5 Mo, quota de stockage de la formule. Rattachez ensuite le fichier avec image_media_ids, media_id, photo_media_ids… Indisponible avec une clé de test (409) : un fichier ne peut pas être annulé.",
                "tags": [
                    "Fichiers"
                ],
                "x-required-scope": "write",
                "parameters": [],
                "responses": {
                    "201": {
                        "description": "Créé",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "url": {
                                                    "type": "string"
                                                },
                                                "position": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "alt_text": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "original_filename": {
                                                    "type": "string"
                                                },
                                                "mime_type": {
                                                    "type": "string"
                                                },
                                                "size": {
                                                    "type": "integer"
                                                },
                                                "collection": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "is_attached": {
                                                    "type": "boolean"
                                                },
                                                "created_at": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000017",
                                        "url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000018.png",
                                        "position": null,
                                        "alt_text": null,
                                        "original_filename": "logo.png",
                                        "mime_type": "image/png",
                                        "size": 106,
                                        "collection": null,
                                        "is_attached": false,
                                        "created_at": "2026-09-15T09:30:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "content_base64": {
                                        "type": "string",
                                        "description": "Contenu du fichier encodé en base64 (alternative à `file` en multipart)"
                                    },
                                    "filename": {
                                        "type": "string",
                                        "description": "Nom du fichier avec son extension (requis avec content_base64)"
                                    },
                                    "name": {
                                        "type": "string",
                                        "description": "Nom affiché dans la bibliothèque (défaut : le nom du fichier)"
                                    }
                                }
                            },
                            "example": {
                                "content_base64": "iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAIAAAADnC86AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAHElEQVRYhe3BAQ0AAADCoPdPbQ43oAAAAADg3wAS6AABuHYUGQAAAABJRU5ErkJggg==",
                                "filename": "logo.png"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "file"
                                ],
                                "properties": {
                                    "file": {
                                        "type": "string",
                                        "format": "binary"
                                    },
                                    "name": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },
        "/files/{media}": {
            "delete": {
                "operationId": "files_destroy",
                "summary": "Supprime définitivement un fichier de la bibliothèque (et tous ses rattachements).",
                "description": "Indisponible avec une clé de test (409).",
                "tags": [
                    "Fichiers"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "media",
                        "in": "path",
                        "required": true,
                        "description": "media",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Supprimé"
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/categories": {
            "get": {
                "operationId": "categories_index",
                "summary": "Catégories de l’annuaire, arbre aplati (parent_id, depth) : identifiants pour categories (portfolio) et category_ids (entreprise, offre).",
                "description": "Permis à toute clé, quelles que soient ses zones.",
                "tags": [
                    "Référentiels"
                ],
                "x-required-scope": "read",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "id": {
                                                        "type": "string"
                                                    },
                                                    "name": {
                                                        "type": "string"
                                                    },
                                                    "slug": {
                                                        "type": "string"
                                                    },
                                                    "parent_id": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "depth": {
                                                        "type": "integer"
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": [
                                        {
                                            "id": "01j9z000000000000000000001",
                                            "name": "Technologies",
                                            "slug": "technologies",
                                            "parent_id": null,
                                            "depth": 0
                                        },
                                        {
                                            "id": "01j9z000000000000000000002",
                                            "name": "Développement web",
                                            "slug": "developpement-web",
                                            "parent_id": "01j9z000000000000000000001",
                                            "depth": 1
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/portfolio-icons": {
            "get": {
                "operationId": "portfolio_icons_index",
                "summary": "Bibliothèque d’icônes utilisable : icônes globales et les vôtres, identifiants pour icon_id d’une entrée de portfolio.",
                "description": "Permis à toute clé, quelles que soient ses zones.",
                "tags": [
                    "Référentiels"
                ],
                "x-required-scope": "read",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "id": {
                                                        "type": "string"
                                                    },
                                                    "name": {
                                                        "type": "string"
                                                    },
                                                    "url": {
                                                        "type": "string"
                                                    },
                                                    "is_global": {
                                                        "type": "boolean"
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": [
                                        {
                                            "id": "01j9z000000000000000000028",
                                            "name": "Laravel",
                                            "url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000029.png",
                                            "is_global": false
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            },
            "post": {
                "operationId": "portfolio_icons_store",
                "summary": "Ajoute une icône personnalisée à votre bibliothèque (50 max par compte).",
                "description": "",
                "tags": [
                    "Référentiels"
                ],
                "x-required-scope": "write",
                "parameters": [],
                "responses": {
                    "201": {
                        "description": "Créé",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "url": {
                                                    "type": "string"
                                                },
                                                "is_global": {
                                                    "type": "boolean"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000028",
                                        "name": "Laravel",
                                        "url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000029.png",
                                        "is_global": false
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "name": {
                                        "type": "string",
                                        "description": "Nom de l’icône (100 car. max)"
                                    },
                                    "icon_media_ids": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Un identifiant d’image de la bibliothèque (POST /files)"
                                    }
                                },
                                "required": [
                                    "name",
                                    "icon_media_ids"
                                ]
                            },
                            "example": {
                                "name": "Laravel",
                                "icon_media_ids": [
                                    "01j9z000000000000000000030"
                                ]
                            }
                        }
                    }
                }
            }
        },
        "/portfolio-icons/{icon}": {
            "delete": {
                "operationId": "portfolio_icons_destroy",
                "summary": "Supprime une de vos icônes personnalisées (les entrées qui l’utilisent la perdent).",
                "description": "",
                "tags": [
                    "Référentiels"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "icon",
                        "in": "path",
                        "required": true,
                        "description": "icon",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Supprimé"
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/portfolios": {
            "get": {
                "operationId": "portfolios_index",
                "summary": "Liste vos portfolios personnels.",
                "description": "",
                "tags": [
                    "Portfolios"
                ],
                "x-required-scope": "read",
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Numéro de page (défaut 1)",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Éléments par page (1 à 100, défaut 25)",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "id": {
                                                        "type": "string"
                                                    },
                                                    "name": {
                                                        "type": "string"
                                                    },
                                                    "slug": {
                                                        "type": "string"
                                                    },
                                                    "public_url": {
                                                        "type": "string"
                                                    },
                                                    "brand_name": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "headline": {
                                                        "type": "string"
                                                    },
                                                    "summary": {
                                                        "type": "string"
                                                    },
                                                    "years_of_experience": {
                                                        "type": "integer"
                                                    },
                                                    "clients_count": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "projects_count": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "cv_url": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "logo_url": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "favicon_url": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "hero_image": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "is_activated": {
                                                        "type": "boolean"
                                                    },
                                                    "is_published": {
                                                        "type": "boolean"
                                                    }
                                                }
                                            }
                                        },
                                        "links": {
                                            "type": "object",
                                            "properties": {
                                                "first": {
                                                    "type": "string"
                                                },
                                                "last": {
                                                    "type": "string"
                                                },
                                                "prev": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "next": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "current_page": {
                                                    "type": "integer"
                                                },
                                                "from": {
                                                    "type": "integer"
                                                },
                                                "last_page": {
                                                    "type": "integer"
                                                },
                                                "links": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "url": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "label": {
                                                                "type": "string"
                                                            },
                                                            "page": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "active": {
                                                                "type": "boolean"
                                                            }
                                                        }
                                                    }
                                                },
                                                "path": {
                                                    "type": "string"
                                                },
                                                "per_page": {
                                                    "type": "integer"
                                                },
                                                "to": {
                                                    "type": "integer"
                                                },
                                                "total": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": [
                                        {
                                            "id": "01j9z000000000000000000037",
                                            "name": "Awa Diallo",
                                            "slug": "awa-diallo",
                                            "public_url": "https://middlefolio.online/p/awa-diallo",
                                            "brand_name": null,
                                            "headline": "Développeuse Laravel & React",
                                            "summary": "J’accompagne les PME dans la création de leurs outils web.",
                                            "years_of_experience": 6,
                                            "clients_count": null,
                                            "projects_count": null,
                                            "cv_url": null,
                                            "logo_url": null,
                                            "favicon_url": null,
                                            "hero_image": null,
                                            "is_activated": true,
                                            "is_published": false
                                        }
                                    ],
                                    "links": {
                                        "first": "https://middlefolio.online/api/v1/portfolios?page=1",
                                        "last": "https://middlefolio.online/api/v1/portfolios?page=1",
                                        "prev": null,
                                        "next": null
                                    },
                                    "meta": {
                                        "current_page": 1,
                                        "from": 1,
                                        "last_page": 1,
                                        "links": [
                                            {
                                                "url": null,
                                                "label": "&laquo; Précédent",
                                                "page": null,
                                                "active": false
                                            },
                                            {
                                                "url": "https://middlefolio.online/api/v1/portfolios?page=1",
                                                "label": "1",
                                                "page": 1,
                                                "active": true
                                            }
                                        ],
                                        "path": "https://middlefolio.online/api/v1/portfolios",
                                        "per_page": 25,
                                        "to": 1,
                                        "total": 1
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            },
            "post": {
                "operationId": "portfolios_store",
                "summary": "Crée un portfolio avec ses sections par défaut (quota du plan appliqué).",
                "description": "",
                "tags": [
                    "Portfolios"
                ],
                "x-required-scope": "write",
                "parameters": [],
                "responses": {
                    "201": {
                        "description": "Créé",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "slug": {
                                                    "type": "string"
                                                },
                                                "public_url": {
                                                    "type": "string"
                                                },
                                                "brand_name": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "headline": {
                                                    "type": "string"
                                                },
                                                "summary": {
                                                    "type": "string"
                                                },
                                                "years_of_experience": {
                                                    "type": "integer"
                                                },
                                                "clients_count": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "projects_count": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "cv_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "logo_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "favicon_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "hero_image": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "is_activated": {
                                                    "type": "boolean"
                                                },
                                                "is_published": {
                                                    "type": "boolean"
                                                },
                                                "sections": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "string"
                                                            },
                                                            "type": {
                                                                "type": "string"
                                                            },
                                                            "title": {
                                                                "type": "string"
                                                            },
                                                            "position": {
                                                                "type": "integer"
                                                            },
                                                            "is_visible": {
                                                                "type": "boolean"
                                                            },
                                                            "show_on_home": {
                                                                "type": "boolean"
                                                            },
                                                            "entries": {
                                                                "type": "array",
                                                                "items": {}
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000037",
                                        "name": "Awa Diallo",
                                        "slug": "awa-diallo",
                                        "public_url": "https://middlefolio.online/p/awa-diallo",
                                        "brand_name": null,
                                        "headline": "Développeuse Laravel & React",
                                        "summary": "J’accompagne les PME dans la création de leurs outils web.",
                                        "years_of_experience": 6,
                                        "clients_count": null,
                                        "projects_count": null,
                                        "cv_url": null,
                                        "logo_url": null,
                                        "favicon_url": null,
                                        "hero_image": null,
                                        "is_activated": true,
                                        "is_published": false,
                                        "sections": [
                                            {
                                                "id": "01j9z000000000000000000039",
                                                "type": "description",
                                                "title": "Description",
                                                "position": 1,
                                                "is_visible": true,
                                                "show_on_home": true,
                                                "entries": []
                                            },
                                            {
                                                "id": "01j9z000000000000000000040",
                                                "type": "journey",
                                                "title": "Parcours",
                                                "position": 2,
                                                "is_visible": true,
                                                "show_on_home": true,
                                                "entries": []
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "name": {
                                        "type": "string",
                                        "description": "Nom (source du lien public)"
                                    },
                                    "locale": {
                                        "type": "string",
                                        "enum": [
                                            "fr",
                                            "en"
                                        ],
                                        "description": "Langue du site"
                                    },
                                    "headline": {
                                        "type": "string",
                                        "description": "Accroche"
                                    },
                                    "summary": {
                                        "type": "string",
                                        "description": "Présentation"
                                    },
                                    "years_of_experience": {
                                        "type": "integer",
                                        "description": "Années d’expérience"
                                    },
                                    "clients_count": {
                                        "type": "integer",
                                        "description": "Nombre de clients"
                                    },
                                    "projects_count": {
                                        "type": "integer",
                                        "description": "Nombre de projets"
                                    },
                                    "cv_media_ids": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Un PDF de la bibliothèque"
                                    },
                                    "cv_id": {
                                        "type": "string",
                                        "description": "CV à copier en portfolio (sections, couleur, liens, photo) ; name et locale sont alors repris du CV si absents"
                                    }
                                },
                                "required": [
                                    "name",
                                    "locale"
                                ]
                            },
                            "example": {
                                "name": "Awa Diallo",
                                "locale": "fr",
                                "headline": "Développeuse Laravel & React",
                                "summary": "J’accompagne les PME dans la création de leurs outils web.",
                                "years_of_experience": 6
                            }
                        }
                    }
                }
            }
        },
        "/portfolios/{portfolio}": {
            "get": {
                "operationId": "portfolios_show",
                "summary": "Portfolio complet : sections et entrées.",
                "description": "",
                "tags": [
                    "Portfolios"
                ],
                "x-required-scope": "read",
                "parameters": [
                    {
                        "name": "portfolio",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du portfolio",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "slug": {
                                                    "type": "string"
                                                },
                                                "public_url": {
                                                    "type": "string"
                                                },
                                                "brand_name": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "headline": {
                                                    "type": "string"
                                                },
                                                "summary": {
                                                    "type": "string"
                                                },
                                                "years_of_experience": {
                                                    "type": "integer"
                                                },
                                                "clients_count": {
                                                    "type": "integer"
                                                },
                                                "projects_count": {
                                                    "type": "integer"
                                                },
                                                "cv_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "logo_url": {
                                                    "type": "string"
                                                },
                                                "favicon_url": {
                                                    "type": "string"
                                                },
                                                "hero_image": {
                                                    "type": "string"
                                                },
                                                "is_activated": {
                                                    "type": "boolean"
                                                },
                                                "is_published": {
                                                    "type": "boolean"
                                                },
                                                "sections": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "string"
                                                            },
                                                            "type": {
                                                                "type": "string"
                                                            },
                                                            "title": {
                                                                "type": "string"
                                                            },
                                                            "position": {
                                                                "type": "integer"
                                                            },
                                                            "is_visible": {
                                                                "type": "boolean"
                                                            },
                                                            "show_on_home": {
                                                                "type": "boolean"
                                                            },
                                                            "entries": {
                                                                "type": "array",
                                                                "items": {}
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000037",
                                        "name": "Awa Diallo",
                                        "slug": "awa-diallo",
                                        "public_url": "https://middlefolio.online/p/awa-diallo",
                                        "brand_name": null,
                                        "headline": "Développeuse Laravel & React",
                                        "summary": "J’accompagne les PME dans la création de leurs outils web.",
                                        "years_of_experience": 6,
                                        "clients_count": 25,
                                        "projects_count": 40,
                                        "cv_url": null,
                                        "logo_url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000018.png",
                                        "favicon_url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000006.png",
                                        "hero_image": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000020.png",
                                        "is_activated": true,
                                        "is_published": false,
                                        "sections": [
                                            {
                                                "id": "01j9z000000000000000000039",
                                                "type": "description",
                                                "title": "Description",
                                                "position": 1,
                                                "is_visible": true,
                                                "show_on_home": true,
                                                "entries": []
                                            },
                                            {
                                                "id": "01j9z000000000000000000040",
                                                "type": "journey",
                                                "title": "Parcours",
                                                "position": 2,
                                                "is_visible": true,
                                                "show_on_home": true,
                                                "entries": []
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            },
            "patch": {
                "operationId": "portfolios_update",
                "summary": "Modifie les informations générales du portfolio.",
                "description": "Mise à jour partielle : n’envoyez que les champs à changer, les autres restent inchangés (null ou une chaîne vide efface un champ facultatif). Un objet est fusionné clé par clé, une liste est remplacée en entier.",
                "tags": [
                    "Portfolios"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "portfolio",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du portfolio",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "slug": {
                                                    "type": "string"
                                                },
                                                "public_url": {
                                                    "type": "string"
                                                },
                                                "brand_name": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "headline": {
                                                    "type": "string"
                                                },
                                                "summary": {
                                                    "type": "string"
                                                },
                                                "years_of_experience": {
                                                    "type": "integer"
                                                },
                                                "clients_count": {
                                                    "type": "integer"
                                                },
                                                "projects_count": {
                                                    "type": "integer"
                                                },
                                                "cv_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "logo_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "favicon_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "hero_image": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "is_activated": {
                                                    "type": "boolean"
                                                },
                                                "is_published": {
                                                    "type": "boolean"
                                                },
                                                "sections": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "string"
                                                            },
                                                            "type": {
                                                                "type": "string"
                                                            },
                                                            "title": {
                                                                "type": "string"
                                                            },
                                                            "position": {
                                                                "type": "integer"
                                                            },
                                                            "is_visible": {
                                                                "type": "boolean"
                                                            },
                                                            "show_on_home": {
                                                                "type": "boolean"
                                                            },
                                                            "entries": {
                                                                "type": "array",
                                                                "items": {}
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000037",
                                        "name": "Awa Diallo",
                                        "slug": "awa-diallo",
                                        "public_url": "https://middlefolio.online/p/awa-diallo",
                                        "brand_name": null,
                                        "headline": "Développeuse Laravel & React",
                                        "summary": "J’accompagne les PME dans la création de leurs outils web.",
                                        "years_of_experience": 6,
                                        "clients_count": 25,
                                        "projects_count": 40,
                                        "cv_url": null,
                                        "logo_url": null,
                                        "favicon_url": null,
                                        "hero_image": null,
                                        "is_activated": true,
                                        "is_published": false,
                                        "sections": [
                                            {
                                                "id": "01j9z000000000000000000039",
                                                "type": "description",
                                                "title": "Description",
                                                "position": 1,
                                                "is_visible": true,
                                                "show_on_home": true,
                                                "entries": []
                                            },
                                            {
                                                "id": "01j9z000000000000000000040",
                                                "type": "journey",
                                                "title": "Parcours",
                                                "position": 2,
                                                "is_visible": true,
                                                "show_on_home": true,
                                                "entries": []
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "name": {
                                        "type": "string",
                                        "description": "Nom"
                                    },
                                    "headline": {
                                        "type": "string",
                                        "description": "Accroche"
                                    },
                                    "summary": {
                                        "type": "string",
                                        "description": "Présentation"
                                    },
                                    "years_of_experience": {
                                        "type": "integer",
                                        "description": "Années d’expérience"
                                    },
                                    "clients_count": {
                                        "type": "integer",
                                        "description": "Nombre de clients"
                                    },
                                    "projects_count": {
                                        "type": "integer",
                                        "description": "Nombre de projets"
                                    },
                                    "cv_media_ids": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Un PDF de la bibliothèque"
                                    }
                                }
                            },
                            "example": {
                                "name": "Awa Diallo",
                                "headline": "Développeuse Laravel & React",
                                "summary": "J’accompagne les PME dans la création de leurs outils web.",
                                "years_of_experience": 6,
                                "clients_count": 25,
                                "projects_count": 40
                            }
                        }
                    }
                }
            },
            "delete": {
                "operationId": "portfolios_destroy",
                "summary": "Supprime le portfolio (suppression logique, non restaurable depuis l’API).",
                "description": "",
                "tags": [
                    "Portfolios"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "portfolio",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du portfolio",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Supprimé"
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/portfolios/{portfolio}/duplicate": {
            "post": {
                "operationId": "portfolios_duplicate",
                "summary": "Duplique un portfolio personnel : contenu, thème, fichiers et réglages (quota du plan appliqué).",
                "description": "La copie reçoit un nouvel identifiant et un nouveau slug, naît non publiée et sans sous-domaine. Un site d’entreprise se duplique avec son entreprise (POST /companies/{company}/duplicate).",
                "tags": [
                    "Portfolios"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "portfolio",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du portfolio",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "201": {
                        "description": "Créé",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "slug": {
                                                    "type": "string"
                                                },
                                                "public_url": {
                                                    "type": "string"
                                                },
                                                "brand_name": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "headline": {
                                                    "type": "string"
                                                },
                                                "summary": {
                                                    "type": "string"
                                                },
                                                "years_of_experience": {
                                                    "type": "integer"
                                                },
                                                "clients_count": {
                                                    "type": "integer"
                                                },
                                                "projects_count": {
                                                    "type": "integer"
                                                },
                                                "cv_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "logo_url": {
                                                    "type": "string"
                                                },
                                                "favicon_url": {
                                                    "type": "string"
                                                },
                                                "hero_image": {
                                                    "type": "string"
                                                },
                                                "is_activated": {
                                                    "type": "boolean"
                                                },
                                                "is_published": {
                                                    "type": "boolean"
                                                },
                                                "sections": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "string"
                                                            },
                                                            "type": {
                                                                "type": "string"
                                                            },
                                                            "title": {
                                                                "type": "string"
                                                            },
                                                            "position": {
                                                                "type": "integer"
                                                            },
                                                            "is_visible": {
                                                                "type": "boolean"
                                                            },
                                                            "show_on_home": {
                                                                "type": "boolean"
                                                            },
                                                            "entries": {
                                                                "type": "array",
                                                                "items": {}
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000034",
                                        "name": "Awa Diallo — version anglaise",
                                        "slug": "awa-diallo-version-anglaise",
                                        "public_url": "https://middlefolio.online/p/awa-diallo-version-anglaise",
                                        "brand_name": null,
                                        "headline": "Développeuse Laravel & React",
                                        "summary": "J’accompagne les PME dans la création de leurs outils web.",
                                        "years_of_experience": 6,
                                        "clients_count": 25,
                                        "projects_count": 40,
                                        "cv_url": null,
                                        "logo_url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000018.png",
                                        "favicon_url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000006.png",
                                        "hero_image": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000020.png",
                                        "is_activated": true,
                                        "is_published": false,
                                        "sections": [
                                            {
                                                "id": "01j9z000000000000000000035",
                                                "type": "description",
                                                "title": "Description",
                                                "position": 1,
                                                "is_visible": true,
                                                "show_on_home": true,
                                                "entries": []
                                            },
                                            {
                                                "id": "01j9z000000000000000000036",
                                                "type": "journey",
                                                "title": "Parcours",
                                                "position": 2,
                                                "is_visible": true,
                                                "show_on_home": true,
                                                "entries": []
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "name": {
                                        "type": "string",
                                        "description": "Nom de la copie (défaut : « <nom> (copie) »)"
                                    }
                                }
                            },
                            "example": {
                                "name": "Awa Diallo — version anglaise"
                            }
                        }
                    }
                }
            }
        },
        "/portfolios/{portfolio}/logo": {
            "put": {
                "operationId": "portfolios_logo_update",
                "summary": "Définit le logo (image de la bibliothèque).",
                "description": "Indisponible sur un site d’entreprise (403, code company_site) : il reprend le logo de l’entreprise, à changer avec companies_logo_update.",
                "tags": [
                    "Portfolios"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "portfolio",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du portfolio",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "media_id": {
                                                    "type": "string"
                                                },
                                                "collection": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "media_id": "01j9z000000000000000000017",
                                        "collection": "logo"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "media_id": {
                                        "type": "string",
                                        "description": "Identifiant d’une image de la bibliothèque (POST /files)"
                                    }
                                },
                                "required": [
                                    "media_id"
                                ]
                            },
                            "example": {
                                "media_id": "01j9z000000000000000000017"
                            }
                        }
                    }
                }
            },
            "delete": {
                "operationId": "portfolios_logo_destroy",
                "summary": "Retire le logo.",
                "description": "Indisponible sur un site d’entreprise (403, code company_site).",
                "tags": [
                    "Portfolios"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "portfolio",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du portfolio",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Supprimé"
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/portfolios/{portfolio}/favicon": {
            "put": {
                "operationId": "portfolios_favicon_update",
                "summary": "Définit la favicon (image de la bibliothèque), recompressée si elle dépasse le poids maximal.",
                "description": "Une image trop lourde est réduite : une copie compressée est ajoutée à la bibliothèque, et la réponse donne l’identifiant réellement rattaché. Indisponible sur un site d’entreprise (403, code company_site) : il reprend la favicon de l’entreprise, à changer avec companies_favicon_update.",
                "tags": [
                    "Portfolios"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "portfolio",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du portfolio",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "media_id": {
                                                    "type": "string"
                                                },
                                                "collection": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "media_id": "01j9z000000000000000000007",
                                        "collection": "favicon"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "media_id": {
                                        "type": "string",
                                        "description": "Identifiant d’une image de la bibliothèque (POST /files)"
                                    }
                                },
                                "required": [
                                    "media_id"
                                ]
                            },
                            "example": {
                                "media_id": "01j9z000000000000000000007"
                            }
                        }
                    }
                }
            },
            "delete": {
                "operationId": "portfolios_favicon_destroy",
                "summary": "Retire la favicon (le site reprend celle de la plateforme).",
                "description": "Indisponible sur un site d’entreprise (403, code company_site).",
                "tags": [
                    "Portfolios"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "portfolio",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du portfolio",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Supprimé"
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/portfolios/{portfolio}/hero-image": {
            "put": {
                "operationId": "portfolios_hero_image_update",
                "summary": "Définit l’image principale (image de la bibliothèque).",
                "description": "",
                "tags": [
                    "Portfolios"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "portfolio",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du portfolio",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "media_id": {
                                                    "type": "string"
                                                },
                                                "collection": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "media_id": "01j9z000000000000000000019",
                                        "collection": "hero_image"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "media_id": {
                                        "type": "string",
                                        "description": "Identifiant d’une image de la bibliothèque (POST /files)"
                                    }
                                },
                                "required": [
                                    "media_id"
                                ]
                            },
                            "example": {
                                "media_id": "01j9z000000000000000000019"
                            }
                        }
                    }
                }
            },
            "delete": {
                "operationId": "portfolios_hero_image_destroy",
                "summary": "Retire l’image principale.",
                "description": "",
                "tags": [
                    "Portfolios"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "portfolio",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du portfolio",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Supprimé"
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/portfolios/{portfolio}/sections": {
            "post": {
                "operationId": "portfolios_sections_store",
                "summary": "Ajoute une section en fin de liste.",
                "description": "Types : description (un texte), journey (parcours, formation), skills (compétences avec niveau), projects (projets, galerie et contenu riche), list (liste simple), services, testimonials, clients (logos), blog, keyvalues (clé/valeur), faq (question/réponse), gallery (une entrée = une image + légende facultative), video (une entrée = lien YouTube ou Vimeo + miniature facultative). show_on_home: false détache la section sur sa page dédiée ; une section de liste très longue obtient aussi sa page dédiée.",
                "tags": [
                    "Contenu du portfolio"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "portfolio",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du portfolio",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "201": {
                        "description": "Créé",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "type": {
                                                    "type": "string"
                                                },
                                                "title": {
                                                    "type": "string"
                                                },
                                                "position": {
                                                    "type": "integer"
                                                },
                                                "is_visible": {
                                                    "type": "boolean"
                                                },
                                                "show_on_home": {
                                                    "type": "boolean"
                                                },
                                                "entries": {
                                                    "type": "array",
                                                    "items": {}
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000041",
                                        "type": "faq",
                                        "title": "Questions fréquentes",
                                        "position": 5,
                                        "is_visible": true,
                                        "show_on_home": true,
                                        "entries": []
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "type": {
                                        "type": "string",
                                        "enum": [
                                            "description",
                                            "journey",
                                            "skills",
                                            "projects",
                                            "list",
                                            "services",
                                            "testimonials",
                                            "clients",
                                            "blog",
                                            "keyvalues",
                                            "faq",
                                            "gallery",
                                            "video"
                                        ],
                                        "description": "Type de section"
                                    },
                                    "title": {
                                        "type": "string",
                                        "description": "Titre (défaut selon le type)"
                                    },
                                    "show_on_home": {
                                        "type": "boolean",
                                        "description": "Afficher sur l’accueil (défaut vrai ; faux = la section a sa propre page publique)"
                                    }
                                },
                                "required": [
                                    "type"
                                ]
                            },
                            "example": {
                                "type": "faq",
                                "title": "Questions fréquentes"
                            }
                        }
                    }
                }
            }
        },
        "/portfolios/{portfolio}/sections/reorder": {
            "put": {
                "operationId": "portfolios_sections_reorder",
                "summary": "Réordonne les sections.",
                "description": "",
                "tags": [
                    "Contenu du portfolio"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "portfolio",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du portfolio",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "id": {
                                                        "type": "string"
                                                    },
                                                    "type": {
                                                        "type": "string"
                                                    },
                                                    "title": {
                                                        "type": "string"
                                                    },
                                                    "position": {
                                                        "type": "integer"
                                                    },
                                                    "is_visible": {
                                                        "type": "boolean"
                                                    },
                                                    "show_on_home": {
                                                        "type": "boolean"
                                                    },
                                                    "entries": {
                                                        "type": "array",
                                                        "items": {}
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": [
                                        {
                                            "id": "01j9z000000000000000000039",
                                            "type": "description",
                                            "title": "Description",
                                            "position": 1,
                                            "is_visible": true,
                                            "show_on_home": true,
                                            "entries": []
                                        },
                                        {
                                            "id": "01j9z000000000000000000040",
                                            "type": "journey",
                                            "title": "Parcours",
                                            "position": 2,
                                            "is_visible": true,
                                            "show_on_home": true,
                                            "entries": []
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "section_ids": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Tous les identifiants de sections, dans le nouvel ordre"
                                    }
                                },
                                "required": [
                                    "section_ids"
                                ]
                            },
                            "example": {
                                "section_ids": [
                                    "01j9z000000000000000000039",
                                    "01j9z000000000000000000040"
                                ]
                            }
                        }
                    }
                }
            }
        },
        "/portfolio-sections/{section}/insert-after": {
            "post": {
                "operationId": "portfolio_sections_insert_after",
                "summary": "Insère une section juste après {section}.",
                "description": "",
                "tags": [
                    "Contenu du portfolio"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "section",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant de la section",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "201": {
                        "description": "Créé",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "type": {
                                                    "type": "string"
                                                },
                                                "title": {
                                                    "type": "string"
                                                },
                                                "position": {
                                                    "type": "integer"
                                                },
                                                "is_visible": {
                                                    "type": "boolean"
                                                },
                                                "show_on_home": {
                                                    "type": "boolean"
                                                },
                                                "entries": {
                                                    "type": "array",
                                                    "items": {}
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000032",
                                        "type": "services",
                                        "title": "Prestations",
                                        "position": 5,
                                        "is_visible": true,
                                        "show_on_home": true,
                                        "entries": []
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "type": {
                                        "type": "string",
                                        "enum": [
                                            "description",
                                            "journey",
                                            "skills",
                                            "projects",
                                            "list",
                                            "services",
                                            "testimonials",
                                            "clients",
                                            "blog",
                                            "keyvalues",
                                            "faq",
                                            "gallery",
                                            "video"
                                        ],
                                        "description": "Type"
                                    },
                                    "title": {
                                        "type": "string",
                                        "description": "Titre"
                                    },
                                    "show_on_home": {
                                        "type": "boolean",
                                        "description": "Afficher sur l’accueil"
                                    }
                                },
                                "required": [
                                    "type"
                                ]
                            },
                            "example": {
                                "type": "services",
                                "title": "Services"
                            }
                        }
                    }
                }
            }
        },
        "/portfolio-sections/{section}": {
            "patch": {
                "operationId": "portfolio_sections_update",
                "summary": "Modifie titre, visibilité et mode d’affichage d’une section.",
                "description": "show_on_home: false = page dédiée (la section quitte l’accueil) ; true = intégrée à l’accueil. Mise à jour partielle : n’envoyez que les champs à changer, les autres restent inchangés (null ou une chaîne vide efface un champ facultatif). Un objet est fusionné clé par clé, une liste est remplacée en entier.",
                "tags": [
                    "Contenu du portfolio"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "section",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant de la section",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "type": {
                                                    "type": "string"
                                                },
                                                "title": {
                                                    "type": "string"
                                                },
                                                "position": {
                                                    "type": "integer"
                                                },
                                                "is_visible": {
                                                    "type": "boolean"
                                                },
                                                "show_on_home": {
                                                    "type": "boolean"
                                                },
                                                "entries": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "string"
                                                            },
                                                            "title": {
                                                                "type": "string"
                                                            },
                                                            "subtitle": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "description": {
                                                                "type": "string"
                                                            },
                                                            "content": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "start_date": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "end_date": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "data": {
                                                                "type": "array",
                                                                "items": {}
                                                            },
                                                            "position": {
                                                                "type": "integer"
                                                            },
                                                            "icon_id": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "icon": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "image": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "gallery": {
                                                                "type": "array",
                                                                "items": {}
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000033",
                                        "type": "projects",
                                        "title": "Réalisations",
                                        "position": 4,
                                        "is_visible": true,
                                        "show_on_home": true,
                                        "entries": [
                                            {
                                                "id": "01j9z000000000000000000031",
                                                "title": "Application de réservation",
                                                "subtitle": null,
                                                "description": "Prise de rendez-vous en ligne pour un réseau de cliniques.",
                                                "content": null,
                                                "start_date": null,
                                                "end_date": null,
                                                "data": [],
                                                "position": 1,
                                                "icon_id": null,
                                                "icon": null,
                                                "image": null,
                                                "gallery": []
                                            },
                                            {
                                                "id": "01j9z000000000000000000023",
                                                "title": "Boutique en ligne Sahel Craft",
                                                "subtitle": "E-commerce",
                                                "description": "Catalogue, paiement mobile et suivi des commandes.",
                                                "content": null,
                                                "start_date": "2025-03-01",
                                                "end_date": "2025-09-30",
                                                "data": {
                                                    "year": 2025,
                                                    "tags": [
                                                        "Laravel",
                                                        "Stripe"
                                                    ]
                                                },
                                                "position": 2,
                                                "icon_id": null,
                                                "icon": null,
                                                "image": {
                                                    "id": "01j9z000000000000000000024",
                                                    "url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000025.png",
                                                    "position": 1,
                                                    "alt_text": null,
                                                    "original_filename": "projet-boutique.png",
                                                    "mime_type": "image/png",
                                                    "size": 106,
                                                    "collection": "image",
                                                    "is_attached": true,
                                                    "created_at": "2026-09-15T09:30:00+00:00"
                                                },
                                                "gallery": [
                                                    {
                                                        "id": "01j9z000000000000000000026",
                                                        "url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000027.png",
                                                        "position": 1,
                                                        "alt_text": null,
                                                        "original_filename": "galerie-1.png",
                                                        "mime_type": "image/png",
                                                        "size": 106,
                                                        "collection": "gallery",
                                                        "is_attached": true,
                                                        "created_at": "2026-09-15T09:30:00+00:00"
                                                    }
                                                ]
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "title": {
                                        "type": "string",
                                        "description": "Titre"
                                    },
                                    "is_visible": {
                                        "type": "boolean",
                                        "description": "Visible"
                                    },
                                    "show_on_home": {
                                        "type": "boolean",
                                        "description": "Afficher sur l’accueil"
                                    }
                                }
                            },
                            "example": {
                                "title": "Réalisations",
                                "is_visible": true,
                                "show_on_home": true
                            }
                        }
                    }
                }
            },
            "delete": {
                "operationId": "portfolio_sections_destroy",
                "summary": "Supprime une section et ses entrées.",
                "description": "",
                "tags": [
                    "Contenu du portfolio"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "section",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant de la section",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Supprimé"
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/portfolio-sections/{section}/entries": {
            "post": {
                "operationId": "portfolio_sections_entries_store",
                "summary": "Ajoute une entrée à une section (limite du plan appliquée).",
                "description": "Champs requis selon le type de section : titre (sauf description, gallery, video), subtitle pour keyvalues, description pour faq, data.url pour video. Une entrée de galerie porte son image dans image_media_ids.",
                "tags": [
                    "Contenu du portfolio"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "section",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant de la section",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "201": {
                        "description": "Créé",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "title": {
                                                    "type": "string"
                                                },
                                                "subtitle": {
                                                    "type": "string"
                                                },
                                                "description": {
                                                    "type": "string"
                                                },
                                                "content": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "start_date": {
                                                    "type": "string"
                                                },
                                                "end_date": {
                                                    "type": "string"
                                                },
                                                "data": {
                                                    "type": "object",
                                                    "properties": {
                                                        "year": {
                                                            "type": "integer"
                                                        },
                                                        "tags": {
                                                            "type": "array",
                                                            "items": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "position": {
                                                    "type": "integer"
                                                },
                                                "icon_id": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "icon": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "image": {
                                                    "type": "object",
                                                    "properties": {
                                                        "id": {
                                                            "type": "string"
                                                        },
                                                        "url": {
                                                            "type": "string"
                                                        },
                                                        "position": {
                                                            "type": "integer"
                                                        },
                                                        "alt_text": {
                                                            "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                        },
                                                        "original_filename": {
                                                            "type": "string"
                                                        },
                                                        "mime_type": {
                                                            "type": "string"
                                                        },
                                                        "size": {
                                                            "type": "integer"
                                                        },
                                                        "collection": {
                                                            "type": "string"
                                                        },
                                                        "is_attached": {
                                                            "type": "boolean"
                                                        },
                                                        "created_at": {
                                                            "type": "string"
                                                        }
                                                    }
                                                },
                                                "gallery": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "string"
                                                            },
                                                            "url": {
                                                                "type": "string"
                                                            },
                                                            "position": {
                                                                "type": "integer"
                                                            },
                                                            "alt_text": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "original_filename": {
                                                                "type": "string"
                                                            },
                                                            "mime_type": {
                                                                "type": "string"
                                                            },
                                                            "size": {
                                                                "type": "integer"
                                                            },
                                                            "collection": {
                                                                "type": "string"
                                                            },
                                                            "is_attached": {
                                                                "type": "boolean"
                                                            },
                                                            "created_at": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000023",
                                        "title": "Boutique en ligne Sahel Craft",
                                        "subtitle": "E-commerce",
                                        "description": "Catalogue, paiement mobile et suivi des commandes.",
                                        "content": null,
                                        "start_date": "2025-03-01",
                                        "end_date": "2025-09-30",
                                        "data": {
                                            "year": 2025,
                                            "tags": [
                                                "Laravel",
                                                "Stripe"
                                            ]
                                        },
                                        "position": 1,
                                        "icon_id": null,
                                        "icon": null,
                                        "image": {
                                            "id": "01j9z000000000000000000024",
                                            "url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000025.png",
                                            "position": 1,
                                            "alt_text": null,
                                            "original_filename": "projet-boutique.png",
                                            "mime_type": "image/png",
                                            "size": 106,
                                            "collection": "image",
                                            "is_attached": true,
                                            "created_at": "2026-09-15T09:30:00+00:00"
                                        },
                                        "gallery": [
                                            {
                                                "id": "01j9z000000000000000000026",
                                                "url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000027.png",
                                                "position": 1,
                                                "alt_text": null,
                                                "original_filename": "galerie-1.png",
                                                "mime_type": "image/png",
                                                "size": 106,
                                                "collection": "gallery",
                                                "is_attached": true,
                                                "created_at": "2026-09-15T09:30:00+00:00"
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "title": {
                                        "type": "string",
                                        "description": "Titre (requis sauf pour description, galerie et vidéo)"
                                    },
                                    "subtitle": {
                                        "type": "string",
                                        "description": "Sous-titre (valeur pour une section clés-valeurs)"
                                    },
                                    "description": {
                                        "type": "string",
                                        "description": "Texte (réponse pour une FAQ)"
                                    },
                                    "content": {
                                        "type": "string",
                                        "description": "Contenu long en HTML (assaini côté serveur, 50 000 car. max ; sections « projets » uniquement)"
                                    },
                                    "start_date": {
                                        "type": "string",
                                        "description": "Date de début (AAAA-MM-JJ)"
                                    },
                                    "end_date": {
                                        "type": "string",
                                        "description": "Date de fin (AAAA-MM-JJ, ≥ début)"
                                    },
                                    "data": {
                                        "type": "object",
                                        "description": "Champs propres au type : rating (0-100 pour les compétences, 0-5 pour les témoignages), year, project_types[], tags[], url (liens ; obligatoire et limité à YouTube/Vimeo pour une vidéo)"
                                    },
                                    "icon_id": {
                                        "type": "string",
                                        "description": "Identifiant d’icône de la bibliothèque (GET /portfolio-icons)"
                                    },
                                    "image_media_ids": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Un identifiant de fichier de la bibliothèque (voir POST /files) : image de l’entrée, image d’une galerie, miniature d’une vidéo"
                                    },
                                    "gallery_media_ids": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Identifiants de fichiers qui s’ajoutent à la galerie (sections « projets » uniquement ; retrait : DELETE …/media/{media})"
                                    }
                                }
                            },
                            "example": {
                                "title": "Boutique en ligne Sahel Craft",
                                "subtitle": "E-commerce",
                                "description": "Catalogue, paiement mobile et suivi des commandes.",
                                "start_date": "2025-03-01",
                                "end_date": "2025-09-30",
                                "data": {
                                    "year": 2025,
                                    "tags": [
                                        "Laravel",
                                        "Stripe"
                                    ]
                                },
                                "image_media_ids": [
                                    "01j9z000000000000000000024"
                                ],
                                "gallery_media_ids": [
                                    "01j9z000000000000000000026"
                                ]
                            }
                        }
                    }
                }
            }
        },
        "/portfolio-sections/{section}/entries/reorder": {
            "put": {
                "operationId": "portfolio_sections_entries_reorder",
                "summary": "Réordonne les entrées d’une section.",
                "description": "",
                "tags": [
                    "Contenu du portfolio"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "section",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant de la section",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "id": {
                                                        "type": "string"
                                                    },
                                                    "title": {
                                                        "type": "string"
                                                    },
                                                    "subtitle": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "description": {
                                                        "type": "string"
                                                    },
                                                    "content": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "start_date": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "end_date": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "data": {
                                                        "type": "array",
                                                        "items": {}
                                                    },
                                                    "position": {
                                                        "type": "integer"
                                                    },
                                                    "icon_id": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "icon": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "image": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "gallery": {
                                                        "type": "array",
                                                        "items": {}
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": [
                                        {
                                            "id": "01j9z000000000000000000031",
                                            "title": "Application de réservation",
                                            "subtitle": null,
                                            "description": "Prise de rendez-vous en ligne pour un réseau de cliniques.",
                                            "content": null,
                                            "start_date": null,
                                            "end_date": null,
                                            "data": [],
                                            "position": 1,
                                            "icon_id": null,
                                            "icon": null,
                                            "image": null,
                                            "gallery": []
                                        },
                                        {
                                            "id": "01j9z000000000000000000023",
                                            "title": "Boutique en ligne Sahel Craft",
                                            "subtitle": "E-commerce",
                                            "description": "Catalogue, paiement mobile et suivi des commandes.",
                                            "content": null,
                                            "start_date": "2025-03-01",
                                            "end_date": "2025-09-30",
                                            "data": {
                                                "year": 2025,
                                                "tags": [
                                                    "Laravel",
                                                    "Stripe"
                                                ]
                                            },
                                            "position": 2,
                                            "icon_id": null,
                                            "icon": null,
                                            "image": {
                                                "id": "01j9z000000000000000000024",
                                                "url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000025.png",
                                                "position": 1,
                                                "alt_text": null,
                                                "original_filename": "projet-boutique.png",
                                                "mime_type": "image/png",
                                                "size": 106,
                                                "collection": "image",
                                                "is_attached": true,
                                                "created_at": "2026-09-15T09:30:00+00:00"
                                            },
                                            "gallery": [
                                                {
                                                    "id": "01j9z000000000000000000026",
                                                    "url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000027.png",
                                                    "position": 1,
                                                    "alt_text": null,
                                                    "original_filename": "galerie-1.png",
                                                    "mime_type": "image/png",
                                                    "size": 106,
                                                    "collection": "gallery",
                                                    "is_attached": true,
                                                    "created_at": "2026-09-15T09:30:00+00:00"
                                                }
                                            ]
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "entry_ids": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Identifiants d’entrées dans le nouvel ordre"
                                    }
                                },
                                "required": [
                                    "entry_ids"
                                ]
                            },
                            "example": {
                                "entry_ids": [
                                    "01j9z000000000000000000031",
                                    "01j9z000000000000000000023"
                                ]
                            }
                        }
                    }
                }
            }
        },
        "/portfolio-entries/{entry}": {
            "patch": {
                "operationId": "portfolio_entries_update",
                "summary": "Modifie une entrée.",
                "description": "Mise à jour partielle : n’envoyez que les champs à changer, les autres restent inchangés (null ou une chaîne vide efface un champ facultatif). Un objet est fusionné clé par clé, une liste est remplacée en entier.",
                "tags": [
                    "Contenu du portfolio"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "entry",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant de l’entrée",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "title": {
                                                    "type": "string"
                                                },
                                                "subtitle": {
                                                    "type": "string"
                                                },
                                                "description": {
                                                    "type": "string"
                                                },
                                                "content": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "start_date": {
                                                    "type": "string"
                                                },
                                                "end_date": {
                                                    "type": "string"
                                                },
                                                "data": {
                                                    "type": "object",
                                                    "properties": {
                                                        "year": {
                                                            "type": "integer"
                                                        },
                                                        "tags": {
                                                            "type": "array",
                                                            "items": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "position": {
                                                    "type": "integer"
                                                },
                                                "icon_id": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "icon": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "image": {
                                                    "type": "object",
                                                    "properties": {
                                                        "id": {
                                                            "type": "string"
                                                        },
                                                        "url": {
                                                            "type": "string"
                                                        },
                                                        "position": {
                                                            "type": "integer"
                                                        },
                                                        "alt_text": {
                                                            "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                        },
                                                        "original_filename": {
                                                            "type": "string"
                                                        },
                                                        "mime_type": {
                                                            "type": "string"
                                                        },
                                                        "size": {
                                                            "type": "integer"
                                                        },
                                                        "collection": {
                                                            "type": "string"
                                                        },
                                                        "is_attached": {
                                                            "type": "boolean"
                                                        },
                                                        "created_at": {
                                                            "type": "string"
                                                        }
                                                    }
                                                },
                                                "gallery": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "string"
                                                            },
                                                            "url": {
                                                                "type": "string"
                                                            },
                                                            "position": {
                                                                "type": "integer"
                                                            },
                                                            "alt_text": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "original_filename": {
                                                                "type": "string"
                                                            },
                                                            "mime_type": {
                                                                "type": "string"
                                                            },
                                                            "size": {
                                                                "type": "integer"
                                                            },
                                                            "collection": {
                                                                "type": "string"
                                                            },
                                                            "is_attached": {
                                                                "type": "boolean"
                                                            },
                                                            "created_at": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000023",
                                        "title": "Boutique en ligne Sahel Craft",
                                        "subtitle": "E-commerce",
                                        "description": "Catalogue, paiement mobile et suivi des commandes.",
                                        "content": null,
                                        "start_date": "2025-03-01",
                                        "end_date": "2025-09-30",
                                        "data": {
                                            "year": 2025,
                                            "tags": [
                                                "Laravel",
                                                "Stripe"
                                            ]
                                        },
                                        "position": 1,
                                        "icon_id": null,
                                        "icon": null,
                                        "image": {
                                            "id": "01j9z000000000000000000024",
                                            "url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000025.png",
                                            "position": 1,
                                            "alt_text": null,
                                            "original_filename": "projet-boutique.png",
                                            "mime_type": "image/png",
                                            "size": 106,
                                            "collection": "image",
                                            "is_attached": true,
                                            "created_at": "2026-09-15T09:30:00+00:00"
                                        },
                                        "gallery": [
                                            {
                                                "id": "01j9z000000000000000000026",
                                                "url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000027.png",
                                                "position": 1,
                                                "alt_text": null,
                                                "original_filename": "galerie-1.png",
                                                "mime_type": "image/png",
                                                "size": 106,
                                                "collection": "gallery",
                                                "is_attached": true,
                                                "created_at": "2026-09-15T09:30:00+00:00"
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "title": {
                                        "type": "string",
                                        "description": "Titre (requis sauf pour description, galerie et vidéo)"
                                    },
                                    "subtitle": {
                                        "type": "string",
                                        "description": "Sous-titre (valeur pour une section clés-valeurs)"
                                    },
                                    "description": {
                                        "type": "string",
                                        "description": "Texte (réponse pour une FAQ)"
                                    },
                                    "content": {
                                        "type": "string",
                                        "description": "Contenu long en HTML (assaini côté serveur, 50 000 car. max ; sections « projets » uniquement)"
                                    },
                                    "start_date": {
                                        "type": "string",
                                        "description": "Date de début (AAAA-MM-JJ)"
                                    },
                                    "end_date": {
                                        "type": "string",
                                        "description": "Date de fin (AAAA-MM-JJ, ≥ début)"
                                    },
                                    "data": {
                                        "type": "object",
                                        "description": "Champs propres au type : rating (0-100 pour les compétences, 0-5 pour les témoignages), year, project_types[], tags[], url (liens ; obligatoire et limité à YouTube/Vimeo pour une vidéo)"
                                    },
                                    "icon_id": {
                                        "type": "string",
                                        "description": "Identifiant d’icône de la bibliothèque (GET /portfolio-icons)"
                                    },
                                    "image_media_ids": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Un identifiant de fichier de la bibliothèque (voir POST /files) : image de l’entrée, image d’une galerie, miniature d’une vidéo"
                                    },
                                    "gallery_media_ids": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Identifiants de fichiers qui s’ajoutent à la galerie (sections « projets » uniquement ; retrait : DELETE …/media/{media})"
                                    }
                                }
                            },
                            "example": {
                                "title": "Boutique en ligne Sahel Craft",
                                "subtitle": "E-commerce",
                                "description": "Catalogue, paiement mobile et suivi des commandes.",
                                "data": {
                                    "year": 2025,
                                    "tags": [
                                        "Laravel",
                                        "Stripe"
                                    ]
                                }
                            }
                        }
                    }
                }
            },
            "delete": {
                "operationId": "portfolio_entries_destroy",
                "summary": "Supprime une entrée.",
                "description": "",
                "tags": [
                    "Contenu du portfolio"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "entry",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant de l’entrée",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Supprimé"
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/portfolio-entries/{entry}/media/{media}": {
            "delete": {
                "operationId": "portfolio_entries_media_destroy",
                "summary": "Retire un média d’une entrée (le fichier reste dans la bibliothèque).",
                "description": "",
                "tags": [
                    "Contenu du portfolio"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "entry",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant de l’entrée",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "media",
                        "in": "path",
                        "required": true,
                        "description": "media",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Supprimé"
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/portfolios/{portfolio}/theme": {
            "get": {
                "operationId": "portfolios_theme_show",
                "summary": "Thème du portfolio (couleurs, polices, gabarit).",
                "description": "",
                "tags": [
                    "Thème et publication"
                ],
                "x-required-scope": "read",
                "parameters": [
                    {
                        "name": "portfolio",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du portfolio",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "color_primary": {
                                                    "type": "string"
                                                },
                                                "color_secondary": {
                                                    "type": "string"
                                                },
                                                "color_text": {
                                                    "type": "string"
                                                },
                                                "color_background": {
                                                    "type": "string"
                                                },
                                                "use_gradients": {
                                                    "type": "integer"
                                                },
                                                "invert_colors": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "heading_font": {
                                                    "type": "string"
                                                },
                                                "body_font": {
                                                    "type": "string"
                                                },
                                                "badge_font": {
                                                    "type": "string"
                                                },
                                                "icon_style": {
                                                    "type": "string"
                                                },
                                                "icon_set": {
                                                    "type": "string"
                                                },
                                                "radius_scale": {
                                                    "type": "string"
                                                },
                                                "spacing_scale": {
                                                    "type": "string"
                                                },
                                                "typography": {
                                                    "type": "object",
                                                    "properties": {
                                                        "heading_1": {
                                                            "type": "object",
                                                            "properties": {
                                                                "size": {
                                                                    "type": "string"
                                                                },
                                                                "weight": {
                                                                    "type": "string"
                                                                }
                                                            }
                                                        },
                                                        "heading_2": {
                                                            "type": "object",
                                                            "properties": {
                                                                "size": {
                                                                    "type": "string"
                                                                },
                                                                "weight": {
                                                                    "type": "string"
                                                                }
                                                            }
                                                        },
                                                        "heading_3": {
                                                            "type": "object",
                                                            "properties": {
                                                                "size": {
                                                                    "type": "string"
                                                                },
                                                                "weight": {
                                                                    "type": "string"
                                                                }
                                                            }
                                                        },
                                                        "body": {
                                                            "type": "object",
                                                            "properties": {
                                                                "size": {
                                                                    "type": "string"
                                                                },
                                                                "weight": {
                                                                    "type": "string"
                                                                }
                                                            }
                                                        },
                                                        "badge": {
                                                            "type": "object",
                                                            "properties": {
                                                                "size": {
                                                                    "type": "string"
                                                                },
                                                                "weight": {
                                                                    "type": "string"
                                                                }
                                                            }
                                                        }
                                                    }
                                                },
                                                "theme_template_id": {
                                                    "type": "string"
                                                },
                                                "theme_template": {
                                                    "type": "object",
                                                    "properties": {
                                                        "id": {
                                                            "type": "string"
                                                        },
                                                        "name": {
                                                            "type": "string"
                                                        },
                                                        "slug": {
                                                            "type": "string"
                                                        },
                                                        "tier": {
                                                            "type": "string"
                                                        },
                                                        "description": {
                                                            "type": "string"
                                                        },
                                                        "preview_url": {
                                                            "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000042",
                                        "color_primary": "#4f39f6",
                                        "color_secondary": "#432dd7",
                                        "color_text": "#0a0a0a",
                                        "color_background": "#ffffff",
                                        "use_gradients": 1,
                                        "invert_colors": null,
                                        "heading_font": "Inter",
                                        "body_font": "Inter",
                                        "badge_font": "Inter",
                                        "icon_style": "outline",
                                        "icon_set": "lucide",
                                        "radius_scale": "slight",
                                        "spacing_scale": "comfortable",
                                        "typography": {
                                            "heading_1": {
                                                "size": "xl",
                                                "weight": "bold"
                                            },
                                            "heading_2": {
                                                "size": "lg",
                                                "weight": "bold"
                                            },
                                            "heading_3": {
                                                "size": "md",
                                                "weight": "medium"
                                            },
                                            "body": {
                                                "size": "md",
                                                "weight": "regular"
                                            },
                                            "badge": {
                                                "size": "sm",
                                                "weight": "medium"
                                            }
                                        },
                                        "theme_template_id": "01j9z000000000000000000043",
                                        "theme_template": {
                                            "id": "01j9z000000000000000000043",
                                            "name": "Essentiel",
                                            "slug": "essentiel",
                                            "tier": "free",
                                            "description": "Une page épurée, portrait et projets en grille.",
                                            "preview_url": null
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            },
            "patch": {
                "operationId": "portfolios_theme_update",
                "summary": "Modifie le thème (couleurs, polices, échelles, gabarit).",
                "description": "Mise à jour partielle : n’envoyez que les champs à changer, les autres restent inchangés (null ou une chaîne vide efface un champ facultatif). Un objet est fusionné clé par clé, une liste est remplacée en entier.",
                "tags": [
                    "Thème et publication"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "portfolio",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du portfolio",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "color_primary": {
                                                    "type": "string"
                                                },
                                                "color_secondary": {
                                                    "type": "string"
                                                },
                                                "color_text": {
                                                    "type": "string"
                                                },
                                                "color_background": {
                                                    "type": "string"
                                                },
                                                "use_gradients": {
                                                    "type": "integer"
                                                },
                                                "invert_colors": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "heading_font": {
                                                    "type": "string"
                                                },
                                                "body_font": {
                                                    "type": "string"
                                                },
                                                "badge_font": {
                                                    "type": "string"
                                                },
                                                "icon_style": {
                                                    "type": "string"
                                                },
                                                "icon_set": {
                                                    "type": "string"
                                                },
                                                "radius_scale": {
                                                    "type": "string"
                                                },
                                                "spacing_scale": {
                                                    "type": "string"
                                                },
                                                "typography": {
                                                    "type": "object",
                                                    "properties": {
                                                        "heading_1": {
                                                            "type": "object",
                                                            "properties": {
                                                                "size": {
                                                                    "type": "string"
                                                                },
                                                                "weight": {
                                                                    "type": "string"
                                                                }
                                                            }
                                                        },
                                                        "heading_2": {
                                                            "type": "object",
                                                            "properties": {
                                                                "size": {
                                                                    "type": "string"
                                                                },
                                                                "weight": {
                                                                    "type": "string"
                                                                }
                                                            }
                                                        },
                                                        "heading_3": {
                                                            "type": "object",
                                                            "properties": {
                                                                "size": {
                                                                    "type": "string"
                                                                },
                                                                "weight": {
                                                                    "type": "string"
                                                                }
                                                            }
                                                        },
                                                        "body": {
                                                            "type": "object",
                                                            "properties": {
                                                                "size": {
                                                                    "type": "string"
                                                                },
                                                                "weight": {
                                                                    "type": "string"
                                                                }
                                                            }
                                                        },
                                                        "badge": {
                                                            "type": "object",
                                                            "properties": {
                                                                "size": {
                                                                    "type": "string"
                                                                },
                                                                "weight": {
                                                                    "type": "string"
                                                                }
                                                            }
                                                        }
                                                    }
                                                },
                                                "theme_template_id": {
                                                    "type": "string"
                                                },
                                                "theme_template": {
                                                    "type": "object",
                                                    "properties": {
                                                        "id": {
                                                            "type": "string"
                                                        },
                                                        "name": {
                                                            "type": "string"
                                                        },
                                                        "slug": {
                                                            "type": "string"
                                                        },
                                                        "tier": {
                                                            "type": "string"
                                                        },
                                                        "description": {
                                                            "type": "string"
                                                        },
                                                        "preview_url": {
                                                            "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000042",
                                        "color_primary": "#bf6b15",
                                        "color_secondary": "#432dd7",
                                        "color_text": "#0a0a0a",
                                        "color_background": "#ffffff",
                                        "use_gradients": 1,
                                        "invert_colors": null,
                                        "heading_font": "Inter",
                                        "body_font": "Inter",
                                        "badge_font": "Inter",
                                        "icon_style": "outline",
                                        "icon_set": "lucide",
                                        "radius_scale": "slight",
                                        "spacing_scale": "comfortable",
                                        "typography": {
                                            "heading_1": {
                                                "size": "xl",
                                                "weight": "bold"
                                            },
                                            "heading_2": {
                                                "size": "lg",
                                                "weight": "bold"
                                            },
                                            "heading_3": {
                                                "size": "md",
                                                "weight": "medium"
                                            },
                                            "body": {
                                                "size": "md",
                                                "weight": "regular"
                                            },
                                            "badge": {
                                                "size": "sm",
                                                "weight": "medium"
                                            }
                                        },
                                        "theme_template_id": "01j9z000000000000000000043",
                                        "theme_template": {
                                            "id": "01j9z000000000000000000043",
                                            "name": "Essentiel",
                                            "slug": "essentiel",
                                            "tier": "free",
                                            "description": "Une page épurée, portrait et projets en grille.",
                                            "preview_url": null
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "color_primary": {
                                        "type": "string",
                                        "description": "Couleur principale (#RRGGBB)"
                                    },
                                    "color_secondary": {
                                        "type": "string",
                                        "description": "Couleur secondaire"
                                    },
                                    "color_text": {
                                        "type": "string",
                                        "description": "Couleur du texte"
                                    },
                                    "color_background": {
                                        "type": "string",
                                        "description": "Couleur de fond"
                                    },
                                    "use_gradients": {
                                        "type": "boolean",
                                        "description": "Dégradés"
                                    },
                                    "invert_colors": {
                                        "type": "boolean",
                                        "description": "Inverser l’usage des couleurs par le gabarit"
                                    },
                                    "heading_font": {
                                        "type": "string",
                                        "description": "Police des titres"
                                    },
                                    "body_font": {
                                        "type": "string",
                                        "description": "Police du texte"
                                    },
                                    "badge_font": {
                                        "type": "string",
                                        "description": "Police des badges"
                                    },
                                    "icon_style": {
                                        "type": "string",
                                        "description": "Style d’icônes"
                                    },
                                    "icon_set": {
                                        "type": "string",
                                        "description": "Jeu d’icônes"
                                    },
                                    "radius_scale": {
                                        "type": "string",
                                        "description": "Échelle des arrondis"
                                    },
                                    "spacing_scale": {
                                        "type": "string",
                                        "description": "Échelle des espacements"
                                    },
                                    "typography": {
                                        "type": "object",
                                        "description": "Tailles et graisses par niveau : { niveau: { size, weight } }"
                                    },
                                    "theme_template_id": {
                                        "type": "string",
                                        "description": "Identifiant du gabarit (voir …/theme/templates)"
                                    }
                                }
                            },
                            "example": {
                                "color_primary": "#bf6b15",
                                "color_secondary": "#432dd7",
                                "color_text": "#0a0a0a",
                                "color_background": "#ffffff",
                                "use_gradients": 1,
                                "invert_colors": null,
                                "heading_font": "Inter",
                                "body_font": "Inter",
                                "badge_font": "Inter",
                                "icon_style": "outline",
                                "icon_set": "lucide",
                                "radius_scale": "slight",
                                "spacing_scale": "comfortable",
                                "typography": {
                                    "heading_1": {
                                        "size": "xl",
                                        "weight": "bold"
                                    },
                                    "heading_2": {
                                        "size": "lg",
                                        "weight": "bold"
                                    },
                                    "heading_3": {
                                        "size": "md",
                                        "weight": "medium"
                                    },
                                    "body": {
                                        "size": "md",
                                        "weight": "regular"
                                    },
                                    "badge": {
                                        "size": "sm",
                                        "weight": "medium"
                                    }
                                },
                                "theme_template_id": "01j9z000000000000000000043"
                            }
                        }
                    }
                }
            }
        },
        "/portfolios/{portfolio}/theme/templates": {
            "get": {
                "operationId": "portfolios_theme_templates",
                "summary": "Gabarits proposés, avec leur verrouillage selon la formule (allowed).",
                "description": "",
                "tags": [
                    "Thème et publication"
                ],
                "x-required-scope": "read",
                "parameters": [
                    {
                        "name": "portfolio",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du portfolio",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "id": {
                                                        "type": "string"
                                                    },
                                                    "name": {
                                                        "type": "string"
                                                    },
                                                    "slug": {
                                                        "type": "string"
                                                    },
                                                    "description": {
                                                        "type": "string"
                                                    },
                                                    "preview_url": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "tier": {
                                                        "type": "string"
                                                    },
                                                    "image_specs": {
                                                        "type": "object",
                                                        "properties": {
                                                            "hero": {
                                                                "type": "object",
                                                                "properties": {
                                                                    "ratio": {
                                                                        "type": "string"
                                                                    },
                                                                    "min_width": {
                                                                        "type": "integer"
                                                                    }
                                                                }
                                                            },
                                                            "description": {
                                                                "type": "object",
                                                                "properties": {
                                                                    "ratio": {
                                                                        "type": "string"
                                                                    },
                                                                    "min_width": {
                                                                        "type": "integer"
                                                                    }
                                                                }
                                                            },
                                                            "journey": {
                                                                "type": "object",
                                                                "properties": {
                                                                    "ratio": {
                                                                        "type": "string"
                                                                    },
                                                                    "min_width": {
                                                                        "type": "integer"
                                                                    }
                                                                }
                                                            },
                                                            "projects": {
                                                                "type": "object",
                                                                "properties": {
                                                                    "ratio": {
                                                                        "type": "string"
                                                                    },
                                                                    "min_width": {
                                                                        "type": "integer"
                                                                    }
                                                                }
                                                            },
                                                            "projects_gallery": {
                                                                "type": "object",
                                                                "properties": {
                                                                    "ratio": {
                                                                        "type": "string"
                                                                    },
                                                                    "min_width": {
                                                                        "type": "integer"
                                                                    }
                                                                }
                                                            },
                                                            "testimonials": {
                                                                "type": "object",
                                                                "properties": {
                                                                    "ratio": {
                                                                        "type": "string"
                                                                    },
                                                                    "min_width": {
                                                                        "type": "integer"
                                                                    }
                                                                }
                                                            },
                                                            "blog": {
                                                                "type": "object",
                                                                "properties": {
                                                                    "ratio": {
                                                                        "type": "string"
                                                                    },
                                                                    "min_width": {
                                                                        "type": "integer"
                                                                    }
                                                                }
                                                            },
                                                            "gallery": {
                                                                "type": "object",
                                                                "properties": {
                                                                    "ratio": {
                                                                        "type": "string"
                                                                    },
                                                                    "min_width": {
                                                                        "type": "integer"
                                                                    }
                                                                }
                                                            },
                                                            "video": {
                                                                "type": "object",
                                                                "properties": {
                                                                    "ratio": {
                                                                        "type": "string"
                                                                    },
                                                                    "min_width": {
                                                                        "type": "integer"
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    },
                                                    "allowed": {
                                                        "type": "boolean"
                                                    },
                                                    "exclusive": {
                                                        "type": "boolean"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "selected_template_id": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": [
                                        {
                                            "id": "01j9z000000000000000000043",
                                            "name": "Essentiel",
                                            "slug": "essentiel",
                                            "description": "Une page épurée, portrait et projets en grille.",
                                            "preview_url": null,
                                            "tier": "free",
                                            "image_specs": {
                                                "hero": {
                                                    "ratio": "1:1",
                                                    "min_width": 1000
                                                },
                                                "description": {
                                                    "ratio": "4:3",
                                                    "min_width": 1000
                                                },
                                                "journey": {
                                                    "ratio": "1:1",
                                                    "min_width": 400
                                                },
                                                "projects": {
                                                    "ratio": "16:9",
                                                    "min_width": 1200
                                                },
                                                "projects_gallery": {
                                                    "ratio": "16:9",
                                                    "min_width": 1200
                                                },
                                                "testimonials": {
                                                    "ratio": "1:1",
                                                    "min_width": 400
                                                },
                                                "blog": {
                                                    "ratio": "16:9",
                                                    "min_width": 1200
                                                },
                                                "gallery": {
                                                    "ratio": "16:10",
                                                    "min_width": 1200
                                                },
                                                "video": {
                                                    "ratio": "16:9",
                                                    "min_width": 1200
                                                }
                                            },
                                            "allowed": true,
                                            "exclusive": false
                                        },
                                        {
                                            "id": "01j9z000000000000000000044",
                                            "name": "Vitrine",
                                            "slug": "vitrine",
                                            "description": "Un profil complet : chiffres clés, services, projets, avis et blog.",
                                            "preview_url": null,
                                            "tier": "pro",
                                            "image_specs": {
                                                "hero": {
                                                    "ratio": "1:1",
                                                    "min_width": 1000
                                                },
                                                "description": {
                                                    "ratio": "4:3",
                                                    "min_width": 1000
                                                },
                                                "journey": {
                                                    "ratio": "1:1",
                                                    "min_width": 400
                                                },
                                                "projects": {
                                                    "ratio": "16:9",
                                                    "min_width": 1200
                                                },
                                                "projects_gallery": {
                                                    "ratio": "16:9",
                                                    "min_width": 1200
                                                },
                                                "testimonials": {
                                                    "ratio": "1:1",
                                                    "min_width": 400
                                                },
                                                "blog": {
                                                    "ratio": "16:9",
                                                    "min_width": 1200
                                                },
                                                "gallery": {
                                                    "ratio": "16:9",
                                                    "min_width": 1200
                                                },
                                                "video": {
                                                    "ratio": "16:9",
                                                    "min_width": 1200
                                                }
                                            },
                                            "allowed": true,
                                            "exclusive": false
                                        }
                                    ],
                                    "meta": {
                                        "selected_template_id": "01j9z000000000000000000043"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            },
            "put": {
                "operationId": "portfolios_theme_template_update",
                "summary": "Change uniquement le gabarit.",
                "description": "",
                "tags": [
                    "Thème et publication"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "portfolio",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du portfolio",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "color_primary": {
                                                    "type": "string"
                                                },
                                                "color_secondary": {
                                                    "type": "string"
                                                },
                                                "color_text": {
                                                    "type": "string"
                                                },
                                                "color_background": {
                                                    "type": "string"
                                                },
                                                "use_gradients": {
                                                    "type": "integer"
                                                },
                                                "invert_colors": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "heading_font": {
                                                    "type": "string"
                                                },
                                                "body_font": {
                                                    "type": "string"
                                                },
                                                "badge_font": {
                                                    "type": "string"
                                                },
                                                "icon_style": {
                                                    "type": "string"
                                                },
                                                "icon_set": {
                                                    "type": "string"
                                                },
                                                "radius_scale": {
                                                    "type": "string"
                                                },
                                                "spacing_scale": {
                                                    "type": "string"
                                                },
                                                "typography": {
                                                    "type": "object",
                                                    "properties": {
                                                        "heading_1": {
                                                            "type": "object",
                                                            "properties": {
                                                                "size": {
                                                                    "type": "string"
                                                                },
                                                                "weight": {
                                                                    "type": "string"
                                                                }
                                                            }
                                                        },
                                                        "heading_2": {
                                                            "type": "object",
                                                            "properties": {
                                                                "size": {
                                                                    "type": "string"
                                                                },
                                                                "weight": {
                                                                    "type": "string"
                                                                }
                                                            }
                                                        },
                                                        "heading_3": {
                                                            "type": "object",
                                                            "properties": {
                                                                "size": {
                                                                    "type": "string"
                                                                },
                                                                "weight": {
                                                                    "type": "string"
                                                                }
                                                            }
                                                        },
                                                        "body": {
                                                            "type": "object",
                                                            "properties": {
                                                                "size": {
                                                                    "type": "string"
                                                                },
                                                                "weight": {
                                                                    "type": "string"
                                                                }
                                                            }
                                                        },
                                                        "badge": {
                                                            "type": "object",
                                                            "properties": {
                                                                "size": {
                                                                    "type": "string"
                                                                },
                                                                "weight": {
                                                                    "type": "string"
                                                                }
                                                            }
                                                        }
                                                    }
                                                },
                                                "theme_template_id": {
                                                    "type": "string"
                                                },
                                                "theme_template": {
                                                    "type": "object",
                                                    "properties": {
                                                        "id": {
                                                            "type": "string"
                                                        },
                                                        "name": {
                                                            "type": "string"
                                                        },
                                                        "slug": {
                                                            "type": "string"
                                                        },
                                                        "tier": {
                                                            "type": "string"
                                                        },
                                                        "description": {
                                                            "type": "string"
                                                        },
                                                        "preview_url": {
                                                            "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000042",
                                        "color_primary": "#bf6b15",
                                        "color_secondary": "#432dd7",
                                        "color_text": "#0a0a0a",
                                        "color_background": "#ffffff",
                                        "use_gradients": 1,
                                        "invert_colors": null,
                                        "heading_font": "Inter",
                                        "body_font": "Inter",
                                        "badge_font": "Inter",
                                        "icon_style": "outline",
                                        "icon_set": "lucide",
                                        "radius_scale": "slight",
                                        "spacing_scale": "comfortable",
                                        "typography": {
                                            "heading_1": {
                                                "size": "xl",
                                                "weight": "bold"
                                            },
                                            "heading_2": {
                                                "size": "lg",
                                                "weight": "bold"
                                            },
                                            "heading_3": {
                                                "size": "md",
                                                "weight": "medium"
                                            },
                                            "body": {
                                                "size": "md",
                                                "weight": "regular"
                                            },
                                            "badge": {
                                                "size": "sm",
                                                "weight": "medium"
                                            }
                                        },
                                        "theme_template_id": "01j9z000000000000000000043",
                                        "theme_template": {
                                            "id": "01j9z000000000000000000043",
                                            "name": "Essentiel",
                                            "slug": "essentiel",
                                            "tier": "free",
                                            "description": "Une page épurée, portrait et projets en grille.",
                                            "preview_url": null
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "theme_template_id": {
                                        "type": "string",
                                        "description": "Identifiant du gabarit"
                                    }
                                },
                                "required": [
                                    "theme_template_id"
                                ]
                            },
                            "example": {
                                "theme_template_id": "01j9z000000000000000000043"
                            }
                        }
                    }
                }
            }
        },
        "/portfolios/{portfolio}/publishing": {
            "get": {
                "operationId": "portfolios_publishing_show",
                "summary": "Réglages de publication et état (publié ou non).",
                "description": "",
                "tags": [
                    "Thème et publication"
                ],
                "x-required-scope": "read",
                "parameters": [
                    {
                        "name": "portfolio",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du portfolio",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "locale": {
                                                    "type": "string"
                                                },
                                                "is_published": {
                                                    "type": "boolean"
                                                },
                                                "is_marketplace_listed": {
                                                    "type": "boolean"
                                                },
                                                "published_at": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "has_contact_form": {
                                                    "type": "boolean"
                                                },
                                                "contact_info": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "location_info": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "opening_hours": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "subdomain": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "cta_label": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "cta_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "social_links": {
                                                    "type": "array",
                                                    "items": {}
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000038",
                                        "locale": "fr",
                                        "is_published": false,
                                        "is_marketplace_listed": true,
                                        "published_at": null,
                                        "has_contact_form": false,
                                        "contact_info": null,
                                        "location_info": null,
                                        "opening_hours": null,
                                        "subdomain": null,
                                        "cta_label": null,
                                        "cta_url": null,
                                        "social_links": []
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            },
            "patch": {
                "operationId": "portfolios_publishing_update",
                "summary": "Modifie les réglages de publication.",
                "description": "Horaires d’ouverture en texte libre, une ligne par plage de jours, affichés tels quels : \"Lundi – vendredi : 9 h – 18 h\\nSamedi : 9 h – 13 h\". Réseaux : un objet { plateforme: url } (plateformes : facebook, instagram, tiktok, whatsapp, x, youtube, linkedin) ; une URL vide retire le réseau, un réseau absent reste inchangé. Site d’entreprise : is_marketplace_listed, categories, contact_info et location_info (sauf map_url) sont ignorés, car repris de la fiche de l’entreprise (companies_update). Mise à jour partielle : n’envoyez que les champs à changer, les autres restent inchangés (null ou une chaîne vide efface un champ facultatif). Un objet est fusionné clé par clé, une liste est remplacée en entier.",
                "tags": [
                    "Thème et publication"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "portfolio",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du portfolio",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "locale": {
                                                    "type": "string"
                                                },
                                                "is_published": {
                                                    "type": "boolean"
                                                },
                                                "is_marketplace_listed": {
                                                    "type": "boolean"
                                                },
                                                "published_at": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "has_contact_form": {
                                                    "type": "boolean"
                                                },
                                                "contact_info": {
                                                    "type": "object",
                                                    "properties": {
                                                        "email": {
                                                            "type": "string"
                                                        },
                                                        "phone": {
                                                            "type": "string"
                                                        }
                                                    }
                                                },
                                                "location_info": {
                                                    "type": "object",
                                                    "properties": {
                                                        "city": {
                                                            "type": "string"
                                                        },
                                                        "country_code": {
                                                            "type": "string"
                                                        },
                                                        "country": {
                                                            "type": "string"
                                                        }
                                                    }
                                                },
                                                "opening_hours": {
                                                    "type": "string"
                                                },
                                                "subdomain": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "cta_label": {
                                                    "type": "string"
                                                },
                                                "cta_url": {
                                                    "type": "string"
                                                },
                                                "social_links": {
                                                    "type": "object",
                                                    "properties": {
                                                        "instagram": {
                                                            "type": "string"
                                                        },
                                                        "linkedin": {
                                                            "type": "string"
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000038",
                                        "locale": "fr",
                                        "is_published": false,
                                        "is_marketplace_listed": false,
                                        "published_at": null,
                                        "has_contact_form": true,
                                        "contact_info": {
                                            "email": "contact@awadiallo.dev",
                                            "phone": "+221 77 123 45 67"
                                        },
                                        "location_info": {
                                            "city": "Dakar",
                                            "country_code": "SN",
                                            "country": "Sénégal"
                                        },
                                        "opening_hours": "Lundi – vendredi : 9 h – 18 h\nSamedi : 9 h – 13 h, sur rendez-vous\nFermé le dimanche",
                                        "subdomain": null,
                                        "cta_label": "Demander un devis",
                                        "cta_url": "https://awadiallo.dev/devis",
                                        "social_links": {
                                            "instagram": "https://www.instagram.com/awadiallo.dev",
                                            "linkedin": "https://www.linkedin.com/in/awadiallo"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "locale": {
                                        "type": "string",
                                        "enum": [
                                            "fr",
                                            "en"
                                        ],
                                        "description": "Langue du site"
                                    },
                                    "has_contact_form": {
                                        "type": "boolean",
                                        "description": "Formulaire de contact (selon la formule)"
                                    },
                                    "is_marketplace_listed": {
                                        "type": "boolean",
                                        "description": "Visible dans l’annuaire : préférence acceptée même avant publication, effective une fois le portfolio publié (ignoré pour un site d’entreprise)"
                                    },
                                    "categories": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Identifiants de catégories de l’annuaire (6 max, GET /categories ; ignoré pour un site d’entreprise)"
                                    },
                                    "contact_info": {
                                        "type": "object",
                                        "properties": {
                                            "email": {
                                                "type": "string"
                                            },
                                            "phone": {
                                                "type": "string"
                                            }
                                        },
                                        "additionalProperties": false,
                                        "description": "Coordonnées (ignoré pour un site d’entreprise)"
                                    },
                                    "location_info": {
                                        "type": "object",
                                        "properties": {
                                            "country": {
                                                "type": "string"
                                            },
                                            "city": {
                                                "type": "string"
                                            },
                                            "address": {
                                                "type": "string"
                                            },
                                            "map_url": {
                                                "type": "string"
                                            }
                                        },
                                        "additionalProperties": false,
                                        "description": "Localisation, formule Pro et plus (seul map_url compte pour un site d’entreprise)"
                                    },
                                    "opening_hours": {
                                        "type": "string",
                                        "description": "Horaires d’ouverture en texte libre (1000 car. max ; vide = bloc masqué)"
                                    },
                                    "subdomain": {
                                        "type": "string",
                                        "description": "Sous-domaine réservé"
                                    },
                                    "cta_label": {
                                        "type": "string",
                                        "description": "Libellé du bouton d’action"
                                    },
                                    "cta_url": {
                                        "type": "string",
                                        "description": "URL du bouton d’action"
                                    },
                                    "social_links": {
                                        "type": "object",
                                        "properties": {
                                            "facebook": {
                                                "type": "string"
                                            },
                                            "instagram": {
                                                "type": "string"
                                            },
                                            "tiktok": {
                                                "type": "string"
                                            },
                                            "whatsapp": {
                                                "type": "string"
                                            },
                                            "x": {
                                                "type": "string"
                                            },
                                            "youtube": {
                                                "type": "string"
                                            },
                                            "linkedin": {
                                                "type": "string"
                                            }
                                        },
                                        "additionalProperties": false,
                                        "description": "Réseaux : { plateforme: url }"
                                    }
                                }
                            },
                            "example": {
                                "locale": "fr",
                                "has_contact_form": true,
                                "is_marketplace_listed": false,
                                "contact_info": {
                                    "email": "contact@awadiallo.dev",
                                    "phone": "+221 77 123 45 67"
                                },
                                "location_info": {
                                    "country": "Sénégal",
                                    "city": "Dakar"
                                },
                                "opening_hours": "Lundi – vendredi : 9 h – 18 h\nSamedi : 9 h – 13 h, sur rendez-vous\nFermé le dimanche",
                                "cta_label": "Demander un devis",
                                "cta_url": "https://awadiallo.dev/devis",
                                "social_links": {
                                    "linkedin": "https://www.linkedin.com/in/awadiallo",
                                    "instagram": "https://www.instagram.com/awadiallo.dev"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/portfolios/{portfolio}/publishing/publish": {
            "post": {
                "operationId": "portfolios_publishing_publish",
                "summary": "Publie le portfolio (le plan doit inclure un site public).",
                "description": "",
                "tags": [
                    "Thème et publication"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "portfolio",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du portfolio",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "locale": {
                                                    "type": "string"
                                                },
                                                "is_published": {
                                                    "type": "boolean"
                                                },
                                                "is_marketplace_listed": {
                                                    "type": "boolean"
                                                },
                                                "published_at": {
                                                    "type": "string"
                                                },
                                                "has_contact_form": {
                                                    "type": "boolean"
                                                },
                                                "contact_info": {
                                                    "type": "object",
                                                    "properties": {
                                                        "email": {
                                                            "type": "string"
                                                        },
                                                        "phone": {
                                                            "type": "string"
                                                        }
                                                    }
                                                },
                                                "location_info": {
                                                    "type": "object",
                                                    "properties": {
                                                        "city": {
                                                            "type": "string"
                                                        },
                                                        "country_code": {
                                                            "type": "string"
                                                        },
                                                        "country": {
                                                            "type": "string"
                                                        }
                                                    }
                                                },
                                                "opening_hours": {
                                                    "type": "string"
                                                },
                                                "subdomain": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "cta_label": {
                                                    "type": "string"
                                                },
                                                "cta_url": {
                                                    "type": "string"
                                                },
                                                "social_links": {
                                                    "type": "object",
                                                    "properties": {
                                                        "instagram": {
                                                            "type": "string"
                                                        },
                                                        "linkedin": {
                                                            "type": "string"
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000038",
                                        "locale": "fr",
                                        "is_published": true,
                                        "is_marketplace_listed": false,
                                        "published_at": "2026-09-15T09:30:00+00:00",
                                        "has_contact_form": true,
                                        "contact_info": {
                                            "email": "contact@awadiallo.dev",
                                            "phone": "+221 77 123 45 67"
                                        },
                                        "location_info": {
                                            "city": "Dakar",
                                            "country_code": "SN",
                                            "country": "Sénégal"
                                        },
                                        "opening_hours": "Lundi – vendredi : 9 h – 18 h\nSamedi : 9 h – 13 h, sur rendez-vous\nFermé le dimanche",
                                        "subdomain": null,
                                        "cta_label": "Demander un devis",
                                        "cta_url": "https://awadiallo.dev/devis",
                                        "social_links": {
                                            "instagram": "https://www.instagram.com/awadiallo.dev",
                                            "linkedin": "https://www.linkedin.com/in/awadiallo"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/portfolios/{portfolio}/publishing/unpublish": {
            "post": {
                "operationId": "portfolios_publishing_unpublish",
                "summary": "Dépublie le portfolio.",
                "description": "",
                "tags": [
                    "Thème et publication"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "portfolio",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du portfolio",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "locale": {
                                                    "type": "string"
                                                },
                                                "is_published": {
                                                    "type": "boolean"
                                                },
                                                "is_marketplace_listed": {
                                                    "type": "boolean"
                                                },
                                                "published_at": {
                                                    "type": "string"
                                                },
                                                "has_contact_form": {
                                                    "type": "boolean"
                                                },
                                                "contact_info": {
                                                    "type": "object",
                                                    "properties": {
                                                        "email": {
                                                            "type": "string"
                                                        },
                                                        "phone": {
                                                            "type": "string"
                                                        }
                                                    }
                                                },
                                                "location_info": {
                                                    "type": "object",
                                                    "properties": {
                                                        "city": {
                                                            "type": "string"
                                                        },
                                                        "country_code": {
                                                            "type": "string"
                                                        },
                                                        "country": {
                                                            "type": "string"
                                                        }
                                                    }
                                                },
                                                "opening_hours": {
                                                    "type": "string"
                                                },
                                                "subdomain": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "cta_label": {
                                                    "type": "string"
                                                },
                                                "cta_url": {
                                                    "type": "string"
                                                },
                                                "social_links": {
                                                    "type": "object",
                                                    "properties": {
                                                        "instagram": {
                                                            "type": "string"
                                                        },
                                                        "linkedin": {
                                                            "type": "string"
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000038",
                                        "locale": "fr",
                                        "is_published": false,
                                        "is_marketplace_listed": false,
                                        "published_at": "2026-09-15T09:30:00+00:00",
                                        "has_contact_form": true,
                                        "contact_info": {
                                            "email": "contact@awadiallo.dev",
                                            "phone": "+221 77 123 45 67"
                                        },
                                        "location_info": {
                                            "city": "Dakar",
                                            "country_code": "SN",
                                            "country": "Sénégal"
                                        },
                                        "opening_hours": "Lundi – vendredi : 9 h – 18 h\nSamedi : 9 h – 13 h, sur rendez-vous\nFermé le dimanche",
                                        "subdomain": null,
                                        "cta_label": "Demander un devis",
                                        "cta_url": "https://awadiallo.dev/devis",
                                        "social_links": {
                                            "instagram": "https://www.instagram.com/awadiallo.dev",
                                            "linkedin": "https://www.linkedin.com/in/awadiallo"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/cvs": {
            "get": {
                "operationId": "cvs_index",
                "summary": "Liste vos CV.",
                "description": "",
                "tags": [
                    "CV"
                ],
                "x-required-scope": "read",
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Numéro de page (défaut 1)",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Éléments par page (1 à 100, défaut 25)",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "id": {
                                                        "type": "string"
                                                    },
                                                    "name": {
                                                        "type": "string"
                                                    },
                                                    "template": {
                                                        "type": "string"
                                                    },
                                                    "locale": {
                                                        "type": "string"
                                                    },
                                                    "full_name": {
                                                        "type": "string"
                                                    },
                                                    "headline": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "email": {
                                                        "type": "string"
                                                    },
                                                    "phone": {
                                                        "type": "string"
                                                    },
                                                    "location": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "website": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "portfolio_url": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "extra_info": {
                                                        "type": "array",
                                                        "items": {
                                                            "type": "object",
                                                            "properties": {
                                                                "kind": {
                                                                    "type": "string"
                                                                },
                                                                "label": {
                                                                    "type": "string"
                                                                },
                                                                "value": {
                                                                    "type": "string"
                                                                },
                                                                "icon": {
                                                                    "type": "string"
                                                                }
                                                            }
                                                        }
                                                    },
                                                    "summary": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "accent_color": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "panel_color": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "font": {
                                                        "type": "string"
                                                    },
                                                    "heading_font": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "font_size": {
                                                        "type": "string"
                                                    },
                                                    "heading_size": {
                                                        "type": "string"
                                                    },
                                                    "spacing": {
                                                        "type": "string"
                                                    },
                                                    "use_icons": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "show_photo": {
                                                        "type": "boolean"
                                                    },
                                                    "photo_shape": {
                                                        "type": "string"
                                                    },
                                                    "photo_url": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "source_portfolio_name": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "updated_at": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        },
                                        "links": {
                                            "type": "object",
                                            "properties": {
                                                "first": {
                                                    "type": "string"
                                                },
                                                "last": {
                                                    "type": "string"
                                                },
                                                "prev": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "next": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "current_page": {
                                                    "type": "integer"
                                                },
                                                "from": {
                                                    "type": "integer"
                                                },
                                                "last_page": {
                                                    "type": "integer"
                                                },
                                                "links": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "url": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "label": {
                                                                "type": "string"
                                                            },
                                                            "page": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "active": {
                                                                "type": "boolean"
                                                            }
                                                        }
                                                    }
                                                },
                                                "path": {
                                                    "type": "string"
                                                },
                                                "per_page": {
                                                    "type": "integer"
                                                },
                                                "to": {
                                                    "type": "integer"
                                                },
                                                "total": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": [
                                        {
                                            "id": "01j9z000000000000000000011",
                                            "name": "CV développeuse",
                                            "template": "design",
                                            "locale": "fr",
                                            "full_name": "Awa Diallo",
                                            "headline": null,
                                            "email": "awa.diallo@example.com",
                                            "phone": "+221 77 123 45 67",
                                            "location": null,
                                            "website": null,
                                            "portfolio_url": null,
                                            "extra_info": [
                                                {
                                                    "kind": "birth_date",
                                                    "label": "Date de naissance",
                                                    "value": "",
                                                    "icon": "cake"
                                                },
                                                {
                                                    "kind": "birth_place",
                                                    "label": "Lieu de naissance",
                                                    "value": "",
                                                    "icon": "map-pin"
                                                }
                                            ],
                                            "summary": null,
                                            "accent_color": null,
                                            "panel_color": null,
                                            "font": "sans",
                                            "heading_font": null,
                                            "font_size": "md",
                                            "heading_size": "md",
                                            "spacing": "comfortable",
                                            "use_icons": null,
                                            "show_photo": true,
                                            "photo_shape": "round",
                                            "photo_url": null,
                                            "source_portfolio_name": null,
                                            "updated_at": "2026-09-15T09:30:00+00:00"
                                        }
                                    ],
                                    "links": {
                                        "first": "https://middlefolio.online/api/v1/cvs?page=1",
                                        "last": "https://middlefolio.online/api/v1/cvs?page=1",
                                        "prev": null,
                                        "next": null
                                    },
                                    "meta": {
                                        "current_page": 1,
                                        "from": 1,
                                        "last_page": 1,
                                        "links": [
                                            {
                                                "url": null,
                                                "label": "&laquo; Précédent",
                                                "page": null,
                                                "active": false
                                            },
                                            {
                                                "url": "https://middlefolio.online/api/v1/cvs?page=1",
                                                "label": "1",
                                                "page": 1,
                                                "active": true
                                            }
                                        ],
                                        "path": "https://middlefolio.online/api/v1/cvs",
                                        "per_page": 25,
                                        "to": 1,
                                        "total": 1
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            },
            "post": {
                "operationId": "cvs_store",
                "summary": "Crée un CV vide ou copié depuis un portfolio (quota max_cvs).",
                "description": "",
                "tags": [
                    "CV"
                ],
                "x-required-scope": "write",
                "parameters": [],
                "responses": {
                    "201": {
                        "description": "Créé",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "template": {
                                                    "type": "string"
                                                },
                                                "locale": {
                                                    "type": "string"
                                                },
                                                "full_name": {
                                                    "type": "string"
                                                },
                                                "headline": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "email": {
                                                    "type": "string"
                                                },
                                                "phone": {
                                                    "type": "string"
                                                },
                                                "location": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "website": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "portfolio_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "extra_info": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "kind": {
                                                                "type": "string"
                                                            },
                                                            "label": {
                                                                "type": "string"
                                                            },
                                                            "value": {
                                                                "type": "string"
                                                            },
                                                            "icon": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "summary": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "accent_color": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "panel_color": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font": {
                                                    "type": "string"
                                                },
                                                "heading_font": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font_size": {
                                                    "type": "string"
                                                },
                                                "heading_size": {
                                                    "type": "string"
                                                },
                                                "spacing": {
                                                    "type": "string"
                                                },
                                                "use_icons": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "show_photo": {
                                                    "type": "boolean"
                                                },
                                                "photo_shape": {
                                                    "type": "string"
                                                },
                                                "photo_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "source_portfolio_name": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "updated_at": {
                                                    "type": "string"
                                                },
                                                "sections": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "string"
                                                            },
                                                            "type": {
                                                                "type": "string"
                                                            },
                                                            "title": {
                                                                "type": "string"
                                                            },
                                                            "position": {
                                                                "type": "integer"
                                                            },
                                                            "is_visible": {
                                                                "type": "boolean"
                                                            },
                                                            "column": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "entries": {
                                                                "type": "array",
                                                                "items": {}
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000011",
                                        "name": "CV développeuse",
                                        "template": "design",
                                        "locale": "fr",
                                        "full_name": "Awa Diallo",
                                        "headline": null,
                                        "email": "awa.diallo@example.com",
                                        "phone": "+221 77 123 45 67",
                                        "location": null,
                                        "website": null,
                                        "portfolio_url": null,
                                        "extra_info": [
                                            {
                                                "kind": "birth_date",
                                                "label": "Date de naissance",
                                                "value": "",
                                                "icon": "cake"
                                            },
                                            {
                                                "kind": "birth_place",
                                                "label": "Lieu de naissance",
                                                "value": "",
                                                "icon": "map-pin"
                                            }
                                        ],
                                        "summary": null,
                                        "accent_color": null,
                                        "panel_color": null,
                                        "font": "sans",
                                        "heading_font": null,
                                        "font_size": "md",
                                        "heading_size": "md",
                                        "spacing": "comfortable",
                                        "use_icons": null,
                                        "show_photo": true,
                                        "photo_shape": "round",
                                        "photo_url": null,
                                        "source_portfolio_name": null,
                                        "updated_at": "2026-09-15T09:30:00+00:00",
                                        "sections": [
                                            {
                                                "id": "01j9z000000000000000000013",
                                                "type": "journey",
                                                "title": "Expérience professionnelle",
                                                "position": 1,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            },
                                            {
                                                "id": "01j9z000000000000000000014",
                                                "type": "journey",
                                                "title": "Formation",
                                                "position": 2,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "template": {
                                        "type": "string",
                                        "enum": [
                                            "ats",
                                            "ats-elegant",
                                            "design",
                                            "sidebar-left",
                                            "sidebar-right",
                                            "columns",
                                            "exotic",
                                            "canada",
                                            "canada-modern",
                                            "minimal",
                                            "ribbon-left",
                                            "ribbon-right",
                                            "wave-left",
                                            "wave-right",
                                            "arch-left",
                                            "arch-right",
                                            "studio-left",
                                            "studio-right",
                                            "pastel-left",
                                            "pastel-right",
                                            "timeline-left",
                                            "timeline-right"
                                        ],
                                        "description": "Gabarit"
                                    },
                                    "name": {
                                        "type": "string",
                                        "description": "Nom (requis hors copie)"
                                    },
                                    "locale": {
                                        "type": "string",
                                        "enum": [
                                            "fr",
                                            "en"
                                        ],
                                        "description": "Langue (requise hors copie)"
                                    },
                                    "portfolio_id": {
                                        "type": "string",
                                        "description": "Portfolio à copier en CV"
                                    }
                                },
                                "required": [
                                    "template"
                                ]
                            },
                            "example": {
                                "name": "CV développeuse",
                                "locale": "fr",
                                "template": "design"
                            }
                        }
                    }
                }
            }
        },
        "/cv-templates": {
            "get": {
                "operationId": "cvs_templates",
                "summary": "Gabarits de CV proposés à ce compte.",
                "description": "",
                "tags": [
                    "CV"
                ],
                "x-required-scope": "read",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "slug": {
                                                        "type": "string"
                                                    },
                                                    "name": {
                                                        "type": "string"
                                                    },
                                                    "description": {
                                                        "type": "string"
                                                    },
                                                    "tier": {
                                                        "type": "string"
                                                    },
                                                    "position": {
                                                        "type": "integer"
                                                    },
                                                    "preview_url": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "layout": {
                                                        "type": "string"
                                                    },
                                                    "is_ats": {
                                                        "type": "boolean"
                                                    },
                                                    "monochrome": {
                                                        "type": "boolean"
                                                    },
                                                    "has_photo": {
                                                        "type": "boolean"
                                                    },
                                                    "side": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "mirror": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "locked": {
                                                        "type": "boolean"
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": [
                                        {
                                            "slug": "ats",
                                            "name": "ATS",
                                            "description": "Une seule colonne, texte seul : lisible par les logiciels de recrutement.",
                                            "tier": "free",
                                            "position": 10,
                                            "preview_url": null,
                                            "layout": "single",
                                            "is_ats": true,
                                            "monochrome": true,
                                            "has_photo": false,
                                            "side": null,
                                            "mirror": null,
                                            "locked": false
                                        },
                                        {
                                            "slug": "ats-elegant",
                                            "name": "ATS élégant",
                                            "description": "Une colonne lisible par les ATS : en-tête centré, titres en empattement et couleur d’accent.",
                                            "tier": "pro",
                                            "position": 11,
                                            "preview_url": null,
                                            "layout": "single",
                                            "is_ats": true,
                                            "monochrome": false,
                                            "has_photo": false,
                                            "side": null,
                                            "mirror": null,
                                            "locked": false
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/cvs/{cv}": {
            "get": {
                "operationId": "cvs_show",
                "summary": "CV complet : sections et entrées.",
                "description": "",
                "tags": [
                    "CV"
                ],
                "x-required-scope": "read",
                "parameters": [
                    {
                        "name": "cv",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du CV",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "template": {
                                                    "type": "string"
                                                },
                                                "locale": {
                                                    "type": "string"
                                                },
                                                "full_name": {
                                                    "type": "string"
                                                },
                                                "headline": {
                                                    "type": "string"
                                                },
                                                "email": {
                                                    "type": "string"
                                                },
                                                "phone": {
                                                    "type": "string"
                                                },
                                                "location": {
                                                    "type": "string"
                                                },
                                                "website": {
                                                    "type": "string"
                                                },
                                                "portfolio_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "extra_info": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "kind": {
                                                                "type": "string"
                                                            },
                                                            "label": {
                                                                "type": "string"
                                                            },
                                                            "value": {
                                                                "type": "string"
                                                            },
                                                            "icon": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "summary": {
                                                    "type": "string"
                                                },
                                                "accent_color": {
                                                    "type": "string"
                                                },
                                                "panel_color": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font": {
                                                    "type": "string"
                                                },
                                                "heading_font": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font_size": {
                                                    "type": "string"
                                                },
                                                "heading_size": {
                                                    "type": "string"
                                                },
                                                "spacing": {
                                                    "type": "string"
                                                },
                                                "use_icons": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "show_photo": {
                                                    "type": "boolean"
                                                },
                                                "photo_shape": {
                                                    "type": "string"
                                                },
                                                "photo_url": {
                                                    "type": "string"
                                                },
                                                "source_portfolio_name": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "updated_at": {
                                                    "type": "string"
                                                },
                                                "sections": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "string"
                                                            },
                                                            "type": {
                                                                "type": "string"
                                                            },
                                                            "title": {
                                                                "type": "string"
                                                            },
                                                            "position": {
                                                                "type": "integer"
                                                            },
                                                            "is_visible": {
                                                                "type": "boolean"
                                                            },
                                                            "column": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "entries": {
                                                                "type": "array",
                                                                "items": {}
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000011",
                                        "name": "CV développeuse",
                                        "template": "sidebar-left",
                                        "locale": "fr",
                                        "full_name": "Awa Diallo",
                                        "headline": "Développeuse Laravel & React",
                                        "email": "awa.diallo@example.com",
                                        "phone": "+221 77 123 45 67",
                                        "location": "Dakar, Sénégal",
                                        "website": "https://awadiallo.dev",
                                        "portfolio_url": null,
                                        "extra_info": [
                                            {
                                                "kind": "birth_date",
                                                "label": "Date de naissance",
                                                "value": "",
                                                "icon": "cake"
                                            },
                                            {
                                                "kind": "birth_place",
                                                "label": "Lieu de naissance",
                                                "value": "",
                                                "icon": "map-pin"
                                            }
                                        ],
                                        "summary": "<p>Six ans d’expérience en développement web.</p>",
                                        "accent_color": "#bf6b15",
                                        "panel_color": null,
                                        "font": "sans",
                                        "heading_font": null,
                                        "font_size": "md",
                                        "heading_size": "md",
                                        "spacing": "comfortable",
                                        "use_icons": null,
                                        "show_photo": true,
                                        "photo_shape": "round",
                                        "photo_url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000012.png",
                                        "source_portfolio_name": null,
                                        "updated_at": "2026-09-15T09:30:00+00:00",
                                        "sections": [
                                            {
                                                "id": "01j9z000000000000000000013",
                                                "type": "journey",
                                                "title": "Expérience professionnelle",
                                                "position": 1,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            },
                                            {
                                                "id": "01j9z000000000000000000014",
                                                "type": "journey",
                                                "title": "Formation",
                                                "position": 2,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            },
            "patch": {
                "operationId": "cvs_update",
                "summary": "Modifie identité et coordonnées du CV.",
                "description": "Mise à jour partielle : n’envoyez que les champs à changer, les autres restent inchangés (null ou une chaîne vide efface un champ facultatif). Un objet est fusionné clé par clé, une liste est remplacée en entier.",
                "tags": [
                    "CV"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "cv",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du CV",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "template": {
                                                    "type": "string"
                                                },
                                                "locale": {
                                                    "type": "string"
                                                },
                                                "full_name": {
                                                    "type": "string"
                                                },
                                                "headline": {
                                                    "type": "string"
                                                },
                                                "email": {
                                                    "type": "string"
                                                },
                                                "phone": {
                                                    "type": "string"
                                                },
                                                "location": {
                                                    "type": "string"
                                                },
                                                "website": {
                                                    "type": "string"
                                                },
                                                "portfolio_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "extra_info": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "kind": {
                                                                "type": "string"
                                                            },
                                                            "label": {
                                                                "type": "string"
                                                            },
                                                            "value": {
                                                                "type": "string"
                                                            },
                                                            "icon": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "summary": {
                                                    "type": "string"
                                                },
                                                "accent_color": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "panel_color": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font": {
                                                    "type": "string"
                                                },
                                                "heading_font": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font_size": {
                                                    "type": "string"
                                                },
                                                "heading_size": {
                                                    "type": "string"
                                                },
                                                "spacing": {
                                                    "type": "string"
                                                },
                                                "use_icons": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "show_photo": {
                                                    "type": "boolean"
                                                },
                                                "photo_shape": {
                                                    "type": "string"
                                                },
                                                "photo_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "source_portfolio_name": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "updated_at": {
                                                    "type": "string"
                                                },
                                                "sections": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "string"
                                                            },
                                                            "type": {
                                                                "type": "string"
                                                            },
                                                            "title": {
                                                                "type": "string"
                                                            },
                                                            "position": {
                                                                "type": "integer"
                                                            },
                                                            "is_visible": {
                                                                "type": "boolean"
                                                            },
                                                            "column": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "entries": {
                                                                "type": "array",
                                                                "items": {}
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000011",
                                        "name": "CV développeuse",
                                        "template": "design",
                                        "locale": "fr",
                                        "full_name": "Awa Diallo",
                                        "headline": "Développeuse Laravel & React",
                                        "email": "awa.diallo@example.com",
                                        "phone": "+221 77 123 45 67",
                                        "location": "Dakar, Sénégal",
                                        "website": "https://awadiallo.dev",
                                        "portfolio_url": null,
                                        "extra_info": [
                                            {
                                                "kind": "birth_date",
                                                "label": "Date de naissance",
                                                "value": "",
                                                "icon": "cake"
                                            },
                                            {
                                                "kind": "birth_place",
                                                "label": "Lieu de naissance",
                                                "value": "",
                                                "icon": "map-pin"
                                            }
                                        ],
                                        "summary": "<p>Six ans d’expérience en développement web.</p>",
                                        "accent_color": null,
                                        "panel_color": null,
                                        "font": "sans",
                                        "heading_font": null,
                                        "font_size": "md",
                                        "heading_size": "md",
                                        "spacing": "comfortable",
                                        "use_icons": null,
                                        "show_photo": true,
                                        "photo_shape": "round",
                                        "photo_url": null,
                                        "source_portfolio_name": null,
                                        "updated_at": "2026-09-15T09:30:00+00:00",
                                        "sections": [
                                            {
                                                "id": "01j9z000000000000000000013",
                                                "type": "journey",
                                                "title": "Expérience professionnelle",
                                                "position": 1,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            },
                                            {
                                                "id": "01j9z000000000000000000014",
                                                "type": "journey",
                                                "title": "Formation",
                                                "position": 2,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "name": {
                                        "type": "string",
                                        "description": "Nom du CV"
                                    },
                                    "locale": {
                                        "type": "string",
                                        "enum": [
                                            "fr",
                                            "en"
                                        ],
                                        "description": "Langue"
                                    },
                                    "full_name": {
                                        "type": "string",
                                        "description": "Nom complet"
                                    },
                                    "headline": {
                                        "type": "string",
                                        "description": "Titre"
                                    },
                                    "email": {
                                        "type": "string",
                                        "description": "E-mail"
                                    },
                                    "phone": {
                                        "type": "string",
                                        "description": "Téléphone"
                                    },
                                    "location": {
                                        "type": "string",
                                        "description": "Localisation"
                                    },
                                    "website": {
                                        "type": "string",
                                        "description": "Site web"
                                    },
                                    "portfolio_url": {
                                        "type": "string",
                                        "description": "Lien du portfolio"
                                    },
                                    "extra_info": {
                                        "type": "array",
                                        "items": {
                                            "type": "object",
                                            "properties": {
                                                "kind": {
                                                    "type": "string"
                                                },
                                                "label": {
                                                    "type": "string"
                                                },
                                                "value": {
                                                    "type": "string"
                                                },
                                                "icon": {
                                                    "type": "string"
                                                }
                                            },
                                            "additionalProperties": false
                                        },
                                        "description": "Autres informations en texte libre (20 max, ordre conservé) : [{ kind, label, value, icon }] ; kind (facultatif) : birth_date|birth_place|nationality|marital_status|driving_license|po_box|linkedin|github|whatsapp|availability|mobility|id_number"
                                    },
                                    "summary": {
                                        "type": "string",
                                        "description": "Résumé"
                                    }
                                }
                            },
                            "example": {
                                "name": "CV développeuse",
                                "locale": "fr",
                                "full_name": "Awa Diallo",
                                "headline": "Développeuse Laravel & React",
                                "email": "awa.diallo@example.com",
                                "phone": "+221 77 123 45 67",
                                "location": "Dakar, Sénégal",
                                "website": "https://awadiallo.dev",
                                "social_links": [
                                    {
                                        "label": "GitHub",
                                        "url": "https://github.com/awadiallo",
                                        "icon": "github"
                                    }
                                ],
                                "summary": "Six ans d’expérience en développement web."
                            }
                        }
                    }
                }
            },
            "delete": {
                "operationId": "cvs_destroy",
                "summary": "Supprime le CV (suppression logique).",
                "description": "",
                "tags": [
                    "CV"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "cv",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du CV",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Supprimé"
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/cvs/{cv}/appearance": {
            "patch": {
                "operationId": "cvs_appearance_update",
                "summary": "Modifie l’apparence du CV.",
                "description": "Mise à jour partielle : n’envoyez que les champs à changer, les autres restent inchangés (null ou une chaîne vide efface un champ facultatif). Un objet est fusionné clé par clé, une liste est remplacée en entier.",
                "tags": [
                    "CV"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "cv",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du CV",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "template": {
                                                    "type": "string"
                                                },
                                                "locale": {
                                                    "type": "string"
                                                },
                                                "full_name": {
                                                    "type": "string"
                                                },
                                                "headline": {
                                                    "type": "string"
                                                },
                                                "email": {
                                                    "type": "string"
                                                },
                                                "phone": {
                                                    "type": "string"
                                                },
                                                "location": {
                                                    "type": "string"
                                                },
                                                "website": {
                                                    "type": "string"
                                                },
                                                "portfolio_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "extra_info": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "kind": {
                                                                "type": "string"
                                                            },
                                                            "label": {
                                                                "type": "string"
                                                            },
                                                            "value": {
                                                                "type": "string"
                                                            },
                                                            "icon": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "summary": {
                                                    "type": "string"
                                                },
                                                "accent_color": {
                                                    "type": "string"
                                                },
                                                "panel_color": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font": {
                                                    "type": "string"
                                                },
                                                "heading_font": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font_size": {
                                                    "type": "string"
                                                },
                                                "heading_size": {
                                                    "type": "string"
                                                },
                                                "spacing": {
                                                    "type": "string"
                                                },
                                                "use_icons": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "show_photo": {
                                                    "type": "boolean"
                                                },
                                                "photo_shape": {
                                                    "type": "string"
                                                },
                                                "photo_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "source_portfolio_name": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "updated_at": {
                                                    "type": "string"
                                                },
                                                "sections": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "string"
                                                            },
                                                            "type": {
                                                                "type": "string"
                                                            },
                                                            "title": {
                                                                "type": "string"
                                                            },
                                                            "position": {
                                                                "type": "integer"
                                                            },
                                                            "is_visible": {
                                                                "type": "boolean"
                                                            },
                                                            "column": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "entries": {
                                                                "type": "array",
                                                                "items": {}
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000011",
                                        "name": "CV développeuse",
                                        "template": "design",
                                        "locale": "fr",
                                        "full_name": "Awa Diallo",
                                        "headline": "Développeuse Laravel & React",
                                        "email": "awa.diallo@example.com",
                                        "phone": "+221 77 123 45 67",
                                        "location": "Dakar, Sénégal",
                                        "website": "https://awadiallo.dev",
                                        "portfolio_url": null,
                                        "extra_info": [
                                            {
                                                "kind": "birth_date",
                                                "label": "Date de naissance",
                                                "value": "",
                                                "icon": "cake"
                                            },
                                            {
                                                "kind": "birth_place",
                                                "label": "Lieu de naissance",
                                                "value": "",
                                                "icon": "map-pin"
                                            }
                                        ],
                                        "summary": "<p>Six ans d’expérience en développement web.</p>",
                                        "accent_color": "#bf6b15",
                                        "panel_color": null,
                                        "font": "sans",
                                        "heading_font": null,
                                        "font_size": "md",
                                        "heading_size": "md",
                                        "spacing": "comfortable",
                                        "use_icons": null,
                                        "show_photo": true,
                                        "photo_shape": "round",
                                        "photo_url": null,
                                        "source_portfolio_name": null,
                                        "updated_at": "2026-09-15T09:30:00+00:00",
                                        "sections": [
                                            {
                                                "id": "01j9z000000000000000000013",
                                                "type": "journey",
                                                "title": "Expérience professionnelle",
                                                "position": 1,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            },
                                            {
                                                "id": "01j9z000000000000000000014",
                                                "type": "journey",
                                                "title": "Formation",
                                                "position": 2,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "font": {
                                        "type": "string",
                                        "enum": [
                                            "sans",
                                            "serif",
                                            "mono",
                                            "helvetica",
                                            "times",
                                            "courier",
                                            "inter",
                                            "poppins",
                                            "space-grotesk",
                                            "sora",
                                            "dm-sans",
                                            "manrope",
                                            "outfit",
                                            "plus-jakarta-sans",
                                            "work-sans",
                                            "montserrat",
                                            "raleway",
                                            "nunito",
                                            "lato",
                                            "roboto",
                                            "open-sans",
                                            "rubik",
                                            "playfair-display",
                                            "merriweather",
                                            "lora",
                                            "cormorant-garamond",
                                            "libre-baskerville",
                                            "fraunces",
                                            "bitter",
                                            "dm-serif-display",
                                            "syne",
                                            "unbounded",
                                            "oswald",
                                            "bebas-neue",
                                            "anton",
                                            "abril-fatface",
                                            "archivo-black",
                                            "jetbrains-mono",
                                            "ibm-plex-mono",
                                            "space-mono",
                                            "caveat",
                                            "pacifico",
                                            "permanent-marker"
                                        ],
                                        "description": "Police"
                                    },
                                    "heading_font": {
                                        "type": "string",
                                        "enum": [
                                            "sans",
                                            "serif",
                                            "mono",
                                            "helvetica",
                                            "times",
                                            "courier",
                                            "inter",
                                            "poppins",
                                            "space-grotesk",
                                            "sora",
                                            "dm-sans",
                                            "manrope",
                                            "outfit",
                                            "plus-jakarta-sans",
                                            "work-sans",
                                            "montserrat",
                                            "raleway",
                                            "nunito",
                                            "lato",
                                            "roboto",
                                            "open-sans",
                                            "rubik",
                                            "playfair-display",
                                            "merriweather",
                                            "lora",
                                            "cormorant-garamond",
                                            "libre-baskerville",
                                            "fraunces",
                                            "bitter",
                                            "dm-serif-display",
                                            "syne",
                                            "unbounded",
                                            "oswald",
                                            "bebas-neue",
                                            "anton",
                                            "abril-fatface",
                                            "archivo-black",
                                            "jetbrains-mono",
                                            "ibm-plex-mono",
                                            "space-mono",
                                            "caveat",
                                            "pacifico",
                                            "permanent-marker"
                                        ],
                                        "description": "Police des titres"
                                    },
                                    "font_size": {
                                        "type": "string",
                                        "enum": [
                                            "sm",
                                            "md",
                                            "lg"
                                        ],
                                        "description": "Taille du texte"
                                    },
                                    "heading_size": {
                                        "type": "string",
                                        "enum": [
                                            "sm",
                                            "md",
                                            "lg"
                                        ],
                                        "description": "Taille des titres"
                                    },
                                    "spacing": {
                                        "type": "string",
                                        "enum": [
                                            "compact",
                                            "comfortable",
                                            "spacious"
                                        ],
                                        "description": "Espacement"
                                    },
                                    "show_photo": {
                                        "type": "boolean",
                                        "description": "Afficher la photo"
                                    },
                                    "photo_shape": {
                                        "type": "string",
                                        "enum": [
                                            "round",
                                            "rounded",
                                            "square"
                                        ],
                                        "description": "Forme de la photo"
                                    },
                                    "accent_color": {
                                        "type": "string",
                                        "description": "Couleur d’accent (#RRGGBB)"
                                    },
                                    "panel_color": {
                                        "type": "string",
                                        "description": "Couleur du panneau"
                                    },
                                    "use_icons": {
                                        "type": "boolean",
                                        "description": "Icônes (vide = selon le gabarit)"
                                    }
                                }
                            },
                            "example": {
                                "font": "sans",
                                "font_size": "md",
                                "heading_size": "md",
                                "spacing": "comfortable",
                                "show_photo": true,
                                "photo_shape": "round",
                                "accent_color": "#bf6b15"
                            }
                        }
                    }
                }
            }
        },
        "/cvs/{cv}/template": {
            "put": {
                "operationId": "cvs_template_update",
                "summary": "Change le gabarit du CV.",
                "description": "",
                "tags": [
                    "CV"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "cv",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du CV",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "template": {
                                                    "type": "string"
                                                },
                                                "locale": {
                                                    "type": "string"
                                                },
                                                "full_name": {
                                                    "type": "string"
                                                },
                                                "headline": {
                                                    "type": "string"
                                                },
                                                "email": {
                                                    "type": "string"
                                                },
                                                "phone": {
                                                    "type": "string"
                                                },
                                                "location": {
                                                    "type": "string"
                                                },
                                                "website": {
                                                    "type": "string"
                                                },
                                                "portfolio_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "extra_info": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "kind": {
                                                                "type": "string"
                                                            },
                                                            "label": {
                                                                "type": "string"
                                                            },
                                                            "value": {
                                                                "type": "string"
                                                            },
                                                            "icon": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "summary": {
                                                    "type": "string"
                                                },
                                                "accent_color": {
                                                    "type": "string"
                                                },
                                                "panel_color": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font": {
                                                    "type": "string"
                                                },
                                                "heading_font": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font_size": {
                                                    "type": "string"
                                                },
                                                "heading_size": {
                                                    "type": "string"
                                                },
                                                "spacing": {
                                                    "type": "string"
                                                },
                                                "use_icons": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "show_photo": {
                                                    "type": "boolean"
                                                },
                                                "photo_shape": {
                                                    "type": "string"
                                                },
                                                "photo_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "source_portfolio_name": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "updated_at": {
                                                    "type": "string"
                                                },
                                                "sections": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "string"
                                                            },
                                                            "type": {
                                                                "type": "string"
                                                            },
                                                            "title": {
                                                                "type": "string"
                                                            },
                                                            "position": {
                                                                "type": "integer"
                                                            },
                                                            "is_visible": {
                                                                "type": "boolean"
                                                            },
                                                            "column": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "entries": {
                                                                "type": "array",
                                                                "items": {}
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000011",
                                        "name": "CV développeuse",
                                        "template": "sidebar-left",
                                        "locale": "fr",
                                        "full_name": "Awa Diallo",
                                        "headline": "Développeuse Laravel & React",
                                        "email": "awa.diallo@example.com",
                                        "phone": "+221 77 123 45 67",
                                        "location": "Dakar, Sénégal",
                                        "website": "https://awadiallo.dev",
                                        "portfolio_url": null,
                                        "extra_info": [
                                            {
                                                "kind": "birth_date",
                                                "label": "Date de naissance",
                                                "value": "",
                                                "icon": "cake"
                                            },
                                            {
                                                "kind": "birth_place",
                                                "label": "Lieu de naissance",
                                                "value": "",
                                                "icon": "map-pin"
                                            }
                                        ],
                                        "summary": "<p>Six ans d’expérience en développement web.</p>",
                                        "accent_color": "#bf6b15",
                                        "panel_color": null,
                                        "font": "sans",
                                        "heading_font": null,
                                        "font_size": "md",
                                        "heading_size": "md",
                                        "spacing": "comfortable",
                                        "use_icons": null,
                                        "show_photo": true,
                                        "photo_shape": "round",
                                        "photo_url": null,
                                        "source_portfolio_name": null,
                                        "updated_at": "2026-09-15T09:30:00+00:00",
                                        "sections": [
                                            {
                                                "id": "01j9z000000000000000000013",
                                                "type": "journey",
                                                "title": "Expérience professionnelle",
                                                "position": 1,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            },
                                            {
                                                "id": "01j9z000000000000000000014",
                                                "type": "journey",
                                                "title": "Formation",
                                                "position": 2,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "template": {
                                        "type": "string",
                                        "enum": [
                                            "ats",
                                            "ats-elegant",
                                            "design",
                                            "sidebar-left",
                                            "sidebar-right",
                                            "columns",
                                            "exotic",
                                            "canada",
                                            "canada-modern",
                                            "minimal",
                                            "ribbon-left",
                                            "ribbon-right",
                                            "wave-left",
                                            "wave-right",
                                            "arch-left",
                                            "arch-right",
                                            "studio-left",
                                            "studio-right",
                                            "pastel-left",
                                            "pastel-right",
                                            "timeline-left",
                                            "timeline-right"
                                        ],
                                        "description": "Gabarit"
                                    }
                                },
                                "required": [
                                    "template"
                                ]
                            },
                            "example": {
                                "template": "sidebar-left"
                            }
                        }
                    }
                }
            }
        },
        "/cvs/{cv}/photo": {
            "put": {
                "operationId": "cvs_photo_update",
                "summary": "Définit la photo du CV (image de la bibliothèque).",
                "description": "",
                "tags": [
                    "CV"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "cv",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du CV",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "template": {
                                                    "type": "string"
                                                },
                                                "locale": {
                                                    "type": "string"
                                                },
                                                "full_name": {
                                                    "type": "string"
                                                },
                                                "headline": {
                                                    "type": "string"
                                                },
                                                "email": {
                                                    "type": "string"
                                                },
                                                "phone": {
                                                    "type": "string"
                                                },
                                                "location": {
                                                    "type": "string"
                                                },
                                                "website": {
                                                    "type": "string"
                                                },
                                                "portfolio_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "extra_info": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "kind": {
                                                                "type": "string"
                                                            },
                                                            "label": {
                                                                "type": "string"
                                                            },
                                                            "value": {
                                                                "type": "string"
                                                            },
                                                            "icon": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "summary": {
                                                    "type": "string"
                                                },
                                                "accent_color": {
                                                    "type": "string"
                                                },
                                                "panel_color": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font": {
                                                    "type": "string"
                                                },
                                                "heading_font": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font_size": {
                                                    "type": "string"
                                                },
                                                "heading_size": {
                                                    "type": "string"
                                                },
                                                "spacing": {
                                                    "type": "string"
                                                },
                                                "use_icons": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "show_photo": {
                                                    "type": "boolean"
                                                },
                                                "photo_shape": {
                                                    "type": "string"
                                                },
                                                "photo_url": {
                                                    "type": "string"
                                                },
                                                "source_portfolio_name": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "updated_at": {
                                                    "type": "string"
                                                },
                                                "sections": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "string"
                                                            },
                                                            "type": {
                                                                "type": "string"
                                                            },
                                                            "title": {
                                                                "type": "string"
                                                            },
                                                            "position": {
                                                                "type": "integer"
                                                            },
                                                            "is_visible": {
                                                                "type": "boolean"
                                                            },
                                                            "column": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "entries": {
                                                                "type": "array",
                                                                "items": {}
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000011",
                                        "name": "CV développeuse",
                                        "template": "sidebar-left",
                                        "locale": "fr",
                                        "full_name": "Awa Diallo",
                                        "headline": "Développeuse Laravel & React",
                                        "email": "awa.diallo@example.com",
                                        "phone": "+221 77 123 45 67",
                                        "location": "Dakar, Sénégal",
                                        "website": "https://awadiallo.dev",
                                        "portfolio_url": null,
                                        "extra_info": [
                                            {
                                                "kind": "birth_date",
                                                "label": "Date de naissance",
                                                "value": "",
                                                "icon": "cake"
                                            },
                                            {
                                                "kind": "birth_place",
                                                "label": "Lieu de naissance",
                                                "value": "",
                                                "icon": "map-pin"
                                            }
                                        ],
                                        "summary": "<p>Six ans d’expérience en développement web.</p>",
                                        "accent_color": "#bf6b15",
                                        "panel_color": null,
                                        "font": "sans",
                                        "heading_font": null,
                                        "font_size": "md",
                                        "heading_size": "md",
                                        "spacing": "comfortable",
                                        "use_icons": null,
                                        "show_photo": true,
                                        "photo_shape": "round",
                                        "photo_url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000012.png",
                                        "source_portfolio_name": null,
                                        "updated_at": "2026-09-15T09:30:00+00:00",
                                        "sections": [
                                            {
                                                "id": "01j9z000000000000000000013",
                                                "type": "journey",
                                                "title": "Expérience professionnelle",
                                                "position": 1,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            },
                                            {
                                                "id": "01j9z000000000000000000014",
                                                "type": "journey",
                                                "title": "Formation",
                                                "position": 2,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "photo_media_ids": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Un identifiant d’image de la bibliothèque (POST /files)"
                                    }
                                },
                                "required": [
                                    "photo_media_ids"
                                ]
                            },
                            "example": {
                                "photo_media_ids": [
                                    "01j9z000000000000000000016"
                                ]
                            }
                        }
                    }
                }
            },
            "delete": {
                "operationId": "cvs_photo_destroy",
                "summary": "Retire la photo du CV.",
                "description": "",
                "tags": [
                    "CV"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "cv",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du CV",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Supprimé"
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/cvs/{cv}/export": {
            "get": {
                "operationId": "cvs_export",
                "summary": "Télécharge le CV en PDF (binaire ; indisponible en mode test).",
                "description": "",
                "tags": [
                    "CV"
                ],
                "x-required-scope": "read",
                "parameters": [
                    {
                        "name": "cv",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du CV",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Fichier PDF",
                        "content": {
                            "application/pdf": {
                                "schema": {
                                    "type": "string",
                                    "format": "binary"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/cvs/{cv}/sections": {
            "post": {
                "operationId": "cvs_sections_store",
                "summary": "Ajoute une section en fin de liste ; renvoie le CV complet.",
                "description": "Types : description (un seul texte libre : profil, centres d’intérêt ; une seule entrée), journey (parcours : expériences, formations, certifications — titre, sous-titre, dates, lieu), skills (compétences, niveau data.rating 0-100), projects (projets : url, année, tags), list (liste simple de lignes : langues, atouts), keyvalue (paires libellé/valeur : permis, état civil ; le sous-titre est la valeur, obligatoire). Un CV n’a que ces six types (ni témoignages, clients ni blog). Après avoir créé la section, ajoutez ses lignes avec l’opération d’ajout d’entrée. Sans titre, le titre par défaut du type est utilisé.",
                "tags": [
                    "Contenu du CV"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "cv",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du CV",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "201": {
                        "description": "Créé",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "template": {
                                                    "type": "string"
                                                },
                                                "locale": {
                                                    "type": "string"
                                                },
                                                "full_name": {
                                                    "type": "string"
                                                },
                                                "headline": {
                                                    "type": "string"
                                                },
                                                "email": {
                                                    "type": "string"
                                                },
                                                "phone": {
                                                    "type": "string"
                                                },
                                                "location": {
                                                    "type": "string"
                                                },
                                                "website": {
                                                    "type": "string"
                                                },
                                                "portfolio_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "extra_info": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "kind": {
                                                                "type": "string"
                                                            },
                                                            "label": {
                                                                "type": "string"
                                                            },
                                                            "value": {
                                                                "type": "string"
                                                            },
                                                            "icon": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "summary": {
                                                    "type": "string"
                                                },
                                                "accent_color": {
                                                    "type": "string"
                                                },
                                                "panel_color": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font": {
                                                    "type": "string"
                                                },
                                                "heading_font": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font_size": {
                                                    "type": "string"
                                                },
                                                "heading_size": {
                                                    "type": "string"
                                                },
                                                "spacing": {
                                                    "type": "string"
                                                },
                                                "use_icons": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "show_photo": {
                                                    "type": "boolean"
                                                },
                                                "photo_shape": {
                                                    "type": "string"
                                                },
                                                "photo_url": {
                                                    "type": "string"
                                                },
                                                "source_portfolio_name": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "updated_at": {
                                                    "type": "string"
                                                },
                                                "sections": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "string"
                                                            },
                                                            "type": {
                                                                "type": "string"
                                                            },
                                                            "title": {
                                                                "type": "string"
                                                            },
                                                            "position": {
                                                                "type": "integer"
                                                            },
                                                            "is_visible": {
                                                                "type": "boolean"
                                                            },
                                                            "column": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "entries": {
                                                                "type": "array",
                                                                "items": {}
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000011",
                                        "name": "CV développeuse",
                                        "template": "sidebar-left",
                                        "locale": "fr",
                                        "full_name": "Awa Diallo",
                                        "headline": "Développeuse Laravel & React",
                                        "email": "awa.diallo@example.com",
                                        "phone": "+221 77 123 45 67",
                                        "location": "Dakar, Sénégal",
                                        "website": "https://awadiallo.dev",
                                        "portfolio_url": null,
                                        "extra_info": [
                                            {
                                                "kind": "birth_date",
                                                "label": "Date de naissance",
                                                "value": "",
                                                "icon": "cake"
                                            },
                                            {
                                                "kind": "birth_place",
                                                "label": "Lieu de naissance",
                                                "value": "",
                                                "icon": "map-pin"
                                            }
                                        ],
                                        "summary": "<p>Six ans d’expérience en développement web.</p>",
                                        "accent_color": "#bf6b15",
                                        "panel_color": null,
                                        "font": "sans",
                                        "heading_font": null,
                                        "font_size": "md",
                                        "heading_size": "md",
                                        "spacing": "comfortable",
                                        "use_icons": null,
                                        "show_photo": true,
                                        "photo_shape": "round",
                                        "photo_url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000012.png",
                                        "source_portfolio_name": null,
                                        "updated_at": "2026-09-15T09:30:00+00:00",
                                        "sections": [
                                            {
                                                "id": "01j9z000000000000000000013",
                                                "type": "journey",
                                                "title": "Expérience professionnelle",
                                                "position": 1,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            },
                                            {
                                                "id": "01j9z000000000000000000014",
                                                "type": "journey",
                                                "title": "Formation",
                                                "position": 2,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "type": {
                                        "type": "string",
                                        "enum": [
                                            "description",
                                            "journey",
                                            "skills",
                                            "projects",
                                            "list",
                                            "keyvalue"
                                        ],
                                        "description": "Type"
                                    },
                                    "title": {
                                        "type": "string",
                                        "description": "Titre"
                                    }
                                },
                                "required": [
                                    "type"
                                ]
                            },
                            "example": {
                                "type": "journey",
                                "title": "Expérience"
                            }
                        }
                    }
                }
            }
        },
        "/cvs/{cv}/sections/reorder": {
            "put": {
                "operationId": "cvs_sections_reorder",
                "summary": "Réordonne les sections.",
                "description": "",
                "tags": [
                    "Contenu du CV"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "cv",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant du CV",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "template": {
                                                    "type": "string"
                                                },
                                                "locale": {
                                                    "type": "string"
                                                },
                                                "full_name": {
                                                    "type": "string"
                                                },
                                                "headline": {
                                                    "type": "string"
                                                },
                                                "email": {
                                                    "type": "string"
                                                },
                                                "phone": {
                                                    "type": "string"
                                                },
                                                "location": {
                                                    "type": "string"
                                                },
                                                "website": {
                                                    "type": "string"
                                                },
                                                "portfolio_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "extra_info": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "kind": {
                                                                "type": "string"
                                                            },
                                                            "label": {
                                                                "type": "string"
                                                            },
                                                            "value": {
                                                                "type": "string"
                                                            },
                                                            "icon": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "summary": {
                                                    "type": "string"
                                                },
                                                "accent_color": {
                                                    "type": "string"
                                                },
                                                "panel_color": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font": {
                                                    "type": "string"
                                                },
                                                "heading_font": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font_size": {
                                                    "type": "string"
                                                },
                                                "heading_size": {
                                                    "type": "string"
                                                },
                                                "spacing": {
                                                    "type": "string"
                                                },
                                                "use_icons": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "show_photo": {
                                                    "type": "boolean"
                                                },
                                                "photo_shape": {
                                                    "type": "string"
                                                },
                                                "photo_url": {
                                                    "type": "string"
                                                },
                                                "source_portfolio_name": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "updated_at": {
                                                    "type": "string"
                                                },
                                                "sections": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "string"
                                                            },
                                                            "type": {
                                                                "type": "string"
                                                            },
                                                            "title": {
                                                                "type": "string"
                                                            },
                                                            "position": {
                                                                "type": "integer"
                                                            },
                                                            "is_visible": {
                                                                "type": "boolean"
                                                            },
                                                            "column": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "entries": {
                                                                "type": "array",
                                                                "items": {}
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000011",
                                        "name": "CV développeuse",
                                        "template": "sidebar-left",
                                        "locale": "fr",
                                        "full_name": "Awa Diallo",
                                        "headline": "Développeuse Laravel & React",
                                        "email": "awa.diallo@example.com",
                                        "phone": "+221 77 123 45 67",
                                        "location": "Dakar, Sénégal",
                                        "website": "https://awadiallo.dev",
                                        "portfolio_url": null,
                                        "extra_info": [
                                            {
                                                "kind": "birth_date",
                                                "label": "Date de naissance",
                                                "value": "",
                                                "icon": "cake"
                                            },
                                            {
                                                "kind": "birth_place",
                                                "label": "Lieu de naissance",
                                                "value": "",
                                                "icon": "map-pin"
                                            }
                                        ],
                                        "summary": "<p>Six ans d’expérience en développement web.</p>",
                                        "accent_color": "#bf6b15",
                                        "panel_color": null,
                                        "font": "sans",
                                        "heading_font": null,
                                        "font_size": "md",
                                        "heading_size": "md",
                                        "spacing": "comfortable",
                                        "use_icons": null,
                                        "show_photo": true,
                                        "photo_shape": "round",
                                        "photo_url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000012.png",
                                        "source_portfolio_name": null,
                                        "updated_at": "2026-09-15T09:30:00+00:00",
                                        "sections": [
                                            {
                                                "id": "01j9z000000000000000000013",
                                                "type": "journey",
                                                "title": "Expérience professionnelle",
                                                "position": 1,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            },
                                            {
                                                "id": "01j9z000000000000000000014",
                                                "type": "journey",
                                                "title": "Formation",
                                                "position": 2,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "section_ids": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Identifiants dans le nouvel ordre"
                                    }
                                },
                                "required": [
                                    "section_ids"
                                ]
                            },
                            "example": {
                                "section_ids": [
                                    "01j9z000000000000000000013",
                                    "01j9z000000000000000000014"
                                ]
                            }
                        }
                    }
                }
            }
        },
        "/cv-sections/{section}/insert-after": {
            "post": {
                "operationId": "cv_sections_insert_after",
                "summary": "Insère une section après {section}.",
                "description": "Types : description (un seul texte libre : profil, centres d’intérêt ; une seule entrée), journey (parcours : expériences, formations, certifications — titre, sous-titre, dates, lieu), skills (compétences, niveau data.rating 0-100), projects (projets : url, année, tags), list (liste simple de lignes : langues, atouts), keyvalue (paires libellé/valeur : permis, état civil ; le sous-titre est la valeur, obligatoire). Un CV n’a que ces six types (ni témoignages, clients ni blog). Après avoir créé la section, ajoutez ses lignes avec l’opération d’ajout d’entrée. Sans titre, le titre par défaut du type est utilisé.",
                "tags": [
                    "Contenu du CV"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "section",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant de la section",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "201": {
                        "description": "Créé",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "template": {
                                                    "type": "string"
                                                },
                                                "locale": {
                                                    "type": "string"
                                                },
                                                "full_name": {
                                                    "type": "string"
                                                },
                                                "headline": {
                                                    "type": "string"
                                                },
                                                "email": {
                                                    "type": "string"
                                                },
                                                "phone": {
                                                    "type": "string"
                                                },
                                                "location": {
                                                    "type": "string"
                                                },
                                                "website": {
                                                    "type": "string"
                                                },
                                                "portfolio_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "extra_info": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "kind": {
                                                                "type": "string"
                                                            },
                                                            "label": {
                                                                "type": "string"
                                                            },
                                                            "value": {
                                                                "type": "string"
                                                            },
                                                            "icon": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "summary": {
                                                    "type": "string"
                                                },
                                                "accent_color": {
                                                    "type": "string"
                                                },
                                                "panel_color": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font": {
                                                    "type": "string"
                                                },
                                                "heading_font": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font_size": {
                                                    "type": "string"
                                                },
                                                "heading_size": {
                                                    "type": "string"
                                                },
                                                "spacing": {
                                                    "type": "string"
                                                },
                                                "use_icons": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "show_photo": {
                                                    "type": "boolean"
                                                },
                                                "photo_shape": {
                                                    "type": "string"
                                                },
                                                "photo_url": {
                                                    "type": "string"
                                                },
                                                "source_portfolio_name": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "updated_at": {
                                                    "type": "string"
                                                },
                                                "sections": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "string"
                                                            },
                                                            "type": {
                                                                "type": "string"
                                                            },
                                                            "title": {
                                                                "type": "string"
                                                            },
                                                            "position": {
                                                                "type": "integer"
                                                            },
                                                            "is_visible": {
                                                                "type": "boolean"
                                                            },
                                                            "column": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "entries": {
                                                                "type": "array",
                                                                "items": {}
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000011",
                                        "name": "CV développeuse",
                                        "template": "sidebar-left",
                                        "locale": "fr",
                                        "full_name": "Awa Diallo",
                                        "headline": "Développeuse Laravel & React",
                                        "email": "awa.diallo@example.com",
                                        "phone": "+221 77 123 45 67",
                                        "location": "Dakar, Sénégal",
                                        "website": "https://awadiallo.dev",
                                        "portfolio_url": null,
                                        "extra_info": [
                                            {
                                                "kind": "birth_date",
                                                "label": "Date de naissance",
                                                "value": "",
                                                "icon": "cake"
                                            },
                                            {
                                                "kind": "birth_place",
                                                "label": "Lieu de naissance",
                                                "value": "",
                                                "icon": "map-pin"
                                            }
                                        ],
                                        "summary": "<p>Six ans d’expérience en développement web.</p>",
                                        "accent_color": "#bf6b15",
                                        "panel_color": null,
                                        "font": "sans",
                                        "heading_font": null,
                                        "font_size": "md",
                                        "heading_size": "md",
                                        "spacing": "comfortable",
                                        "use_icons": null,
                                        "show_photo": true,
                                        "photo_shape": "round",
                                        "photo_url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000012.png",
                                        "source_portfolio_name": null,
                                        "updated_at": "2026-09-15T09:30:00+00:00",
                                        "sections": [
                                            {
                                                "id": "01j9z000000000000000000013",
                                                "type": "journey",
                                                "title": "Expérience professionnelle",
                                                "position": 1,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            },
                                            {
                                                "id": "01j9z000000000000000000014",
                                                "type": "journey",
                                                "title": "Formation",
                                                "position": 2,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "type": {
                                        "type": "string",
                                        "enum": [
                                            "description",
                                            "journey",
                                            "skills",
                                            "projects",
                                            "list",
                                            "keyvalue"
                                        ],
                                        "description": "Type"
                                    },
                                    "title": {
                                        "type": "string",
                                        "description": "Titre"
                                    }
                                },
                                "required": [
                                    "type"
                                ]
                            },
                            "example": {
                                "type": "skills",
                                "title": "Compétences"
                            }
                        }
                    }
                }
            }
        },
        "/cv-sections/{section}": {
            "patch": {
                "operationId": "cv_sections_update",
                "summary": "Modifie titre, visibilité, colonne.",
                "description": "Mise à jour partielle : n’envoyez que les champs à changer, les autres restent inchangés (null ou une chaîne vide efface un champ facultatif). Un objet est fusionné clé par clé, une liste est remplacée en entier.",
                "tags": [
                    "Contenu du CV"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "section",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant de la section",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "template": {
                                                    "type": "string"
                                                },
                                                "locale": {
                                                    "type": "string"
                                                },
                                                "full_name": {
                                                    "type": "string"
                                                },
                                                "headline": {
                                                    "type": "string"
                                                },
                                                "email": {
                                                    "type": "string"
                                                },
                                                "phone": {
                                                    "type": "string"
                                                },
                                                "location": {
                                                    "type": "string"
                                                },
                                                "website": {
                                                    "type": "string"
                                                },
                                                "portfolio_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "extra_info": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "kind": {
                                                                "type": "string"
                                                            },
                                                            "label": {
                                                                "type": "string"
                                                            },
                                                            "value": {
                                                                "type": "string"
                                                            },
                                                            "icon": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "summary": {
                                                    "type": "string"
                                                },
                                                "accent_color": {
                                                    "type": "string"
                                                },
                                                "panel_color": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font": {
                                                    "type": "string"
                                                },
                                                "heading_font": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font_size": {
                                                    "type": "string"
                                                },
                                                "heading_size": {
                                                    "type": "string"
                                                },
                                                "spacing": {
                                                    "type": "string"
                                                },
                                                "use_icons": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "show_photo": {
                                                    "type": "boolean"
                                                },
                                                "photo_shape": {
                                                    "type": "string"
                                                },
                                                "photo_url": {
                                                    "type": "string"
                                                },
                                                "source_portfolio_name": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "updated_at": {
                                                    "type": "string"
                                                },
                                                "sections": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "string"
                                                            },
                                                            "type": {
                                                                "type": "string"
                                                            },
                                                            "title": {
                                                                "type": "string"
                                                            },
                                                            "position": {
                                                                "type": "integer"
                                                            },
                                                            "is_visible": {
                                                                "type": "boolean"
                                                            },
                                                            "column": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "entries": {
                                                                "type": "array",
                                                                "items": {}
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000011",
                                        "name": "CV développeuse",
                                        "template": "sidebar-left",
                                        "locale": "fr",
                                        "full_name": "Awa Diallo",
                                        "headline": "Développeuse Laravel & React",
                                        "email": "awa.diallo@example.com",
                                        "phone": "+221 77 123 45 67",
                                        "location": "Dakar, Sénégal",
                                        "website": "https://awadiallo.dev",
                                        "portfolio_url": null,
                                        "extra_info": [
                                            {
                                                "kind": "birth_date",
                                                "label": "Date de naissance",
                                                "value": "",
                                                "icon": "cake"
                                            },
                                            {
                                                "kind": "birth_place",
                                                "label": "Lieu de naissance",
                                                "value": "",
                                                "icon": "map-pin"
                                            }
                                        ],
                                        "summary": "<p>Six ans d’expérience en développement web.</p>",
                                        "accent_color": "#bf6b15",
                                        "panel_color": null,
                                        "font": "sans",
                                        "heading_font": null,
                                        "font_size": "md",
                                        "heading_size": "md",
                                        "spacing": "comfortable",
                                        "use_icons": null,
                                        "show_photo": true,
                                        "photo_shape": "round",
                                        "photo_url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000012.png",
                                        "source_portfolio_name": null,
                                        "updated_at": "2026-09-15T09:30:00+00:00",
                                        "sections": [
                                            {
                                                "id": "01j9z000000000000000000013",
                                                "type": "journey",
                                                "title": "Expérience professionnelle",
                                                "position": 1,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            },
                                            {
                                                "id": "01j9z000000000000000000014",
                                                "type": "journey",
                                                "title": "Formation",
                                                "position": 2,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "title": {
                                        "type": "string",
                                        "description": "Titre"
                                    },
                                    "is_visible": {
                                        "type": "boolean",
                                        "description": "Visible"
                                    },
                                    "column": {
                                        "type": "string",
                                        "enum": [
                                            "left",
                                            "right"
                                        ],
                                        "description": "Colonne"
                                    }
                                }
                            },
                            "example": {
                                "title": "Expérience professionnelle",
                                "is_visible": true
                            }
                        }
                    }
                }
            },
            "delete": {
                "operationId": "cv_sections_destroy",
                "summary": "Supprime une section.",
                "description": "",
                "tags": [
                    "Contenu du CV"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "section",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant de la section",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Supprimé"
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/cv-sections/{section}/entries": {
            "post": {
                "operationId": "cv_sections_entries_store",
                "summary": "Ajoute une entrée ; renvoie le CV complet.",
                "description": "Champs requis selon le type de la section : titre (sauf description et keyvalue), subtitle pour keyvalue (la valeur). Une section description n’a qu’une entrée. Les icônes viennent du catalogue des CV (clé comme « car » ou « mail »).",
                "tags": [
                    "Contenu du CV"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "section",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant de la section",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "201": {
                        "description": "Créé",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "template": {
                                                    "type": "string"
                                                },
                                                "locale": {
                                                    "type": "string"
                                                },
                                                "full_name": {
                                                    "type": "string"
                                                },
                                                "headline": {
                                                    "type": "string"
                                                },
                                                "email": {
                                                    "type": "string"
                                                },
                                                "phone": {
                                                    "type": "string"
                                                },
                                                "location": {
                                                    "type": "string"
                                                },
                                                "website": {
                                                    "type": "string"
                                                },
                                                "portfolio_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "extra_info": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "kind": {
                                                                "type": "string"
                                                            },
                                                            "label": {
                                                                "type": "string"
                                                            },
                                                            "value": {
                                                                "type": "string"
                                                            },
                                                            "icon": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "summary": {
                                                    "type": "string"
                                                },
                                                "accent_color": {
                                                    "type": "string"
                                                },
                                                "panel_color": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font": {
                                                    "type": "string"
                                                },
                                                "heading_font": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font_size": {
                                                    "type": "string"
                                                },
                                                "heading_size": {
                                                    "type": "string"
                                                },
                                                "spacing": {
                                                    "type": "string"
                                                },
                                                "use_icons": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "show_photo": {
                                                    "type": "boolean"
                                                },
                                                "photo_shape": {
                                                    "type": "string"
                                                },
                                                "photo_url": {
                                                    "type": "string"
                                                },
                                                "source_portfolio_name": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "updated_at": {
                                                    "type": "string"
                                                },
                                                "sections": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "string"
                                                            },
                                                            "type": {
                                                                "type": "string"
                                                            },
                                                            "title": {
                                                                "type": "string"
                                                            },
                                                            "position": {
                                                                "type": "integer"
                                                            },
                                                            "is_visible": {
                                                                "type": "boolean"
                                                            },
                                                            "column": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "entries": {
                                                                "type": "array",
                                                                "items": {}
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000011",
                                        "name": "CV développeuse",
                                        "template": "sidebar-left",
                                        "locale": "fr",
                                        "full_name": "Awa Diallo",
                                        "headline": "Développeuse Laravel & React",
                                        "email": "awa.diallo@example.com",
                                        "phone": "+221 77 123 45 67",
                                        "location": "Dakar, Sénégal",
                                        "website": "https://awadiallo.dev",
                                        "portfolio_url": null,
                                        "extra_info": [
                                            {
                                                "kind": "birth_date",
                                                "label": "Date de naissance",
                                                "value": "",
                                                "icon": "cake"
                                            },
                                            {
                                                "kind": "birth_place",
                                                "label": "Lieu de naissance",
                                                "value": "",
                                                "icon": "map-pin"
                                            }
                                        ],
                                        "summary": "<p>Six ans d’expérience en développement web.</p>",
                                        "accent_color": "#bf6b15",
                                        "panel_color": null,
                                        "font": "sans",
                                        "heading_font": null,
                                        "font_size": "md",
                                        "heading_size": "md",
                                        "spacing": "comfortable",
                                        "use_icons": null,
                                        "show_photo": true,
                                        "photo_shape": "round",
                                        "photo_url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000012.png",
                                        "source_portfolio_name": null,
                                        "updated_at": "2026-09-15T09:30:00+00:00",
                                        "sections": [
                                            {
                                                "id": "01j9z000000000000000000013",
                                                "type": "journey",
                                                "title": "Expérience professionnelle",
                                                "position": 1,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            },
                                            {
                                                "id": "01j9z000000000000000000014",
                                                "type": "journey",
                                                "title": "Formation",
                                                "position": 2,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "title": {
                                        "type": "string",
                                        "description": "Titre (clé pour une section clés-valeurs)"
                                    },
                                    "subtitle": {
                                        "type": "string",
                                        "description": "Sous-titre (valeur pour clés-valeurs, requise)"
                                    },
                                    "icon": {
                                        "type": "string",
                                        "description": "Clé d’icône (types qui l’acceptent)"
                                    },
                                    "description": {
                                        "type": "string",
                                        "description": "Texte"
                                    },
                                    "start_date": {
                                        "type": "string",
                                        "description": "Date de début (AAAA-MM-JJ)"
                                    },
                                    "end_date": {
                                        "type": "string",
                                        "description": "Date de fin (AAAA-MM-JJ)"
                                    },
                                    "data": {
                                        "type": "object",
                                        "description": "Champs propres au type : journey → location (texte), current (booléen, poste en cours) ; skills → rating (0-100) ; projects → url, year, tags[] ; les autres types n’en ont pas"
                                    }
                                }
                            },
                            "example": {
                                "title": "Développeuse full stack",
                                "subtitle": "Sahel Craft",
                                "start_date": "2022-01-01",
                                "description": "Refonte de la boutique et du back-office."
                            }
                        }
                    }
                }
            }
        },
        "/cv-sections/{section}/entries/reorder": {
            "put": {
                "operationId": "cv_sections_entries_reorder",
                "summary": "Réordonne les entrées.",
                "description": "",
                "tags": [
                    "Contenu du CV"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "section",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant de la section",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "template": {
                                                    "type": "string"
                                                },
                                                "locale": {
                                                    "type": "string"
                                                },
                                                "full_name": {
                                                    "type": "string"
                                                },
                                                "headline": {
                                                    "type": "string"
                                                },
                                                "email": {
                                                    "type": "string"
                                                },
                                                "phone": {
                                                    "type": "string"
                                                },
                                                "location": {
                                                    "type": "string"
                                                },
                                                "website": {
                                                    "type": "string"
                                                },
                                                "portfolio_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "extra_info": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "kind": {
                                                                "type": "string"
                                                            },
                                                            "label": {
                                                                "type": "string"
                                                            },
                                                            "value": {
                                                                "type": "string"
                                                            },
                                                            "icon": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "summary": {
                                                    "type": "string"
                                                },
                                                "accent_color": {
                                                    "type": "string"
                                                },
                                                "panel_color": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font": {
                                                    "type": "string"
                                                },
                                                "heading_font": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font_size": {
                                                    "type": "string"
                                                },
                                                "heading_size": {
                                                    "type": "string"
                                                },
                                                "spacing": {
                                                    "type": "string"
                                                },
                                                "use_icons": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "show_photo": {
                                                    "type": "boolean"
                                                },
                                                "photo_shape": {
                                                    "type": "string"
                                                },
                                                "photo_url": {
                                                    "type": "string"
                                                },
                                                "source_portfolio_name": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "updated_at": {
                                                    "type": "string"
                                                },
                                                "sections": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "string"
                                                            },
                                                            "type": {
                                                                "type": "string"
                                                            },
                                                            "title": {
                                                                "type": "string"
                                                            },
                                                            "position": {
                                                                "type": "integer"
                                                            },
                                                            "is_visible": {
                                                                "type": "boolean"
                                                            },
                                                            "column": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "entries": {
                                                                "type": "array",
                                                                "items": {}
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000011",
                                        "name": "CV développeuse",
                                        "template": "sidebar-left",
                                        "locale": "fr",
                                        "full_name": "Awa Diallo",
                                        "headline": "Développeuse Laravel & React",
                                        "email": "awa.diallo@example.com",
                                        "phone": "+221 77 123 45 67",
                                        "location": "Dakar, Sénégal",
                                        "website": "https://awadiallo.dev",
                                        "portfolio_url": null,
                                        "extra_info": [
                                            {
                                                "kind": "birth_date",
                                                "label": "Date de naissance",
                                                "value": "",
                                                "icon": "cake"
                                            },
                                            {
                                                "kind": "birth_place",
                                                "label": "Lieu de naissance",
                                                "value": "",
                                                "icon": "map-pin"
                                            }
                                        ],
                                        "summary": "<p>Six ans d’expérience en développement web.</p>",
                                        "accent_color": "#bf6b15",
                                        "panel_color": null,
                                        "font": "sans",
                                        "heading_font": null,
                                        "font_size": "md",
                                        "heading_size": "md",
                                        "spacing": "comfortable",
                                        "use_icons": null,
                                        "show_photo": true,
                                        "photo_shape": "round",
                                        "photo_url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000012.png",
                                        "source_portfolio_name": null,
                                        "updated_at": "2026-09-15T09:30:00+00:00",
                                        "sections": [
                                            {
                                                "id": "01j9z000000000000000000013",
                                                "type": "journey",
                                                "title": "Expérience professionnelle",
                                                "position": 1,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            },
                                            {
                                                "id": "01j9z000000000000000000014",
                                                "type": "journey",
                                                "title": "Formation",
                                                "position": 2,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "entry_ids": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Identifiants dans le nouvel ordre"
                                    }
                                },
                                "required": [
                                    "entry_ids"
                                ]
                            },
                            "example": {
                                "entry_ids": [
                                    "01j9z000000000000000000015"
                                ]
                            }
                        }
                    }
                }
            }
        },
        "/cv-entries/{entry}": {
            "patch": {
                "operationId": "cv_entries_update",
                "summary": "Modifie une entrée ; renvoie le CV complet.",
                "description": "Mise à jour partielle : n’envoyez que les champs à changer, les autres restent inchangés (null ou une chaîne vide efface un champ facultatif). Un objet est fusionné clé par clé, une liste est remplacée en entier.",
                "tags": [
                    "Contenu du CV"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "entry",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant de l’entrée",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "template": {
                                                    "type": "string"
                                                },
                                                "locale": {
                                                    "type": "string"
                                                },
                                                "full_name": {
                                                    "type": "string"
                                                },
                                                "headline": {
                                                    "type": "string"
                                                },
                                                "email": {
                                                    "type": "string"
                                                },
                                                "phone": {
                                                    "type": "string"
                                                },
                                                "location": {
                                                    "type": "string"
                                                },
                                                "website": {
                                                    "type": "string"
                                                },
                                                "portfolio_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "extra_info": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "kind": {
                                                                "type": "string"
                                                            },
                                                            "label": {
                                                                "type": "string"
                                                            },
                                                            "value": {
                                                                "type": "string"
                                                            },
                                                            "icon": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "summary": {
                                                    "type": "string"
                                                },
                                                "accent_color": {
                                                    "type": "string"
                                                },
                                                "panel_color": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font": {
                                                    "type": "string"
                                                },
                                                "heading_font": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "font_size": {
                                                    "type": "string"
                                                },
                                                "heading_size": {
                                                    "type": "string"
                                                },
                                                "spacing": {
                                                    "type": "string"
                                                },
                                                "use_icons": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "show_photo": {
                                                    "type": "boolean"
                                                },
                                                "photo_shape": {
                                                    "type": "string"
                                                },
                                                "photo_url": {
                                                    "type": "string"
                                                },
                                                "source_portfolio_name": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "updated_at": {
                                                    "type": "string"
                                                },
                                                "sections": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "string"
                                                            },
                                                            "type": {
                                                                "type": "string"
                                                            },
                                                            "title": {
                                                                "type": "string"
                                                            },
                                                            "position": {
                                                                "type": "integer"
                                                            },
                                                            "is_visible": {
                                                                "type": "boolean"
                                                            },
                                                            "column": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "entries": {
                                                                "type": "array",
                                                                "items": {}
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000011",
                                        "name": "CV développeuse",
                                        "template": "sidebar-left",
                                        "locale": "fr",
                                        "full_name": "Awa Diallo",
                                        "headline": "Développeuse Laravel & React",
                                        "email": "awa.diallo@example.com",
                                        "phone": "+221 77 123 45 67",
                                        "location": "Dakar, Sénégal",
                                        "website": "https://awadiallo.dev",
                                        "portfolio_url": null,
                                        "extra_info": [
                                            {
                                                "kind": "birth_date",
                                                "label": "Date de naissance",
                                                "value": "",
                                                "icon": "cake"
                                            },
                                            {
                                                "kind": "birth_place",
                                                "label": "Lieu de naissance",
                                                "value": "",
                                                "icon": "map-pin"
                                            }
                                        ],
                                        "summary": "<p>Six ans d’expérience en développement web.</p>",
                                        "accent_color": "#bf6b15",
                                        "panel_color": null,
                                        "font": "sans",
                                        "heading_font": null,
                                        "font_size": "md",
                                        "heading_size": "md",
                                        "spacing": "comfortable",
                                        "use_icons": null,
                                        "show_photo": true,
                                        "photo_shape": "round",
                                        "photo_url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000012.png",
                                        "source_portfolio_name": null,
                                        "updated_at": "2026-09-15T09:30:00+00:00",
                                        "sections": [
                                            {
                                                "id": "01j9z000000000000000000013",
                                                "type": "journey",
                                                "title": "Expérience professionnelle",
                                                "position": 1,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            },
                                            {
                                                "id": "01j9z000000000000000000014",
                                                "type": "journey",
                                                "title": "Formation",
                                                "position": 2,
                                                "is_visible": true,
                                                "column": null,
                                                "entries": []
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "title": {
                                        "type": "string",
                                        "description": "Titre (clé pour une section clés-valeurs)"
                                    },
                                    "subtitle": {
                                        "type": "string",
                                        "description": "Sous-titre (valeur pour clés-valeurs, requise)"
                                    },
                                    "icon": {
                                        "type": "string",
                                        "description": "Clé d’icône (types qui l’acceptent)"
                                    },
                                    "description": {
                                        "type": "string",
                                        "description": "Texte"
                                    },
                                    "start_date": {
                                        "type": "string",
                                        "description": "Date de début (AAAA-MM-JJ)"
                                    },
                                    "end_date": {
                                        "type": "string",
                                        "description": "Date de fin (AAAA-MM-JJ)"
                                    },
                                    "data": {
                                        "type": "object",
                                        "description": "Champs propres au type : journey → location (texte), current (booléen, poste en cours) ; skills → rating (0-100) ; projects → url, year, tags[] ; les autres types n’en ont pas"
                                    }
                                }
                            },
                            "example": {
                                "title": "Développeuse full stack",
                                "subtitle": "Sahel Craft",
                                "start_date": "2022-01-01",
                                "description": "Refonte de la boutique, du back-office et de l’API."
                            }
                        }
                    }
                }
            },
            "delete": {
                "operationId": "cv_entries_destroy",
                "summary": "Supprime une entrée.",
                "description": "",
                "tags": [
                    "Contenu du CV"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "entry",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant de l’entrée",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Supprimé"
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/companies": {
            "get": {
                "operationId": "companies_index",
                "summary": "Entreprises que vous gérez.",
                "description": "",
                "tags": [
                    "Entreprises"
                ],
                "x-required-scope": "read",
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Numéro de page (défaut 1)",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Éléments par page (1 à 100, défaut 25)",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "slug": {
                                                        "type": "string"
                                                    },
                                                    "name": {
                                                        "type": "string"
                                                    },
                                                    "description": {
                                                        "type": "string"
                                                    },
                                                    "contact_email": {
                                                        "type": "string"
                                                    },
                                                    "contact_phone": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "website_url": {
                                                        "type": "string"
                                                    },
                                                    "address": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "city": {
                                                        "type": "string"
                                                    },
                                                    "country": {
                                                        "type": "string"
                                                    },
                                                    "country_code": {
                                                        "type": "string"
                                                    },
                                                    "logo_url": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "favicon_url": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "is_owner": {
                                                        "type": "boolean"
                                                    },
                                                    "job_offers_count": {
                                                        "type": "integer"
                                                    }
                                                }
                                            }
                                        },
                                        "links": {
                                            "type": "object",
                                            "properties": {
                                                "first": {
                                                    "type": "string"
                                                },
                                                "last": {
                                                    "type": "string"
                                                },
                                                "prev": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "next": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "current_page": {
                                                    "type": "integer"
                                                },
                                                "from": {
                                                    "type": "integer"
                                                },
                                                "last_page": {
                                                    "type": "integer"
                                                },
                                                "links": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "url": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "label": {
                                                                "type": "string"
                                                            },
                                                            "page": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "active": {
                                                                "type": "boolean"
                                                            }
                                                        }
                                                    }
                                                },
                                                "path": {
                                                    "type": "string"
                                                },
                                                "per_page": {
                                                    "type": "integer"
                                                },
                                                "to": {
                                                    "type": "integer"
                                                },
                                                "total": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": [
                                        {
                                            "slug": "sahel-craft",
                                            "name": "Sahel Craft",
                                            "description": "Artisanat d’Afrique de l’Ouest vendu en ligne.",
                                            "contact_email": "rh@sahelcraft.example",
                                            "contact_phone": null,
                                            "website_url": "https://sahelcraft.example",
                                            "address": null,
                                            "city": "Dakar",
                                            "country": "Sénégal",
                                            "country_code": "SN",
                                            "logo_url": null,
                                            "favicon_url": null,
                                            "is_owner": true,
                                            "job_offers_count": 0
                                        }
                                    ],
                                    "links": {
                                        "first": "https://middlefolio.online/api/v1/companies?page=1",
                                        "last": "https://middlefolio.online/api/v1/companies?page=1",
                                        "prev": null,
                                        "next": null
                                    },
                                    "meta": {
                                        "current_page": 1,
                                        "from": 1,
                                        "last_page": 1,
                                        "links": [
                                            {
                                                "url": null,
                                                "label": "&laquo; Précédent",
                                                "page": null,
                                                "active": false
                                            },
                                            {
                                                "url": "https://middlefolio.online/api/v1/companies?page=1",
                                                "label": "1",
                                                "page": 1,
                                                "active": true
                                            }
                                        ],
                                        "path": "https://middlefolio.online/api/v1/companies",
                                        "per_page": 25,
                                        "to": 1,
                                        "total": 1
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            },
            "post": {
                "operationId": "companies_store",
                "summary": "Crée une entreprise (quota max_companies).",
                "description": "",
                "tags": [
                    "Entreprises"
                ],
                "x-required-scope": "write",
                "parameters": [],
                "responses": {
                    "201": {
                        "description": "Créé",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "slug": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "description": {
                                                    "type": "string"
                                                },
                                                "contact_email": {
                                                    "type": "string"
                                                },
                                                "contact_phone": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "website_url": {
                                                    "type": "string"
                                                },
                                                "address": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "city": {
                                                    "type": "string"
                                                },
                                                "country": {
                                                    "type": "string"
                                                },
                                                "country_code": {
                                                    "type": "string"
                                                },
                                                "logo_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "favicon_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "is_owner": {
                                                    "type": "boolean"
                                                },
                                                "category_ids": {
                                                    "type": "array",
                                                    "items": {}
                                                },
                                                "members": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "user_id": {
                                                                "type": "string"
                                                            },
                                                            "name": {
                                                                "type": "string"
                                                            },
                                                            "email": {
                                                                "type": "string"
                                                            },
                                                            "role": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "job_offers_count": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "slug": "sahel-craft",
                                        "name": "Sahel Craft",
                                        "description": "Artisanat d’Afrique de l’Ouest vendu en ligne.",
                                        "contact_email": "rh@sahelcraft.example",
                                        "contact_phone": null,
                                        "website_url": "https://sahelcraft.example",
                                        "address": null,
                                        "city": "Dakar",
                                        "country": "Sénégal",
                                        "country_code": "SN",
                                        "logo_url": null,
                                        "favicon_url": null,
                                        "is_owner": true,
                                        "category_ids": [],
                                        "members": [
                                            {
                                                "user_id": "01j9z000000000000000000004",
                                                "name": "Awa Diallo",
                                                "email": "awa.diallo@example.com",
                                                "role": "owner"
                                            }
                                        ],
                                        "job_offers_count": 0
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "name": {
                                        "type": "string",
                                        "description": "Nom"
                                    },
                                    "contact_email": {
                                        "type": "string",
                                        "description": "E-mail de contact"
                                    },
                                    "contact_phone": {
                                        "type": "string",
                                        "description": "Téléphone"
                                    },
                                    "website_url": {
                                        "type": "string",
                                        "description": "URL du site"
                                    },
                                    "description": {
                                        "type": "string",
                                        "description": "Présentation (5000 car. max)"
                                    },
                                    "address": {
                                        "type": "string",
                                        "description": "Adresse"
                                    },
                                    "city": {
                                        "type": "string",
                                        "description": "Ville"
                                    },
                                    "country": {
                                        "type": "string",
                                        "description": "Pays"
                                    },
                                    "country_code": {
                                        "type": "string",
                                        "description": "Code pays ISO 3166-1 alpha-2 (ex. CM, FR) ; prioritaire sur country"
                                    },
                                    "category_ids": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Identifiants de catégories (6 max, GET /categories)"
                                    }
                                },
                                "required": [
                                    "name",
                                    "contact_email"
                                ]
                            },
                            "example": {
                                "name": "Sahel Craft",
                                "contact_email": "rh@sahelcraft.example",
                                "website_url": "https://sahelcraft.example",
                                "description": "Artisanat d’Afrique de l’Ouest vendu en ligne.",
                                "city": "Dakar",
                                "country": "Sénégal"
                            }
                        }
                    }
                }
            }
        },
        "/companies/{company}": {
            "get": {
                "operationId": "companies_show",
                "summary": "Détail d’une entreprise et de ses gestionnaires.",
                "description": "",
                "tags": [
                    "Entreprises"
                ],
                "x-required-scope": "read",
                "parameters": [
                    {
                        "name": "company",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’entreprise",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "slug": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "description": {
                                                    "type": "string"
                                                },
                                                "contact_email": {
                                                    "type": "string"
                                                },
                                                "contact_phone": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "website_url": {
                                                    "type": "string"
                                                },
                                                "address": {
                                                    "type": "string"
                                                },
                                                "city": {
                                                    "type": "string"
                                                },
                                                "country": {
                                                    "type": "string"
                                                },
                                                "country_code": {
                                                    "type": "string"
                                                },
                                                "logo_url": {
                                                    "type": "string"
                                                },
                                                "favicon_url": {
                                                    "type": "string"
                                                },
                                                "is_owner": {
                                                    "type": "boolean"
                                                },
                                                "category_ids": {
                                                    "type": "array",
                                                    "items": {}
                                                },
                                                "members": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "user_id": {
                                                                "type": "string"
                                                            },
                                                            "name": {
                                                                "type": "string"
                                                            },
                                                            "email": {
                                                                "type": "string"
                                                            },
                                                            "role": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "job_offers_count": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "slug": "sahel-craft",
                                        "name": "Sahel Craft",
                                        "description": "Artisanat d’Afrique de l’Ouest vendu en ligne.",
                                        "contact_email": "rh@sahelcraft.example",
                                        "contact_phone": null,
                                        "website_url": "https://sahelcraft.example",
                                        "address": "Rue 10, Point E",
                                        "city": "Dakar",
                                        "country": "Sénégal",
                                        "country_code": "SN",
                                        "logo_url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000005.png",
                                        "favicon_url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000006.png",
                                        "is_owner": true,
                                        "category_ids": [],
                                        "members": [
                                            {
                                                "user_id": "01j9z000000000000000000004",
                                                "name": "Awa Diallo",
                                                "email": "awa.diallo@example.com",
                                                "role": "owner"
                                            },
                                            {
                                                "user_id": "01j9z000000000000000000009",
                                                "name": "Moussa Ndiaye",
                                                "email": "moussa.ndiaye@example.com",
                                                "role": "manager"
                                            }
                                        ],
                                        "job_offers_count": 0
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            },
            "patch": {
                "operationId": "companies_update",
                "summary": "Modifie les informations de l’entreprise.",
                "description": "Mise à jour partielle : n’envoyez que les champs à changer, les autres restent inchangés (null ou une chaîne vide efface un champ facultatif). Un objet est fusionné clé par clé, une liste est remplacée en entier.",
                "tags": [
                    "Entreprises"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "company",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’entreprise",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "slug": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "description": {
                                                    "type": "string"
                                                },
                                                "contact_email": {
                                                    "type": "string"
                                                },
                                                "contact_phone": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "website_url": {
                                                    "type": "string"
                                                },
                                                "address": {
                                                    "type": "string"
                                                },
                                                "city": {
                                                    "type": "string"
                                                },
                                                "country": {
                                                    "type": "string"
                                                },
                                                "country_code": {
                                                    "type": "string"
                                                },
                                                "logo_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "favicon_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "is_owner": {
                                                    "type": "boolean"
                                                },
                                                "category_ids": {
                                                    "type": "array",
                                                    "items": {}
                                                },
                                                "members": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "user_id": {
                                                                "type": "string"
                                                            },
                                                            "name": {
                                                                "type": "string"
                                                            },
                                                            "email": {
                                                                "type": "string"
                                                            },
                                                            "role": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "job_offers_count": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "slug": "sahel-craft",
                                        "name": "Sahel Craft",
                                        "description": "Artisanat d’Afrique de l’Ouest vendu en ligne.",
                                        "contact_email": "rh@sahelcraft.example",
                                        "contact_phone": null,
                                        "website_url": "https://sahelcraft.example",
                                        "address": "Rue 10, Point E",
                                        "city": "Dakar",
                                        "country": "Sénégal",
                                        "country_code": "SN",
                                        "logo_url": null,
                                        "favicon_url": null,
                                        "is_owner": true,
                                        "category_ids": [],
                                        "members": [
                                            {
                                                "user_id": "01j9z000000000000000000004",
                                                "name": "Awa Diallo",
                                                "email": "awa.diallo@example.com",
                                                "role": "owner"
                                            }
                                        ],
                                        "job_offers_count": 0
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "name": {
                                        "type": "string",
                                        "description": "Nom"
                                    },
                                    "contact_email": {
                                        "type": "string",
                                        "description": "E-mail de contact"
                                    },
                                    "contact_phone": {
                                        "type": "string",
                                        "description": "Téléphone"
                                    },
                                    "website_url": {
                                        "type": "string",
                                        "description": "URL du site"
                                    },
                                    "description": {
                                        "type": "string",
                                        "description": "Présentation (5000 car. max)"
                                    },
                                    "address": {
                                        "type": "string",
                                        "description": "Adresse"
                                    },
                                    "city": {
                                        "type": "string",
                                        "description": "Ville"
                                    },
                                    "country": {
                                        "type": "string",
                                        "description": "Pays"
                                    },
                                    "country_code": {
                                        "type": "string",
                                        "description": "Code pays ISO 3166-1 alpha-2 (ex. CM, FR) ; prioritaire sur country"
                                    },
                                    "category_ids": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Identifiants de catégories (6 max, GET /categories)"
                                    }
                                }
                            },
                            "example": {
                                "name": "Sahel Craft",
                                "contact_email": "rh@sahelcraft.example",
                                "website_url": "https://sahelcraft.example",
                                "description": "Artisanat d’Afrique de l’Ouest vendu en ligne.",
                                "address": "Rue 10, Point E",
                                "city": "Dakar",
                                "country": "Sénégal"
                            }
                        }
                    }
                }
            }
        },
        "/companies/{company}/duplicate": {
            "post": {
                "operationId": "companies_duplicate",
                "summary": "Duplique une entreprise dont vous êtes propriétaire : fiche, catégories, logo, favicon et site dédié (quota max_companies).",
                "description": "Vous êtes le fondateur de la copie ; ni les autres gestionnaires, ni les offres, ni les candidatures ne sont copiés. Le site n’est copié que si votre formule inclut un site d’entreprise ; il naît non publié et sans sous-domaine.",
                "tags": [
                    "Entreprises"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "company",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’entreprise",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "201": {
                        "description": "Créé",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "slug": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "description": {
                                                    "type": "string"
                                                },
                                                "contact_email": {
                                                    "type": "string"
                                                },
                                                "contact_phone": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "website_url": {
                                                    "type": "string"
                                                },
                                                "address": {
                                                    "type": "string"
                                                },
                                                "city": {
                                                    "type": "string"
                                                },
                                                "country": {
                                                    "type": "string"
                                                },
                                                "country_code": {
                                                    "type": "string"
                                                },
                                                "logo_url": {
                                                    "type": "string"
                                                },
                                                "favicon_url": {
                                                    "type": "string"
                                                },
                                                "is_owner": {
                                                    "type": "boolean"
                                                },
                                                "category_ids": {
                                                    "type": "array",
                                                    "items": {}
                                                },
                                                "members": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "user_id": {
                                                                "type": "string"
                                                            },
                                                            "name": {
                                                                "type": "string"
                                                            },
                                                            "email": {
                                                                "type": "string"
                                                            },
                                                            "role": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "job_offers_count": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "slug": "sahel-craft-abidjan",
                                        "name": "Sahel Craft Abidjan",
                                        "description": "Artisanat d’Afrique de l’Ouest vendu en ligne.",
                                        "contact_email": "rh@sahelcraft.example",
                                        "contact_phone": null,
                                        "website_url": "https://sahelcraft.example",
                                        "address": "Rue 10, Point E",
                                        "city": "Dakar",
                                        "country": "Sénégal",
                                        "country_code": "SN",
                                        "logo_url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000005.png",
                                        "favicon_url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000006.png",
                                        "is_owner": true,
                                        "category_ids": [],
                                        "members": [
                                            {
                                                "user_id": "01j9z000000000000000000004",
                                                "name": "Awa Diallo",
                                                "email": "awa.diallo@example.com",
                                                "role": "owner"
                                            }
                                        ],
                                        "job_offers_count": 0
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "name": {
                                        "type": "string",
                                        "description": "Nom de la copie (défaut : « <nom> (copie) »)"
                                    }
                                }
                            },
                            "example": {
                                "name": "Sahel Craft Abidjan"
                            }
                        }
                    }
                }
            }
        },
        "/companies/{company}/logo": {
            "put": {
                "operationId": "companies_logo_update",
                "summary": "Définit le logo de l’entreprise (image de la bibliothèque).",
                "description": "",
                "tags": [
                    "Entreprises"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "company",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’entreprise",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "slug": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "description": {
                                                    "type": "string"
                                                },
                                                "contact_email": {
                                                    "type": "string"
                                                },
                                                "contact_phone": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "website_url": {
                                                    "type": "string"
                                                },
                                                "address": {
                                                    "type": "string"
                                                },
                                                "city": {
                                                    "type": "string"
                                                },
                                                "country": {
                                                    "type": "string"
                                                },
                                                "country_code": {
                                                    "type": "string"
                                                },
                                                "logo_url": {
                                                    "type": "string"
                                                },
                                                "favicon_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "is_owner": {
                                                    "type": "boolean"
                                                },
                                                "category_ids": {
                                                    "type": "array",
                                                    "items": {}
                                                },
                                                "members": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "user_id": {
                                                                "type": "string"
                                                            },
                                                            "name": {
                                                                "type": "string"
                                                            },
                                                            "email": {
                                                                "type": "string"
                                                            },
                                                            "role": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "job_offers_count": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "slug": "sahel-craft",
                                        "name": "Sahel Craft",
                                        "description": "Artisanat d’Afrique de l’Ouest vendu en ligne.",
                                        "contact_email": "rh@sahelcraft.example",
                                        "contact_phone": null,
                                        "website_url": "https://sahelcraft.example",
                                        "address": "Rue 10, Point E",
                                        "city": "Dakar",
                                        "country": "Sénégal",
                                        "country_code": "SN",
                                        "logo_url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000005.png",
                                        "favicon_url": null,
                                        "is_owner": true,
                                        "category_ids": [],
                                        "members": [
                                            {
                                                "user_id": "01j9z000000000000000000004",
                                                "name": "Awa Diallo",
                                                "email": "awa.diallo@example.com",
                                                "role": "owner"
                                            }
                                        ],
                                        "job_offers_count": 0
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "media_id": {
                                        "type": "string",
                                        "description": "Identifiant d’une image de la bibliothèque (POST /files)"
                                    }
                                },
                                "required": [
                                    "media_id"
                                ]
                            },
                            "example": {
                                "media_id": "01j9z000000000000000000008"
                            }
                        }
                    }
                }
            },
            "delete": {
                "operationId": "companies_logo_destroy",
                "summary": "Retire le logo de l’entreprise.",
                "description": "",
                "tags": [
                    "Entreprises"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "company",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’entreprise",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Supprimé"
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/companies/{company}/favicon": {
            "put": {
                "operationId": "companies_favicon_update",
                "summary": "Définit la favicon de l’entreprise et de son site (image de la bibliothèque), recompressée si elle dépasse le poids maximal.",
                "description": "Une image trop lourde est réduite : une copie compressée est ajoutée à la bibliothèque.",
                "tags": [
                    "Entreprises"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "company",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’entreprise",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "slug": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "description": {
                                                    "type": "string"
                                                },
                                                "contact_email": {
                                                    "type": "string"
                                                },
                                                "contact_phone": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "website_url": {
                                                    "type": "string"
                                                },
                                                "address": {
                                                    "type": "string"
                                                },
                                                "city": {
                                                    "type": "string"
                                                },
                                                "country": {
                                                    "type": "string"
                                                },
                                                "country_code": {
                                                    "type": "string"
                                                },
                                                "logo_url": {
                                                    "type": "string"
                                                },
                                                "favicon_url": {
                                                    "type": "string"
                                                },
                                                "is_owner": {
                                                    "type": "boolean"
                                                },
                                                "category_ids": {
                                                    "type": "array",
                                                    "items": {}
                                                },
                                                "members": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "user_id": {
                                                                "type": "string"
                                                            },
                                                            "name": {
                                                                "type": "string"
                                                            },
                                                            "email": {
                                                                "type": "string"
                                                            },
                                                            "role": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "job_offers_count": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "slug": "sahel-craft",
                                        "name": "Sahel Craft",
                                        "description": "Artisanat d’Afrique de l’Ouest vendu en ligne.",
                                        "contact_email": "rh@sahelcraft.example",
                                        "contact_phone": null,
                                        "website_url": "https://sahelcraft.example",
                                        "address": "Rue 10, Point E",
                                        "city": "Dakar",
                                        "country": "Sénégal",
                                        "country_code": "SN",
                                        "logo_url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000005.png",
                                        "favicon_url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000006.png",
                                        "is_owner": true,
                                        "category_ids": [],
                                        "members": [
                                            {
                                                "user_id": "01j9z000000000000000000004",
                                                "name": "Awa Diallo",
                                                "email": "awa.diallo@example.com",
                                                "role": "owner"
                                            }
                                        ],
                                        "job_offers_count": 0
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "media_id": {
                                        "type": "string",
                                        "description": "Identifiant d’une image de la bibliothèque (POST /files)"
                                    }
                                },
                                "required": [
                                    "media_id"
                                ]
                            },
                            "example": {
                                "media_id": "01j9z000000000000000000007"
                            }
                        }
                    }
                }
            },
            "delete": {
                "operationId": "companies_favicon_destroy",
                "summary": "Retire la favicon de l’entreprise (son site reprend alors le logo).",
                "description": "",
                "tags": [
                    "Entreprises"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "company",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’entreprise",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Supprimé"
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/companies/{company}/members": {
            "post": {
                "operationId": "companies_members_store",
                "summary": "Ajoute un gestionnaire (compte existant).",
                "description": "",
                "tags": [
                    "Entreprises"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "company",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’entreprise",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "201": {
                        "description": "Créé",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "slug": {
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "type": "string"
                                                },
                                                "description": {
                                                    "type": "string"
                                                },
                                                "contact_email": {
                                                    "type": "string"
                                                },
                                                "contact_phone": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "website_url": {
                                                    "type": "string"
                                                },
                                                "address": {
                                                    "type": "string"
                                                },
                                                "city": {
                                                    "type": "string"
                                                },
                                                "country": {
                                                    "type": "string"
                                                },
                                                "country_code": {
                                                    "type": "string"
                                                },
                                                "logo_url": {
                                                    "type": "string"
                                                },
                                                "favicon_url": {
                                                    "type": "string"
                                                },
                                                "is_owner": {
                                                    "type": "boolean"
                                                },
                                                "category_ids": {
                                                    "type": "array",
                                                    "items": {}
                                                },
                                                "members": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "user_id": {
                                                                "type": "string"
                                                            },
                                                            "name": {
                                                                "type": "string"
                                                            },
                                                            "email": {
                                                                "type": "string"
                                                            },
                                                            "role": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "job_offers_count": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "slug": "sahel-craft",
                                        "name": "Sahel Craft",
                                        "description": "Artisanat d’Afrique de l’Ouest vendu en ligne.",
                                        "contact_email": "rh@sahelcraft.example",
                                        "contact_phone": null,
                                        "website_url": "https://sahelcraft.example",
                                        "address": "Rue 10, Point E",
                                        "city": "Dakar",
                                        "country": "Sénégal",
                                        "country_code": "SN",
                                        "logo_url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000005.png",
                                        "favicon_url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000006.png",
                                        "is_owner": true,
                                        "category_ids": [],
                                        "members": [
                                            {
                                                "user_id": "01j9z000000000000000000004",
                                                "name": "Awa Diallo",
                                                "email": "awa.diallo@example.com",
                                                "role": "owner"
                                            },
                                            {
                                                "user_id": "01j9z000000000000000000009",
                                                "name": "Moussa Ndiaye",
                                                "email": "moussa.ndiaye@example.com",
                                                "role": "manager"
                                            }
                                        ],
                                        "job_offers_count": 0
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "email": {
                                        "type": "string",
                                        "description": "E-mail du compte"
                                    },
                                    "role": {
                                        "type": "string",
                                        "enum": [
                                            "manager",
                                            "owner"
                                        ],
                                        "description": "Rôle"
                                    }
                                },
                                "required": [
                                    "email",
                                    "role"
                                ]
                            },
                            "example": {
                                "email": "moussa.ndiaye@example.com",
                                "role": "manager"
                            }
                        }
                    }
                }
            }
        },
        "/companies/{company}/members/{user}": {
            "delete": {
                "operationId": "companies_members_destroy",
                "summary": "Retire un gestionnaire (pas le fondateur).",
                "description": "",
                "tags": [
                    "Entreprises"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "company",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’entreprise",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "user",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant de l’utilisateur",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Supprimé"
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/companies/{company}/site": {
            "post": {
                "operationId": "companies_site_store",
                "summary": "Crée le site dédié ; son contenu se gère ensuite via les routes portfolios (portfolio_id).",
                "description": "",
                "tags": [
                    "Entreprises"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "company",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’entreprise",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "201": {
                        "description": "Créé",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "portfolio_id": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "portfolio_id": "01j9z000000000000000000010"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "locale": {
                                        "type": "string",
                                        "enum": [
                                            "fr",
                                            "en"
                                        ],
                                        "description": "Langue du site"
                                    }
                                },
                                "required": [
                                    "locale"
                                ]
                            },
                            "example": {
                                "locale": "fr"
                            }
                        }
                    }
                }
            }
        },
        "/companies/{company}/offers": {
            "get": {
                "operationId": "companies_offers_index",
                "summary": "Offres de l’entreprise.",
                "description": "",
                "tags": [
                    "Offres d’emploi"
                ],
                "x-required-scope": "read",
                "parameters": [
                    {
                        "name": "company",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’entreprise",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Numéro de page (défaut 1)",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Éléments par page (1 à 100, défaut 25)",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "slug": {
                                                        "type": "string"
                                                    },
                                                    "title": {
                                                        "type": "string"
                                                    },
                                                    "description": {
                                                        "type": "string"
                                                    },
                                                    "description_text": {
                                                        "type": "string"
                                                    },
                                                    "requirements": {
                                                        "type": "array",
                                                        "items": {
                                                            "type": "string"
                                                        }
                                                    },
                                                    "required_documents": {
                                                        "type": "array",
                                                        "items": {
                                                            "type": "string"
                                                        }
                                                    },
                                                    "positions_count": {
                                                        "type": "integer"
                                                    },
                                                    "experience_required_years": {
                                                        "type": "integer"
                                                    },
                                                    "experience_recommended_years": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "workplace_type": {
                                                        "type": "string"
                                                    },
                                                    "contract_type": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "location_address": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "region": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "postal_code": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "salary_min": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "salary_max": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "salary_currency": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "salary_period": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "city": {
                                                        "type": "string"
                                                    },
                                                    "country": {
                                                        "type": "string"
                                                    },
                                                    "country_code": {
                                                        "type": "string"
                                                    },
                                                    "contact_email": {
                                                        "type": "string"
                                                    },
                                                    "contact_phone": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "deadline_at": {
                                                        "type": "string"
                                                    },
                                                    "is_active": {
                                                        "type": "boolean"
                                                    },
                                                    "closed_at": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "category_ids": {
                                                        "type": "array",
                                                        "items": {}
                                                    },
                                                    "applications_count": {
                                                        "type": "integer"
                                                    },
                                                    "created_at": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        },
                                        "links": {
                                            "type": "object",
                                            "properties": {
                                                "first": {
                                                    "type": "string"
                                                },
                                                "last": {
                                                    "type": "string"
                                                },
                                                "prev": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "next": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "current_page": {
                                                    "type": "integer"
                                                },
                                                "from": {
                                                    "type": "integer"
                                                },
                                                "last_page": {
                                                    "type": "integer"
                                                },
                                                "links": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "url": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "label": {
                                                                "type": "string"
                                                            },
                                                            "page": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "active": {
                                                                "type": "boolean"
                                                            }
                                                        }
                                                    }
                                                },
                                                "path": {
                                                    "type": "string"
                                                },
                                                "per_page": {
                                                    "type": "integer"
                                                },
                                                "to": {
                                                    "type": "integer"
                                                },
                                                "total": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": [
                                        {
                                            "slug": "developpeurse-backend-laravel",
                                            "title": "Développeur·se backend Laravel",
                                            "description": "<p>Vous rejoignez l’équipe produit pour faire évoluer notre plateforme e-commerce.</p>\n<h3>Vos missions</h3>\n<ul><li>Concevoir des API Laravel</li>\n<li>Relire le code de l’équipe</li>\n</ul>",
                                            "description_text": "Vous rejoignez l’équipe produit pour faire évoluer notre plateforme e-commerce. Vos missions Concevoir des API Laravel Relire le code de l’équipe",
                                            "requirements": [
                                                "PHP 8",
                                                "Laravel"
                                            ],
                                            "required_documents": [
                                                "cv",
                                                "cover_letter"
                                            ],
                                            "positions_count": 2,
                                            "experience_required_years": 2,
                                            "experience_recommended_years": null,
                                            "workplace_type": "hybrid",
                                            "contract_type": null,
                                            "location_address": null,
                                            "region": null,
                                            "postal_code": null,
                                            "salary_min": null,
                                            "salary_max": null,
                                            "salary_currency": null,
                                            "salary_period": null,
                                            "city": "Dakar",
                                            "country": "Sénégal",
                                            "country_code": "SN",
                                            "contact_email": "rh@sahelcraft.example",
                                            "contact_phone": null,
                                            "deadline_at": "2026-10-31",
                                            "is_active": true,
                                            "closed_at": null,
                                            "category_ids": [],
                                            "applications_count": 0,
                                            "created_at": "2026-09-15T09:30:00+00:00"
                                        }
                                    ],
                                    "links": {
                                        "first": "https://middlefolio.online/api/v1/companies/sahel-craft/offers?page=1",
                                        "last": "https://middlefolio.online/api/v1/companies/sahel-craft/offers?page=1",
                                        "prev": null,
                                        "next": null
                                    },
                                    "meta": {
                                        "current_page": 1,
                                        "from": 1,
                                        "last_page": 1,
                                        "links": [
                                            {
                                                "url": null,
                                                "label": "&laquo; Précédent",
                                                "page": null,
                                                "active": false
                                            },
                                            {
                                                "url": "https://middlefolio.online/api/v1/companies/sahel-craft/offers?page=1",
                                                "label": "1",
                                                "page": 1,
                                                "active": true
                                            }
                                        ],
                                        "path": "https://middlefolio.online/api/v1/companies/sahel-craft/offers",
                                        "per_page": 25,
                                        "to": 1,
                                        "total": 1
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            },
            "post": {
                "operationId": "companies_offers_store",
                "summary": "Publie une offre.",
                "description": "",
                "tags": [
                    "Offres d’emploi"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "company",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’entreprise",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "201": {
                        "description": "Créé",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "slug": {
                                                    "type": "string"
                                                },
                                                "title": {
                                                    "type": "string"
                                                },
                                                "description": {
                                                    "type": "string"
                                                },
                                                "description_text": {
                                                    "type": "string"
                                                },
                                                "requirements": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "required_documents": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "positions_count": {
                                                    "type": "integer"
                                                },
                                                "experience_required_years": {
                                                    "type": "integer"
                                                },
                                                "experience_recommended_years": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "workplace_type": {
                                                    "type": "string"
                                                },
                                                "contract_type": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "location_address": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "region": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "postal_code": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_min": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_max": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_currency": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_period": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "city": {
                                                    "type": "string"
                                                },
                                                "country": {
                                                    "type": "string"
                                                },
                                                "country_code": {
                                                    "type": "string"
                                                },
                                                "contact_email": {
                                                    "type": "string"
                                                },
                                                "contact_phone": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "deadline_at": {
                                                    "type": "string"
                                                },
                                                "is_active": {
                                                    "type": "boolean"
                                                },
                                                "closed_at": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "category_ids": {
                                                    "type": "array",
                                                    "items": {}
                                                },
                                                "applications_count": {
                                                    "type": "integer"
                                                },
                                                "created_at": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "slug": "developpeurse-backend-laravel",
                                        "title": "Développeur·se backend Laravel",
                                        "description": "<p>Vous rejoignez l’équipe produit pour faire évoluer notre plateforme e-commerce.</p>\n<h3>Vos missions</h3>\n<ul><li>Concevoir des API Laravel</li>\n<li>Relire le code de l’équipe</li>\n</ul>",
                                        "description_text": "Vous rejoignez l’équipe produit pour faire évoluer notre plateforme e-commerce. Vos missions Concevoir des API Laravel Relire le code de l’équipe",
                                        "requirements": [
                                            "PHP 8",
                                            "Laravel"
                                        ],
                                        "required_documents": [
                                            "cv",
                                            "cover_letter"
                                        ],
                                        "positions_count": 2,
                                        "experience_required_years": 2,
                                        "experience_recommended_years": null,
                                        "workplace_type": "hybrid",
                                        "contract_type": null,
                                        "location_address": null,
                                        "region": null,
                                        "postal_code": null,
                                        "salary_min": null,
                                        "salary_max": null,
                                        "salary_currency": null,
                                        "salary_period": null,
                                        "city": "Dakar",
                                        "country": "Sénégal",
                                        "country_code": "SN",
                                        "contact_email": "rh@sahelcraft.example",
                                        "contact_phone": null,
                                        "deadline_at": "2026-10-31",
                                        "is_active": true,
                                        "closed_at": null,
                                        "category_ids": [],
                                        "applications_count": 0,
                                        "created_at": "2026-09-15T09:30:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "title": {
                                        "type": "string",
                                        "description": "Intitulé"
                                    },
                                    "description": {
                                        "type": "string",
                                        "description": "Description détaillée : HTML (p, br, h2-h4, strong, em, u, s, ul, ol, li, blockquote, hr, a ; le reste est retiré) ou texte brut (lignes « - » = puces), converti en HTML. Renvoyée en HTML, avec description_text en texte brut"
                                    },
                                    "positions_count": {
                                        "type": "integer",
                                        "description": "Nombre de postes (1 à 100)"
                                    },
                                    "contact_email": {
                                        "type": "string",
                                        "description": "E-mail de contact"
                                    },
                                    "workplace_type": {
                                        "type": "string",
                                        "enum": [
                                            "remote",
                                            "on_site",
                                            "hybrid"
                                        ],
                                        "description": "Lieu de travail"
                                    },
                                    "contract_type": {
                                        "type": "string",
                                        "enum": [
                                            "cdi",
                                            "cdd",
                                            "interim",
                                            "professional_internship",
                                            "internship",
                                            "apprenticeship",
                                            "freelance",
                                            "partner",
                                            "volunteer"
                                        ],
                                        "description": "Type de contrat"
                                    },
                                    "requirements": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Prérequis"
                                    },
                                    "category_ids": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Identifiants de catégories (GET /categories)"
                                    },
                                    "deadline_at": {
                                        "type": "string",
                                        "description": "Date limite (AAAA-MM-JJ)"
                                    },
                                    "experience_required_years": {
                                        "type": "integer",
                                        "description": "Années d’expérience exigées"
                                    },
                                    "experience_recommended_years": {
                                        "type": "integer",
                                        "description": "Années recommandées (≥ exigées)"
                                    },
                                    "contact_phone": {
                                        "type": "string",
                                        "description": "Téléphone"
                                    },
                                    "location_address": {
                                        "type": "string",
                                        "description": "Adresse du lieu"
                                    },
                                    "region": {
                                        "type": "string",
                                        "description": "Région, état ou province"
                                    },
                                    "postal_code": {
                                        "type": "string",
                                        "description": "Code postal"
                                    },
                                    "salary_min": {
                                        "type": "integer",
                                        "description": "Salaire de base minimum (entier, sans décimales)"
                                    },
                                    "salary_max": {
                                        "type": "integer",
                                        "description": "Salaire de base maximum (≥ minimum)"
                                    },
                                    "salary_currency": {
                                        "type": "string",
                                        "enum": [
                                            "XAF",
                                            "XOF",
                                            "EUR",
                                            "USD",
                                            "GBP",
                                            "CAD",
                                            "AOA",
                                            "BIF",
                                            "BWP",
                                            "CDF",
                                            "CVE",
                                            "DJF",
                                            "DZD",
                                            "EGP",
                                            "ERN",
                                            "ETB",
                                            "GHS",
                                            "GMD",
                                            "GNF",
                                            "KES",
                                            "KMF",
                                            "LRD",
                                            "LSL",
                                            "LYD",
                                            "MAD",
                                            "MGA",
                                            "MRU",
                                            "MUR",
                                            "MWK",
                                            "MZN",
                                            "NAD",
                                            "NGN",
                                            "RWF",
                                            "SCR",
                                            "SDG",
                                            "SLE",
                                            "SOS",
                                            "SSP",
                                            "STN",
                                            "SZL",
                                            "TND",
                                            "TZS",
                                            "UGX",
                                            "ZAR",
                                            "ZMW",
                                            "ZWG"
                                        ],
                                        "description": "Devise du salaire, code ISO 4217 (défaut : XAF)"
                                    },
                                    "salary_period": {
                                        "type": "string",
                                        "enum": [
                                            "hour",
                                            "day",
                                            "week",
                                            "month",
                                            "year"
                                        ],
                                        "description": "Période du salaire (défaut : month)"
                                    },
                                    "city": {
                                        "type": "string",
                                        "description": "Ville"
                                    },
                                    "country": {
                                        "type": "string",
                                        "description": "Pays"
                                    },
                                    "country_code": {
                                        "type": "string",
                                        "description": "Code pays ISO 3166-1 alpha-2 (ex. CM, FR) ; prioritaire sur country"
                                    },
                                    "required_documents": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Pièces demandées : cv, portfolio, cover_letter, diploma, id_card, certificate (défaut : cv)"
                                    }
                                },
                                "required": [
                                    "title",
                                    "description",
                                    "positions_count",
                                    "contact_email",
                                    "workplace_type"
                                ]
                            },
                            "example": {
                                "title": "Développeur·se backend Laravel",
                                "description": "<p>Vous rejoignez l’équipe produit pour faire évoluer notre plateforme e-commerce.</p><h3>Vos missions</h3><ul><li>Concevoir des API Laravel</li><li>Relire le code de l’équipe</li></ul>",
                                "positions_count": 2,
                                "contact_email": "rh@sahelcraft.example",
                                "workplace_type": "hybrid",
                                "requirements": [
                                    "PHP 8",
                                    "Laravel"
                                ],
                                "deadline_at": "2026-10-31",
                                "experience_required_years": 2,
                                "city": "Dakar",
                                "country": "Sénégal",
                                "required_documents": [
                                    "cv",
                                    "cover_letter"
                                ]
                            }
                        }
                    }
                }
            }
        },
        "/companies/{company}/offers/{jobOffer}": {
            "get": {
                "operationId": "companies_offers_show",
                "summary": "Détail d’une offre.",
                "description": "",
                "tags": [
                    "Offres d’emploi"
                ],
                "x-required-scope": "read",
                "parameters": [
                    {
                        "name": "company",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’entreprise",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "jobOffer",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’offre",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "slug": {
                                                    "type": "string"
                                                },
                                                "title": {
                                                    "type": "string"
                                                },
                                                "description": {
                                                    "type": "string"
                                                },
                                                "description_text": {
                                                    "type": "string"
                                                },
                                                "requirements": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "required_documents": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "positions_count": {
                                                    "type": "integer"
                                                },
                                                "experience_required_years": {
                                                    "type": "integer"
                                                },
                                                "experience_recommended_years": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "workplace_type": {
                                                    "type": "string"
                                                },
                                                "contract_type": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "location_address": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "region": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "postal_code": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_min": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_max": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_currency": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_period": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "city": {
                                                    "type": "string"
                                                },
                                                "country": {
                                                    "type": "string"
                                                },
                                                "country_code": {
                                                    "type": "string"
                                                },
                                                "contact_email": {
                                                    "type": "string"
                                                },
                                                "contact_phone": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "deadline_at": {
                                                    "type": "string"
                                                },
                                                "is_active": {
                                                    "type": "boolean"
                                                },
                                                "closed_at": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "category_ids": {
                                                    "type": "array",
                                                    "items": {}
                                                },
                                                "applications_count": {
                                                    "type": "integer"
                                                },
                                                "created_at": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "slug": "developpeurse-backend-laravel",
                                        "title": "Développeur·se backend Laravel",
                                        "description": "<p>Vous rejoignez l’équipe produit pour faire évoluer notre plateforme e-commerce.</p>\n<h3>Vos missions</h3>\n<ul><li>Concevoir des API Laravel</li>\n<li>Relire le code de l’équipe</li>\n</ul>",
                                        "description_text": "Vous rejoignez l’équipe produit pour faire évoluer notre plateforme e-commerce. Vos missions Concevoir des API Laravel Relire le code de l’équipe",
                                        "requirements": [
                                            "PHP 8",
                                            "Laravel"
                                        ],
                                        "required_documents": [
                                            "cv",
                                            "cover_letter"
                                        ],
                                        "positions_count": 2,
                                        "experience_required_years": 2,
                                        "experience_recommended_years": null,
                                        "workplace_type": "hybrid",
                                        "contract_type": null,
                                        "location_address": null,
                                        "region": null,
                                        "postal_code": null,
                                        "salary_min": null,
                                        "salary_max": null,
                                        "salary_currency": null,
                                        "salary_period": null,
                                        "city": "Dakar",
                                        "country": "Sénégal",
                                        "country_code": "SN",
                                        "contact_email": "rh@sahelcraft.example",
                                        "contact_phone": null,
                                        "deadline_at": "2026-10-31",
                                        "is_active": true,
                                        "closed_at": null,
                                        "category_ids": [],
                                        "applications_count": 0,
                                        "created_at": "2026-09-15T09:30:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            },
            "patch": {
                "operationId": "companies_offers_update",
                "summary": "Modifie une offre (is_active: false la clôture).",
                "description": "Mise à jour partielle : n’envoyez que les champs à changer, les autres restent inchangés (null ou une chaîne vide efface un champ facultatif). Un objet est fusionné clé par clé, une liste est remplacée en entier.",
                "tags": [
                    "Offres d’emploi"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "company",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’entreprise",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "jobOffer",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’offre",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "slug": {
                                                    "type": "string"
                                                },
                                                "title": {
                                                    "type": "string"
                                                },
                                                "description": {
                                                    "type": "string"
                                                },
                                                "description_text": {
                                                    "type": "string"
                                                },
                                                "requirements": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "required_documents": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "positions_count": {
                                                    "type": "integer"
                                                },
                                                "experience_required_years": {
                                                    "type": "integer"
                                                },
                                                "experience_recommended_years": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "workplace_type": {
                                                    "type": "string"
                                                },
                                                "contract_type": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "location_address": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "region": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "postal_code": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_min": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_max": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_currency": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_period": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "city": {
                                                    "type": "string"
                                                },
                                                "country": {
                                                    "type": "string"
                                                },
                                                "country_code": {
                                                    "type": "string"
                                                },
                                                "contact_email": {
                                                    "type": "string"
                                                },
                                                "contact_phone": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "deadline_at": {
                                                    "type": "string"
                                                },
                                                "is_active": {
                                                    "type": "boolean"
                                                },
                                                "closed_at": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "category_ids": {
                                                    "type": "array",
                                                    "items": {}
                                                },
                                                "applications_count": {
                                                    "type": "integer"
                                                },
                                                "created_at": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "slug": "developpeurse-backend-laravel",
                                        "title": "Développeur·se backend Laravel",
                                        "description": "<p>Vous rejoignez l’équipe produit pour faire évoluer notre plateforme e-commerce.</p>\n<h3>Vos missions</h3>\n<ul><li>Concevoir des API Laravel</li>\n<li>Relire le code de l’équipe</li>\n</ul>",
                                        "description_text": "Vous rejoignez l’équipe produit pour faire évoluer notre plateforme e-commerce. Vos missions Concevoir des API Laravel Relire le code de l’équipe",
                                        "requirements": [
                                            "PHP 8",
                                            "Laravel"
                                        ],
                                        "required_documents": [
                                            "cv",
                                            "cover_letter"
                                        ],
                                        "positions_count": 3,
                                        "experience_required_years": 2,
                                        "experience_recommended_years": null,
                                        "workplace_type": "hybrid",
                                        "contract_type": null,
                                        "location_address": null,
                                        "region": null,
                                        "postal_code": null,
                                        "salary_min": null,
                                        "salary_max": null,
                                        "salary_currency": null,
                                        "salary_period": null,
                                        "city": "Dakar",
                                        "country": "Sénégal",
                                        "country_code": "SN",
                                        "contact_email": "rh@sahelcraft.example",
                                        "contact_phone": null,
                                        "deadline_at": "2026-10-31",
                                        "is_active": true,
                                        "closed_at": null,
                                        "category_ids": [],
                                        "applications_count": 0,
                                        "created_at": "2026-09-15T09:30:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "title": {
                                        "type": "string",
                                        "description": "Intitulé"
                                    },
                                    "description": {
                                        "type": "string",
                                        "description": "Description détaillée : HTML (p, br, h2-h4, strong, em, u, s, ul, ol, li, blockquote, hr, a ; le reste est retiré) ou texte brut (lignes « - » = puces), converti en HTML. Renvoyée en HTML, avec description_text en texte brut"
                                    },
                                    "positions_count": {
                                        "type": "integer",
                                        "description": "Nombre de postes (1 à 100)"
                                    },
                                    "contact_email": {
                                        "type": "string",
                                        "description": "E-mail de contact"
                                    },
                                    "workplace_type": {
                                        "type": "string",
                                        "enum": [
                                            "remote",
                                            "on_site",
                                            "hybrid"
                                        ],
                                        "description": "Lieu de travail"
                                    },
                                    "contract_type": {
                                        "type": "string",
                                        "enum": [
                                            "cdi",
                                            "cdd",
                                            "interim",
                                            "professional_internship",
                                            "internship",
                                            "apprenticeship",
                                            "freelance",
                                            "partner",
                                            "volunteer"
                                        ],
                                        "description": "Type de contrat"
                                    },
                                    "requirements": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Prérequis"
                                    },
                                    "category_ids": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Identifiants de catégories (GET /categories)"
                                    },
                                    "deadline_at": {
                                        "type": "string",
                                        "description": "Date limite (AAAA-MM-JJ)"
                                    },
                                    "experience_required_years": {
                                        "type": "integer",
                                        "description": "Années d’expérience exigées"
                                    },
                                    "experience_recommended_years": {
                                        "type": "integer",
                                        "description": "Années recommandées (≥ exigées)"
                                    },
                                    "contact_phone": {
                                        "type": "string",
                                        "description": "Téléphone"
                                    },
                                    "location_address": {
                                        "type": "string",
                                        "description": "Adresse du lieu"
                                    },
                                    "region": {
                                        "type": "string",
                                        "description": "Région, état ou province"
                                    },
                                    "postal_code": {
                                        "type": "string",
                                        "description": "Code postal"
                                    },
                                    "salary_min": {
                                        "type": "integer",
                                        "description": "Salaire de base minimum (entier, sans décimales)"
                                    },
                                    "salary_max": {
                                        "type": "integer",
                                        "description": "Salaire de base maximum (≥ minimum)"
                                    },
                                    "salary_currency": {
                                        "type": "string",
                                        "enum": [
                                            "XAF",
                                            "XOF",
                                            "EUR",
                                            "USD",
                                            "GBP",
                                            "CAD",
                                            "AOA",
                                            "BIF",
                                            "BWP",
                                            "CDF",
                                            "CVE",
                                            "DJF",
                                            "DZD",
                                            "EGP",
                                            "ERN",
                                            "ETB",
                                            "GHS",
                                            "GMD",
                                            "GNF",
                                            "KES",
                                            "KMF",
                                            "LRD",
                                            "LSL",
                                            "LYD",
                                            "MAD",
                                            "MGA",
                                            "MRU",
                                            "MUR",
                                            "MWK",
                                            "MZN",
                                            "NAD",
                                            "NGN",
                                            "RWF",
                                            "SCR",
                                            "SDG",
                                            "SLE",
                                            "SOS",
                                            "SSP",
                                            "STN",
                                            "SZL",
                                            "TND",
                                            "TZS",
                                            "UGX",
                                            "ZAR",
                                            "ZMW",
                                            "ZWG"
                                        ],
                                        "description": "Devise du salaire, code ISO 4217 (défaut : XAF)"
                                    },
                                    "salary_period": {
                                        "type": "string",
                                        "enum": [
                                            "hour",
                                            "day",
                                            "week",
                                            "month",
                                            "year"
                                        ],
                                        "description": "Période du salaire (défaut : month)"
                                    },
                                    "city": {
                                        "type": "string",
                                        "description": "Ville"
                                    },
                                    "country": {
                                        "type": "string",
                                        "description": "Pays"
                                    },
                                    "country_code": {
                                        "type": "string",
                                        "description": "Code pays ISO 3166-1 alpha-2 (ex. CM, FR) ; prioritaire sur country"
                                    },
                                    "required_documents": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Pièces demandées : cv, portfolio, cover_letter, diploma, id_card, certificate (défaut : cv)"
                                    },
                                    "is_active": {
                                        "type": "boolean",
                                        "description": "Offre ouverte"
                                    }
                                }
                            },
                            "example": {
                                "title": "Développeur·se backend Laravel",
                                "description": "<p>Vous rejoignez l’équipe produit pour faire évoluer notre plateforme e-commerce.</p><h3>Vos missions</h3><ul><li>Concevoir des API Laravel</li><li>Relire le code de l’équipe</li></ul>",
                                "positions_count": 3,
                                "contact_email": "rh@sahelcraft.example",
                                "workplace_type": "hybrid",
                                "requirements": [
                                    "PHP 8",
                                    "Laravel"
                                ],
                                "deadline_at": "2026-10-31",
                                "experience_required_years": 2,
                                "city": "Dakar",
                                "country": "Sénégal",
                                "required_documents": [
                                    "cv",
                                    "cover_letter"
                                ],
                                "is_active": true
                            }
                        }
                    }
                }
            },
            "delete": {
                "operationId": "companies_offers_destroy",
                "summary": "Archive l’offre.",
                "description": "",
                "tags": [
                    "Offres d’emploi"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "company",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’entreprise",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "jobOffer",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’offre",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Supprimé"
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/external-offers": {
            "get": {
                "operationId": "external_offers_index",
                "summary": "Offres externes que vous avez soumises (tous statuts).",
                "description": "",
                "tags": [
                    "Offres externes"
                ],
                "x-required-scope": "read",
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Numéro de page (défaut 1)",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Éléments par page (1 à 100, défaut 25)",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "slug": {
                                                        "type": "string"
                                                    },
                                                    "title": {
                                                        "type": "string"
                                                    },
                                                    "description": {
                                                        "type": "string"
                                                    },
                                                    "description_text": {
                                                        "type": "string"
                                                    },
                                                    "company_name": {
                                                        "type": "string"
                                                    },
                                                    "company_website_url": {
                                                        "type": "string"
                                                    },
                                                    "apply_url": {
                                                        "type": "string"
                                                    },
                                                    "logo_url": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "requirements": {
                                                        "type": "array",
                                                        "items": {
                                                            "type": "string"
                                                        }
                                                    },
                                                    "required_documents": {
                                                        "type": "array",
                                                        "items": {
                                                            "type": "string"
                                                        }
                                                    },
                                                    "positions_count": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "experience_required_years": {
                                                        "type": "integer"
                                                    },
                                                    "experience_recommended_years": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "contact_email": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "contact_phone": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "location_address": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "region": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "postal_code": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "salary_min": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "salary_max": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "salary_currency": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "salary_period": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "complementary_document": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "category_ids": {
                                                        "type": "array",
                                                        "items": {}
                                                    },
                                                    "workplace_type": {
                                                        "type": "string"
                                                    },
                                                    "contract_type": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "city": {
                                                        "type": "string"
                                                    },
                                                    "country": {
                                                        "type": "string"
                                                    },
                                                    "country_code": {
                                                        "type": "string"
                                                    },
                                                    "deadline_at": {
                                                        "type": "string"
                                                    },
                                                    "status": {
                                                        "type": "string"
                                                    },
                                                    "rejection_reason": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "reviewed_at": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "created_at": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        },
                                        "links": {
                                            "type": "object",
                                            "properties": {
                                                "first": {
                                                    "type": "string"
                                                },
                                                "last": {
                                                    "type": "string"
                                                },
                                                "prev": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "next": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "current_page": {
                                                    "type": "integer"
                                                },
                                                "from": {
                                                    "type": "integer"
                                                },
                                                "last_page": {
                                                    "type": "integer"
                                                },
                                                "links": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "url": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "label": {
                                                                "type": "string"
                                                            },
                                                            "page": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "active": {
                                                                "type": "boolean"
                                                            }
                                                        }
                                                    }
                                                },
                                                "path": {
                                                    "type": "string"
                                                },
                                                "per_page": {
                                                    "type": "integer"
                                                },
                                                "to": {
                                                    "type": "integer"
                                                },
                                                "total": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": [
                                        {
                                            "slug": "designer-produit",
                                            "title": "Designer produit",
                                            "description": "<p>Offre relayée depuis le site de l’entreprise.</p>",
                                            "description_text": "Offre relayée depuis le site de l’entreprise.",
                                            "company_name": "Studio Baobab",
                                            "company_website_url": "https://baobab.example",
                                            "apply_url": "https://baobab.example/jobs/designer-produit",
                                            "logo_url": null,
                                            "requirements": [
                                                "Figma",
                                                "Design system"
                                            ],
                                            "required_documents": [
                                                "cv",
                                                "portfolio"
                                            ],
                                            "positions_count": null,
                                            "experience_required_years": 2,
                                            "experience_recommended_years": null,
                                            "contact_email": null,
                                            "contact_phone": null,
                                            "location_address": null,
                                            "region": null,
                                            "postal_code": null,
                                            "salary_min": null,
                                            "salary_max": null,
                                            "salary_currency": null,
                                            "salary_period": null,
                                            "complementary_document": null,
                                            "category_ids": [],
                                            "workplace_type": "remote",
                                            "contract_type": null,
                                            "city": "Abidjan",
                                            "country": "Côte d’Ivoire",
                                            "country_code": "CI",
                                            "deadline_at": "2026-10-31",
                                            "status": "pending",
                                            "rejection_reason": null,
                                            "reviewed_at": null,
                                            "created_at": "2026-09-15T09:30:00+00:00"
                                        }
                                    ],
                                    "links": {
                                        "first": "https://middlefolio.online/api/v1/external-offers?page=1",
                                        "last": "https://middlefolio.online/api/v1/external-offers?page=1",
                                        "prev": null,
                                        "next": null
                                    },
                                    "meta": {
                                        "current_page": 1,
                                        "from": 1,
                                        "last_page": 1,
                                        "links": [
                                            {
                                                "url": null,
                                                "label": "&laquo; Précédent",
                                                "page": null,
                                                "active": false
                                            },
                                            {
                                                "url": "https://middlefolio.online/api/v1/external-offers?page=1",
                                                "label": "1",
                                                "page": 1,
                                                "active": true
                                            }
                                        ],
                                        "path": "https://middlefolio.online/api/v1/external-offers",
                                        "per_page": 25,
                                        "to": 1,
                                        "total": 1
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            },
            "post": {
                "operationId": "external_offers_store",
                "summary": "Soumet une offre publiée ailleurs (candidature hors plateforme).",
                "description": "Sans is_draft, l’offre naît « pending » : elle n’est visible publiquement qu’après validation par un administrateur (status « approved »), ou immédiatement si le titulaire de la clé est administrateur. Avec is_draft, elle reste « draft » (privée) jusqu’à ce que vous la soumettiez (modification avec is_draft: false).",
                "tags": [
                    "Offres externes"
                ],
                "x-required-scope": "write",
                "parameters": [],
                "responses": {
                    "201": {
                        "description": "Créé",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "slug": {
                                                    "type": "string"
                                                },
                                                "title": {
                                                    "type": "string"
                                                },
                                                "description": {
                                                    "type": "string"
                                                },
                                                "description_text": {
                                                    "type": "string"
                                                },
                                                "company_name": {
                                                    "type": "string"
                                                },
                                                "company_website_url": {
                                                    "type": "string"
                                                },
                                                "apply_url": {
                                                    "type": "string"
                                                },
                                                "logo_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "requirements": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "required_documents": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "positions_count": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "experience_required_years": {
                                                    "type": "integer"
                                                },
                                                "experience_recommended_years": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "contact_email": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "contact_phone": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "location_address": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "region": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "postal_code": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_min": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_max": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_currency": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_period": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "complementary_document": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "category_ids": {
                                                    "type": "array",
                                                    "items": {}
                                                },
                                                "workplace_type": {
                                                    "type": "string"
                                                },
                                                "contract_type": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "city": {
                                                    "type": "string"
                                                },
                                                "country": {
                                                    "type": "string"
                                                },
                                                "country_code": {
                                                    "type": "string"
                                                },
                                                "deadline_at": {
                                                    "type": "string"
                                                },
                                                "status": {
                                                    "type": "string"
                                                },
                                                "rejection_reason": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "reviewed_at": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "created_at": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "slug": "designer-produit",
                                        "title": "Designer produit",
                                        "description": "<p>Offre relayée depuis le site de l’entreprise.</p>",
                                        "description_text": "Offre relayée depuis le site de l’entreprise.",
                                        "company_name": "Studio Baobab",
                                        "company_website_url": "https://baobab.example",
                                        "apply_url": "https://baobab.example/jobs/designer-produit",
                                        "logo_url": null,
                                        "requirements": [
                                            "Figma",
                                            "Design system"
                                        ],
                                        "required_documents": [
                                            "cv",
                                            "portfolio"
                                        ],
                                        "positions_count": null,
                                        "experience_required_years": 2,
                                        "experience_recommended_years": null,
                                        "contact_email": null,
                                        "contact_phone": null,
                                        "location_address": null,
                                        "region": null,
                                        "postal_code": null,
                                        "salary_min": null,
                                        "salary_max": null,
                                        "salary_currency": null,
                                        "salary_period": null,
                                        "complementary_document": null,
                                        "category_ids": [],
                                        "workplace_type": "remote",
                                        "contract_type": null,
                                        "city": "Abidjan",
                                        "country": "Côte d’Ivoire",
                                        "country_code": "CI",
                                        "deadline_at": "2026-10-31",
                                        "status": "pending",
                                        "rejection_reason": null,
                                        "reviewed_at": null,
                                        "created_at": "2026-09-15T09:30:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "title": {
                                        "type": "string",
                                        "description": "Intitulé"
                                    },
                                    "description": {
                                        "type": "string",
                                        "description": "Description détaillée : HTML (p, br, h2-h4, strong, em, u, s, ul, ol, li, blockquote, hr, a ; le reste est retiré) ou texte brut (lignes « - » = puces), converti en HTML (50 000 car. max). Renvoyée en HTML, avec description_text en texte brut"
                                    },
                                    "company_name": {
                                        "type": "string",
                                        "description": "Nom de l’entreprise qui recrute"
                                    },
                                    "apply_url": {
                                        "type": "string",
                                        "description": "Lien de soumission (http ou https)"
                                    },
                                    "workplace_type": {
                                        "type": "string",
                                        "enum": [
                                            "remote",
                                            "on_site",
                                            "hybrid"
                                        ],
                                        "description": "Lieu de travail (défaut : on_site)"
                                    },
                                    "contract_type": {
                                        "type": "string",
                                        "enum": [
                                            "cdi",
                                            "cdd",
                                            "interim",
                                            "professional_internship",
                                            "internship",
                                            "apprenticeship",
                                            "freelance",
                                            "partner",
                                            "volunteer"
                                        ],
                                        "description": "Type de contrat"
                                    },
                                    "requirements": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Prérequis (servent au matching avec les portfolios)"
                                    },
                                    "required_documents": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Pièces à fournir à l’entreprise, à titre de consigne affichée : cv, portfolio, cover_letter, diploma, id_card, certificate"
                                    },
                                    "category_ids": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Identifiants de catégories (GET /categories), 6 au plus"
                                    },
                                    "positions_count": {
                                        "type": "integer",
                                        "description": "Nombre de postes (1 à 100)"
                                    },
                                    "experience_required_years": {
                                        "type": "integer",
                                        "description": "Années d’expérience exigées"
                                    },
                                    "experience_recommended_years": {
                                        "type": "integer",
                                        "description": "Années recommandées (≥ exigées)"
                                    },
                                    "contact_email": {
                                        "type": "string",
                                        "description": "E-mail de contact"
                                    },
                                    "contact_phone": {
                                        "type": "string",
                                        "description": "Téléphone"
                                    },
                                    "location_address": {
                                        "type": "string",
                                        "description": "Adresse du lieu"
                                    },
                                    "region": {
                                        "type": "string",
                                        "description": "Région, état ou province"
                                    },
                                    "postal_code": {
                                        "type": "string",
                                        "description": "Code postal"
                                    },
                                    "salary_min": {
                                        "type": "integer",
                                        "description": "Salaire de base minimum (entier, sans décimales)"
                                    },
                                    "salary_max": {
                                        "type": "integer",
                                        "description": "Salaire de base maximum (≥ minimum)"
                                    },
                                    "salary_currency": {
                                        "type": "string",
                                        "enum": [
                                            "XAF",
                                            "XOF",
                                            "EUR",
                                            "USD",
                                            "GBP",
                                            "CAD",
                                            "AOA",
                                            "BIF",
                                            "BWP",
                                            "CDF",
                                            "CVE",
                                            "DJF",
                                            "DZD",
                                            "EGP",
                                            "ERN",
                                            "ETB",
                                            "GHS",
                                            "GMD",
                                            "GNF",
                                            "KES",
                                            "KMF",
                                            "LRD",
                                            "LSL",
                                            "LYD",
                                            "MAD",
                                            "MGA",
                                            "MRU",
                                            "MUR",
                                            "MWK",
                                            "MZN",
                                            "NAD",
                                            "NGN",
                                            "RWF",
                                            "SCR",
                                            "SDG",
                                            "SLE",
                                            "SOS",
                                            "SSP",
                                            "STN",
                                            "SZL",
                                            "TND",
                                            "TZS",
                                            "UGX",
                                            "ZAR",
                                            "ZMW",
                                            "ZWG"
                                        ],
                                        "description": "Devise du salaire, code ISO 4217 (défaut : XAF)"
                                    },
                                    "salary_period": {
                                        "type": "string",
                                        "enum": [
                                            "hour",
                                            "day",
                                            "week",
                                            "month",
                                            "year"
                                        ],
                                        "description": "Période du salaire (défaut : month)"
                                    },
                                    "company_website_url": {
                                        "type": "string",
                                        "description": "Site de l’entreprise (http ou https)"
                                    },
                                    "deadline_at": {
                                        "type": "string",
                                        "description": "Date limite (AAAA-MM-JJ)"
                                    },
                                    "city": {
                                        "type": "string",
                                        "description": "Ville"
                                    },
                                    "country": {
                                        "type": "string",
                                        "description": "Pays"
                                    },
                                    "country_code": {
                                        "type": "string",
                                        "description": "Code pays ISO 3166-1 alpha-2 (ex. CM, FR) ; prioritaire sur country"
                                    },
                                    "is_draft": {
                                        "type": "boolean",
                                        "description": "Vrai : enregistre en brouillon, privé et non modéré (défaut : soumise à validation)"
                                    }
                                },
                                "required": [
                                    "title",
                                    "description",
                                    "company_name",
                                    "apply_url"
                                ]
                            },
                            "example": {
                                "title": "Designer produit",
                                "description": "Offre relayée depuis le site de l’entreprise.",
                                "company_name": "Studio Baobab",
                                "apply_url": "https://baobab.example/jobs/designer-produit",
                                "workplace_type": "remote",
                                "company_website_url": "https://baobab.example",
                                "deadline_at": "2026-10-31",
                                "city": "Abidjan",
                                "country": "Côte d’Ivoire",
                                "requirements": [
                                    "Figma",
                                    "Design system"
                                ],
                                "required_documents": [
                                    "cv",
                                    "portfolio"
                                ],
                                "experience_required_years": 2
                            }
                        }
                    }
                }
            }
        },
        "/external-offers/{externalJobOffer}": {
            "get": {
                "operationId": "external_offers_show",
                "summary": "Détail d’une de vos offres externes (statut et motif de rejet inclus).",
                "description": "",
                "tags": [
                    "Offres externes"
                ],
                "x-required-scope": "read",
                "parameters": [
                    {
                        "name": "externalJobOffer",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’offre externe",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "slug": {
                                                    "type": "string"
                                                },
                                                "title": {
                                                    "type": "string"
                                                },
                                                "description": {
                                                    "type": "string"
                                                },
                                                "description_text": {
                                                    "type": "string"
                                                },
                                                "company_name": {
                                                    "type": "string"
                                                },
                                                "company_website_url": {
                                                    "type": "string"
                                                },
                                                "apply_url": {
                                                    "type": "string"
                                                },
                                                "logo_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "requirements": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "required_documents": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "positions_count": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "experience_required_years": {
                                                    "type": "integer"
                                                },
                                                "experience_recommended_years": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "contact_email": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "contact_phone": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "location_address": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "region": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "postal_code": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_min": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_max": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_currency": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_period": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "complementary_document": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "category_ids": {
                                                    "type": "array",
                                                    "items": {}
                                                },
                                                "workplace_type": {
                                                    "type": "string"
                                                },
                                                "contract_type": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "city": {
                                                    "type": "string"
                                                },
                                                "country": {
                                                    "type": "string"
                                                },
                                                "country_code": {
                                                    "type": "string"
                                                },
                                                "deadline_at": {
                                                    "type": "string"
                                                },
                                                "status": {
                                                    "type": "string"
                                                },
                                                "rejection_reason": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "reviewed_at": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "created_at": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "slug": "designer-produit",
                                        "title": "Designer produit",
                                        "description": "<p>Offre relayée depuis le site de l’entreprise.</p>",
                                        "description_text": "Offre relayée depuis le site de l’entreprise.",
                                        "company_name": "Studio Baobab",
                                        "company_website_url": "https://baobab.example",
                                        "apply_url": "https://baobab.example/jobs/designer-produit",
                                        "logo_url": null,
                                        "requirements": [
                                            "Figma",
                                            "Design system"
                                        ],
                                        "required_documents": [
                                            "cv",
                                            "portfolio"
                                        ],
                                        "positions_count": null,
                                        "experience_required_years": 2,
                                        "experience_recommended_years": null,
                                        "contact_email": null,
                                        "contact_phone": null,
                                        "location_address": null,
                                        "region": null,
                                        "postal_code": null,
                                        "salary_min": null,
                                        "salary_max": null,
                                        "salary_currency": null,
                                        "salary_period": null,
                                        "complementary_document": null,
                                        "category_ids": [],
                                        "workplace_type": "remote",
                                        "contract_type": null,
                                        "city": "Abidjan",
                                        "country": "Côte d’Ivoire",
                                        "country_code": "CI",
                                        "deadline_at": "2026-10-31",
                                        "status": "pending",
                                        "rejection_reason": null,
                                        "reviewed_at": null,
                                        "created_at": "2026-09-15T09:30:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            },
            "patch": {
                "operationId": "external_offers_update",
                "summary": "Modifie une de vos offres externes.",
                "description": "Une offre validée ou rejetée repasse « pending » et doit être revalidée (sauf pour un administrateur) ; is_draft: true la renvoie en brouillon, is_draft: false soumet un brouillon. Mise à jour partielle : n’envoyez que les champs à changer, les autres restent inchangés (null ou une chaîne vide efface un champ facultatif). Un objet est fusionné clé par clé, une liste est remplacée en entier.",
                "tags": [
                    "Offres externes"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "externalJobOffer",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’offre externe",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "slug": {
                                                    "type": "string"
                                                },
                                                "title": {
                                                    "type": "string"
                                                },
                                                "description": {
                                                    "type": "string"
                                                },
                                                "description_text": {
                                                    "type": "string"
                                                },
                                                "company_name": {
                                                    "type": "string"
                                                },
                                                "company_website_url": {
                                                    "type": "string"
                                                },
                                                "apply_url": {
                                                    "type": "string"
                                                },
                                                "logo_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "requirements": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "required_documents": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "positions_count": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "experience_required_years": {
                                                    "type": "integer"
                                                },
                                                "experience_recommended_years": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "contact_email": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "contact_phone": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "location_address": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "region": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "postal_code": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_min": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_max": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_currency": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_period": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "complementary_document": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "category_ids": {
                                                    "type": "array",
                                                    "items": {}
                                                },
                                                "workplace_type": {
                                                    "type": "string"
                                                },
                                                "contract_type": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "city": {
                                                    "type": "string"
                                                },
                                                "country": {
                                                    "type": "string"
                                                },
                                                "country_code": {
                                                    "type": "string"
                                                },
                                                "deadline_at": {
                                                    "type": "string"
                                                },
                                                "status": {
                                                    "type": "string"
                                                },
                                                "rejection_reason": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "reviewed_at": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "created_at": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "slug": "designer-produit",
                                        "title": "Designer produit",
                                        "description": "<p>Offre mise à jour.</p>",
                                        "description_text": "Offre mise à jour.",
                                        "company_name": "Studio Baobab",
                                        "company_website_url": "https://baobab.example",
                                        "apply_url": "https://baobab.example/jobs/designer-produit",
                                        "logo_url": null,
                                        "requirements": [
                                            "Figma",
                                            "Design system"
                                        ],
                                        "required_documents": [
                                            "cv",
                                            "portfolio"
                                        ],
                                        "positions_count": null,
                                        "experience_required_years": 2,
                                        "experience_recommended_years": null,
                                        "contact_email": null,
                                        "contact_phone": null,
                                        "location_address": null,
                                        "region": null,
                                        "postal_code": null,
                                        "salary_min": null,
                                        "salary_max": null,
                                        "salary_currency": null,
                                        "salary_period": null,
                                        "complementary_document": null,
                                        "category_ids": [],
                                        "workplace_type": "remote",
                                        "contract_type": null,
                                        "city": "Abidjan",
                                        "country": "Côte d’Ivoire",
                                        "country_code": "CI",
                                        "deadline_at": "2026-10-31",
                                        "status": "pending",
                                        "rejection_reason": null,
                                        "reviewed_at": null,
                                        "created_at": "2026-09-15T09:30:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "title": {
                                        "type": "string",
                                        "description": "Intitulé"
                                    },
                                    "description": {
                                        "type": "string",
                                        "description": "Description détaillée : HTML (p, br, h2-h4, strong, em, u, s, ul, ol, li, blockquote, hr, a ; le reste est retiré) ou texte brut (lignes « - » = puces), converti en HTML (50 000 car. max). Renvoyée en HTML, avec description_text en texte brut"
                                    },
                                    "company_name": {
                                        "type": "string",
                                        "description": "Nom de l’entreprise qui recrute"
                                    },
                                    "apply_url": {
                                        "type": "string",
                                        "description": "Lien de soumission (http ou https)"
                                    },
                                    "workplace_type": {
                                        "type": "string",
                                        "enum": [
                                            "remote",
                                            "on_site",
                                            "hybrid"
                                        ],
                                        "description": "Lieu de travail (défaut : on_site)"
                                    },
                                    "contract_type": {
                                        "type": "string",
                                        "enum": [
                                            "cdi",
                                            "cdd",
                                            "interim",
                                            "professional_internship",
                                            "internship",
                                            "apprenticeship",
                                            "freelance",
                                            "partner",
                                            "volunteer"
                                        ],
                                        "description": "Type de contrat"
                                    },
                                    "requirements": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Prérequis (servent au matching avec les portfolios)"
                                    },
                                    "required_documents": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Pièces à fournir à l’entreprise, à titre de consigne affichée : cv, portfolio, cover_letter, diploma, id_card, certificate"
                                    },
                                    "category_ids": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Identifiants de catégories (GET /categories), 6 au plus"
                                    },
                                    "positions_count": {
                                        "type": "integer",
                                        "description": "Nombre de postes (1 à 100)"
                                    },
                                    "experience_required_years": {
                                        "type": "integer",
                                        "description": "Années d’expérience exigées"
                                    },
                                    "experience_recommended_years": {
                                        "type": "integer",
                                        "description": "Années recommandées (≥ exigées)"
                                    },
                                    "contact_email": {
                                        "type": "string",
                                        "description": "E-mail de contact"
                                    },
                                    "contact_phone": {
                                        "type": "string",
                                        "description": "Téléphone"
                                    },
                                    "location_address": {
                                        "type": "string",
                                        "description": "Adresse du lieu"
                                    },
                                    "region": {
                                        "type": "string",
                                        "description": "Région, état ou province"
                                    },
                                    "postal_code": {
                                        "type": "string",
                                        "description": "Code postal"
                                    },
                                    "salary_min": {
                                        "type": "integer",
                                        "description": "Salaire de base minimum (entier, sans décimales)"
                                    },
                                    "salary_max": {
                                        "type": "integer",
                                        "description": "Salaire de base maximum (≥ minimum)"
                                    },
                                    "salary_currency": {
                                        "type": "string",
                                        "enum": [
                                            "XAF",
                                            "XOF",
                                            "EUR",
                                            "USD",
                                            "GBP",
                                            "CAD",
                                            "AOA",
                                            "BIF",
                                            "BWP",
                                            "CDF",
                                            "CVE",
                                            "DJF",
                                            "DZD",
                                            "EGP",
                                            "ERN",
                                            "ETB",
                                            "GHS",
                                            "GMD",
                                            "GNF",
                                            "KES",
                                            "KMF",
                                            "LRD",
                                            "LSL",
                                            "LYD",
                                            "MAD",
                                            "MGA",
                                            "MRU",
                                            "MUR",
                                            "MWK",
                                            "MZN",
                                            "NAD",
                                            "NGN",
                                            "RWF",
                                            "SCR",
                                            "SDG",
                                            "SLE",
                                            "SOS",
                                            "SSP",
                                            "STN",
                                            "SZL",
                                            "TND",
                                            "TZS",
                                            "UGX",
                                            "ZAR",
                                            "ZMW",
                                            "ZWG"
                                        ],
                                        "description": "Devise du salaire, code ISO 4217 (défaut : XAF)"
                                    },
                                    "salary_period": {
                                        "type": "string",
                                        "enum": [
                                            "hour",
                                            "day",
                                            "week",
                                            "month",
                                            "year"
                                        ],
                                        "description": "Période du salaire (défaut : month)"
                                    },
                                    "company_website_url": {
                                        "type": "string",
                                        "description": "Site de l’entreprise (http ou https)"
                                    },
                                    "deadline_at": {
                                        "type": "string",
                                        "description": "Date limite (AAAA-MM-JJ)"
                                    },
                                    "city": {
                                        "type": "string",
                                        "description": "Ville"
                                    },
                                    "country": {
                                        "type": "string",
                                        "description": "Pays"
                                    },
                                    "country_code": {
                                        "type": "string",
                                        "description": "Code pays ISO 3166-1 alpha-2 (ex. CM, FR) ; prioritaire sur country"
                                    },
                                    "is_draft": {
                                        "type": "boolean",
                                        "description": "Vrai : enregistre en brouillon, privé et non modéré (défaut : soumise à validation)"
                                    }
                                }
                            },
                            "example": {
                                "title": "Designer produit",
                                "description": "Offre mise à jour.",
                                "company_name": "Studio Baobab",
                                "apply_url": "https://baobab.example/jobs/designer-produit",
                                "workplace_type": "remote",
                                "company_website_url": "https://baobab.example",
                                "deadline_at": "2026-10-31",
                                "city": "Abidjan",
                                "country": "Côte d’Ivoire",
                                "requirements": [
                                    "Figma",
                                    "Design system"
                                ],
                                "required_documents": [
                                    "cv",
                                    "portfolio"
                                ],
                                "experience_required_years": 2
                            }
                        }
                    }
                }
            },
            "delete": {
                "operationId": "external_offers_destroy",
                "summary": "Supprime une de vos offres externes.",
                "description": "",
                "tags": [
                    "Offres externes"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "externalJobOffer",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’offre externe",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Supprimé"
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/external-offers/{externalJobOffer}/logo": {
            "put": {
                "operationId": "external_offers_logo_update",
                "summary": "Définit le logo de l’offre (image de la bibliothèque) ; l’offre repasse « pending ».",
                "description": "",
                "tags": [
                    "Offres externes"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "externalJobOffer",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’offre externe",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "slug": {
                                                    "type": "string"
                                                },
                                                "title": {
                                                    "type": "string"
                                                },
                                                "description": {
                                                    "type": "string"
                                                },
                                                "description_text": {
                                                    "type": "string"
                                                },
                                                "company_name": {
                                                    "type": "string"
                                                },
                                                "company_website_url": {
                                                    "type": "string"
                                                },
                                                "apply_url": {
                                                    "type": "string"
                                                },
                                                "logo_url": {
                                                    "type": "string"
                                                },
                                                "requirements": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "required_documents": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "positions_count": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "experience_required_years": {
                                                    "type": "integer"
                                                },
                                                "experience_recommended_years": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "contact_email": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "contact_phone": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "location_address": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "region": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "postal_code": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_min": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_max": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_currency": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_period": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "complementary_document": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "category_ids": {
                                                    "type": "array",
                                                    "items": {}
                                                },
                                                "workplace_type": {
                                                    "type": "string"
                                                },
                                                "contract_type": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "city": {
                                                    "type": "string"
                                                },
                                                "country": {
                                                    "type": "string"
                                                },
                                                "country_code": {
                                                    "type": "string"
                                                },
                                                "deadline_at": {
                                                    "type": "string"
                                                },
                                                "status": {
                                                    "type": "string"
                                                },
                                                "rejection_reason": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "reviewed_at": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "created_at": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "slug": "designer-produit",
                                        "title": "Designer produit",
                                        "description": "<p>Offre mise à jour.</p>",
                                        "description_text": "Offre mise à jour.",
                                        "company_name": "Studio Baobab",
                                        "company_website_url": "https://baobab.example",
                                        "apply_url": "https://baobab.example/jobs/designer-produit",
                                        "logo_url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000005.png",
                                        "requirements": [
                                            "Figma",
                                            "Design system"
                                        ],
                                        "required_documents": [
                                            "cv",
                                            "portfolio"
                                        ],
                                        "positions_count": null,
                                        "experience_required_years": 2,
                                        "experience_recommended_years": null,
                                        "contact_email": null,
                                        "contact_phone": null,
                                        "location_address": null,
                                        "region": null,
                                        "postal_code": null,
                                        "salary_min": null,
                                        "salary_max": null,
                                        "salary_currency": null,
                                        "salary_period": null,
                                        "complementary_document": null,
                                        "category_ids": [],
                                        "workplace_type": "remote",
                                        "contract_type": null,
                                        "city": "Abidjan",
                                        "country": "Côte d’Ivoire",
                                        "country_code": "CI",
                                        "deadline_at": "2026-10-31",
                                        "status": "pending",
                                        "rejection_reason": null,
                                        "reviewed_at": null,
                                        "created_at": "2026-09-15T09:30:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "media_id": {
                                        "type": "string",
                                        "description": "Identifiant d’une image de la bibliothèque (POST /files)"
                                    }
                                },
                                "required": [
                                    "media_id"
                                ]
                            },
                            "example": {
                                "media_id": "01j9z000000000000000000008"
                            }
                        }
                    }
                }
            },
            "delete": {
                "operationId": "external_offers_logo_destroy",
                "summary": "Retire le logo de l’offre.",
                "description": "",
                "tags": [
                    "Offres externes"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "externalJobOffer",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’offre externe",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Supprimé"
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/external-offers/{externalJobOffer}/document": {
            "put": {
                "operationId": "external_offers_document_update",
                "summary": "Définit le document complémentaire de l’offre (fichier de la bibliothèque, public) ; l’offre repasse « pending ».",
                "description": "",
                "tags": [
                    "Offres externes"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "externalJobOffer",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’offre externe",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "slug": {
                                                    "type": "string"
                                                },
                                                "title": {
                                                    "type": "string"
                                                },
                                                "description": {
                                                    "type": "string"
                                                },
                                                "description_text": {
                                                    "type": "string"
                                                },
                                                "company_name": {
                                                    "type": "string"
                                                },
                                                "company_website_url": {
                                                    "type": "string"
                                                },
                                                "apply_url": {
                                                    "type": "string"
                                                },
                                                "logo_url": {
                                                    "type": "string"
                                                },
                                                "requirements": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "required_documents": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "positions_count": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "experience_required_years": {
                                                    "type": "integer"
                                                },
                                                "experience_recommended_years": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "contact_email": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "contact_phone": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "location_address": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "region": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "postal_code": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_min": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_max": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_currency": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "salary_period": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "complementary_document": {
                                                    "type": "object",
                                                    "properties": {
                                                        "name": {
                                                            "type": "string"
                                                        },
                                                        "url": {
                                                            "type": "string"
                                                        }
                                                    }
                                                },
                                                "category_ids": {
                                                    "type": "array",
                                                    "items": {}
                                                },
                                                "workplace_type": {
                                                    "type": "string"
                                                },
                                                "contract_type": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "city": {
                                                    "type": "string"
                                                },
                                                "country": {
                                                    "type": "string"
                                                },
                                                "country_code": {
                                                    "type": "string"
                                                },
                                                "deadline_at": {
                                                    "type": "string"
                                                },
                                                "status": {
                                                    "type": "string"
                                                },
                                                "rejection_reason": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "reviewed_at": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "created_at": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "slug": "designer-produit",
                                        "title": "Designer produit",
                                        "description": "<p>Offre mise à jour.</p>",
                                        "description_text": "Offre mise à jour.",
                                        "company_name": "Studio Baobab",
                                        "company_website_url": "https://baobab.example",
                                        "apply_url": "https://baobab.example/jobs/designer-produit",
                                        "logo_url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000005.png",
                                        "requirements": [
                                            "Figma",
                                            "Design system"
                                        ],
                                        "required_documents": [
                                            "cv",
                                            "portfolio"
                                        ],
                                        "positions_count": null,
                                        "experience_required_years": 2,
                                        "experience_recommended_years": null,
                                        "contact_email": null,
                                        "contact_phone": null,
                                        "location_address": null,
                                        "region": null,
                                        "postal_code": null,
                                        "salary_min": null,
                                        "salary_max": null,
                                        "salary_currency": null,
                                        "salary_period": null,
                                        "complementary_document": {
                                            "name": "logo-entreprise.png",
                                            "url": "/storage/media/library/01j9z000000000000000000004/01j9z000000000000000000005.png"
                                        },
                                        "category_ids": [],
                                        "workplace_type": "remote",
                                        "contract_type": null,
                                        "city": "Abidjan",
                                        "country": "Côte d’Ivoire",
                                        "country_code": "CI",
                                        "deadline_at": "2026-10-31",
                                        "status": "pending",
                                        "rejection_reason": null,
                                        "reviewed_at": null,
                                        "created_at": "2026-09-15T09:30:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "media_id": {
                                        "type": "string",
                                        "description": "Identifiant d’un fichier de la bibliothèque (POST /files)"
                                    }
                                },
                                "required": [
                                    "media_id"
                                ]
                            },
                            "example": {
                                "media_id": "01j9z000000000000000000008"
                            }
                        }
                    }
                }
            },
            "delete": {
                "operationId": "external_offers_document_destroy",
                "summary": "Retire le document complémentaire de l’offre.",
                "description": "",
                "tags": [
                    "Offres externes"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "externalJobOffer",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’offre externe",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Supprimé"
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/companies/{company}/applications": {
            "get": {
                "operationId": "companies_applications_index",
                "summary": "Candidatures reçues par l’entreprise.",
                "description": "",
                "tags": [
                    "Candidatures reçues"
                ],
                "x-required-scope": "read",
                "parameters": [
                    {
                        "name": "company",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’entreprise",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Numéro de page (défaut 1)",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Éléments par page (1 à 100, défaut 25)",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "offer",
                        "in": "query",
                        "required": false,
                        "description": "Slug d’une offre",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "status",
                        "in": "query",
                        "required": false,
                        "description": "Statut",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "submitted",
                                "reviewed",
                                "accepted",
                                "rejected"
                            ]
                        }
                    },
                    {
                        "name": "sort",
                        "in": "query",
                        "required": false,
                        "description": "Tri",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "recent",
                                "ats",
                                "ats_ai"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "id": {
                                                        "type": "string"
                                                    },
                                                    "job_offer_slug": {
                                                        "type": "string"
                                                    },
                                                    "applicant_name": {
                                                        "type": "string"
                                                    },
                                                    "applicant_email": {
                                                        "type": "string"
                                                    },
                                                    "applicant_phone": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "portfolio_url": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "additional_info": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "status": {
                                                        "type": "string"
                                                    },
                                                    "ats_score": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "ats_ai_score": {
                                                        "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                    },
                                                    "documents_count": {
                                                        "type": "integer"
                                                    },
                                                    "created_at": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        },
                                        "links": {
                                            "type": "object",
                                            "properties": {
                                                "first": {
                                                    "type": "string"
                                                },
                                                "last": {
                                                    "type": "string"
                                                },
                                                "prev": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "next": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "current_page": {
                                                    "type": "integer"
                                                },
                                                "from": {
                                                    "type": "integer"
                                                },
                                                "last_page": {
                                                    "type": "integer"
                                                },
                                                "links": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "url": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "label": {
                                                                "type": "string"
                                                            },
                                                            "page": {
                                                                "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                            },
                                                            "active": {
                                                                "type": "boolean"
                                                            }
                                                        }
                                                    }
                                                },
                                                "path": {
                                                    "type": "string"
                                                },
                                                "per_page": {
                                                    "type": "integer"
                                                },
                                                "to": {
                                                    "type": "integer"
                                                },
                                                "total": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": [
                                        {
                                            "id": "01j9z000000000000000000003",
                                            "job_offer_slug": "developpeurse-backend-laravel",
                                            "applicant_name": "Fatou Sow",
                                            "applicant_email": "fatou.sow@example.com",
                                            "applicant_phone": null,
                                            "portfolio_url": null,
                                            "additional_info": null,
                                            "status": "submitted",
                                            "ats_score": null,
                                            "ats_ai_score": null,
                                            "documents_count": 0,
                                            "created_at": "2026-09-15T09:30:00+00:00"
                                        }
                                    ],
                                    "links": {
                                        "first": "https://middlefolio.online/api/v1/companies/sahel-craft/applications?status=submitted&page=1",
                                        "last": "https://middlefolio.online/api/v1/companies/sahel-craft/applications?status=submitted&page=1",
                                        "prev": null,
                                        "next": null
                                    },
                                    "meta": {
                                        "current_page": 1,
                                        "from": 1,
                                        "last_page": 1,
                                        "links": [
                                            {
                                                "url": null,
                                                "label": "&laquo; Précédent",
                                                "page": null,
                                                "active": false
                                            },
                                            {
                                                "url": "https://middlefolio.online/api/v1/companies/sahel-craft/applications?status=submitted&page=1",
                                                "label": "1",
                                                "page": 1,
                                                "active": true
                                            }
                                        ],
                                        "path": "https://middlefolio.online/api/v1/companies/sahel-craft/applications",
                                        "per_page": 25,
                                        "to": 1,
                                        "total": 1
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/companies/{company}/applications/{application}": {
            "get": {
                "operationId": "companies_applications_show",
                "summary": "Détail d’une candidature (pièces jointes non exposées).",
                "description": "",
                "tags": [
                    "Candidatures reçues"
                ],
                "x-required-scope": "read",
                "parameters": [
                    {
                        "name": "company",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’entreprise",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "application",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant de la candidature",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "job_offer_slug": {
                                                    "type": "string"
                                                },
                                                "applicant_name": {
                                                    "type": "string"
                                                },
                                                "applicant_email": {
                                                    "type": "string"
                                                },
                                                "applicant_phone": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "portfolio_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "additional_info": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "status": {
                                                    "type": "string"
                                                },
                                                "ats_score": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "ats_ai_score": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "documents_count": {
                                                    "type": "integer"
                                                },
                                                "created_at": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000003",
                                        "job_offer_slug": "developpeurse-backend-laravel",
                                        "applicant_name": "Fatou Sow",
                                        "applicant_email": "fatou.sow@example.com",
                                        "applicant_phone": null,
                                        "portfolio_url": null,
                                        "additional_info": null,
                                        "status": "submitted",
                                        "ats_score": null,
                                        "ats_ai_score": null,
                                        "documents_count": 0,
                                        "created_at": "2026-09-15T09:30:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/companies/{company}/applications/{application}/status": {
            "patch": {
                "operationId": "companies_applications_status",
                "summary": "Change le statut d’une candidature.",
                "description": "",
                "tags": [
                    "Candidatures reçues"
                ],
                "x-required-scope": "write",
                "parameters": [
                    {
                        "name": "company",
                        "in": "path",
                        "required": true,
                        "description": "Slug de l’entreprise",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "application",
                        "in": "path",
                        "required": true,
                        "description": "Identifiant de la candidature",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Succès",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "job_offer_slug": {
                                                    "type": "string"
                                                },
                                                "applicant_name": {
                                                    "type": "string"
                                                },
                                                "applicant_email": {
                                                    "type": "string"
                                                },
                                                "applicant_phone": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "portfolio_url": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "additional_info": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "status": {
                                                    "type": "string"
                                                },
                                                "ats_score": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "ats_ai_score": {
                                                    "description": "Vide (null) dans l’exemple ; renseigné selon les données."
                                                },
                                                "documents_count": {
                                                    "type": "integer"
                                                },
                                                "created_at": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "01j9z000000000000000000003",
                                        "job_offer_slug": "developpeurse-backend-laravel",
                                        "applicant_name": "Fatou Sow",
                                        "applicant_email": "fatou.sow@example.com",
                                        "applicant_phone": null,
                                        "portfolio_url": null,
                                        "additional_info": null,
                                        "status": "reviewed",
                                        "ats_score": null,
                                        "ats_ai_score": null,
                                        "documents_count": 0,
                                        "created_at": "2026-09-15T09:30:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Clé absente, invalide, expirée ou révoquée",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Scope, formule, compte ou droit insuffisant",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ressource introuvable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation ou quota de formule",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Trop de requêtes",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "status": {
                                        "type": "string",
                                        "enum": [
                                            "submitted",
                                            "reviewed",
                                            "accepted",
                                            "rejected"
                                        ],
                                        "description": "Statut"
                                    }
                                },
                                "required": [
                                    "status"
                                ]
                            },
                            "example": {
                                "status": "reviewed"
                            }
                        }
                    }
                }
            }
        }
    },
    "components": {
        "securitySchemes": {
            "bearerAuth": {
                "type": "http",
                "scheme": "bearer",
                "description": "Clé API créée dans API > Gérer."
            }
        },
        "schemas": {
            "Error": {
                "type": "object",
                "properties": {
                    "message": {
                        "type": "string"
                    },
                    "code": {
                        "type": "string"
                    },
                    "errors": {
                        "type": "object"
                    }
                }
            }
        }
    }
}