{"openapi":"3.1.0","info":{"title":"Hiveo API","version":"1.1.0","description":"API publique d'intégration Hiveo (ATS, CRM, consultants, CRA, facturation).\n\n## Authentification\n\nDeux schémas, tous deux dans l'en-tête `Authorization: Bearer …` :\n\n- **userJwt** — jeton de session d'un utilisateur Hiveo (Supabase HS256 ou ZITADEL). Droits = ceux de l'utilisateur.\n- **apiKey** — clé d'organisation `hiv_<préfixe>_<secret>`, créée dans **Réglages → Import / API** par un administrateur.\n  La clé agit au nom de son créateur (mêmes règles d'accès, RLS appliquée par la base), restreinte à ses **scopes**\n  (`<ressource>:read` / `<ressource>:write`, l'écriture implique la lecture). Elle est suspendue si son créateur\n  n'est plus administrateur actif de l'organisation. Limite par défaut : 300 requêtes/minute par clé\n  (en-têtes `X-RateLimit-Limit` / `X-RateLimit-Remaining`, `429` + `Retry-After` au-delà).\n\nScopes : `consultants:read`, `candidates:read`, `candidates:write`, `companies:read`, `companies:write`, `projects:read`, `projects:write`, `job_offers:read`, `job_offers:write`, `deals:read`, `deals:write`, `cras:read`, `cras:write`, `invoices:read`, `invoices:write`, `expenses:read`, `expenses:write`, `leave_requests:read`, `leave_requests:write`, `webhooks:read`, `webhooks:write`, `reporting:read`.\n\n## Pagination\n\nLes listes acceptent `limit` (1-500, défaut 100) et `offset`, et renvoient\n`{ organization_id, items, pagination: { limit, offset, has_more, next_offset } }`.\nPage suivante : rappeler avec `offset = pagination.next_offset` tant que `has_more` est vrai.\nTri : `sort=<colonne>` ou `sort=-<colonne>` (colonnes autorisées indiquées sur chaque route).\n\n## Erreurs\n\nFormat unique : `{ \"error\": \"message lisible\", \"code\": \"code_stable\", \"details\": … }`.\nCodes : `unauthorized`, `api_key_invalid`, `api_key_revoked`, `api_key_expired`, `api_key_owner_inactive`,\n`insufficient_scope`, `forbidden`, `not_found`, `validation_error` (422, `details` = champs en erreur),\n`invalid_state`, `double_booked`, `missing_receipt`, `needs_review`, `conflict`, `rate_limited`, `internal`.\n\n## Webhooks sortants\n\nÉvénements : `candidate.created`, `invoice.issued`, `invoice.paid`, `invoice.credited`, `cra.submitted`, `cra.validated`, `expense.approved`, `expense.rejected`, `leave_request.approved`, `leave_request.rejected` (et `ping` pour les tests).\nChaque livraison est un `POST` JSON `{ id, type, created_at, organization_id, data }` avec les en-têtes\n`Hiveo-Event`, `Hiveo-Delivery`, `Hiveo-Timestamp` et\n`Hiveo-Signature: t=<timestamp>,v1=<hex HMAC-SHA256(secret, \"<timestamp>.<corps>\")>`.\nVérifiez la signature (comparaison à temps constant) et rejetez un horodatage de plus de 5 minutes.\nRéponse attendue : `2xx` en moins de 10 s ; sinon 8 nouvelles tentatives (1 min → 24 h).\nLe même `id` d'événement peut être livré plusieurs fois : dédoublonnez sur `id`.","contact":{"name":"Hiveo","url":"https://hiveo.xyz"}},"servers":[{"url":"https://api.hiveo.xyz","description":"Production"}],"security":[{"userJwt":[]},{"apiKey":[]}],"tags":[{"name":"Compte","description":"Identité de l'appelant"},{"name":"Consultants"},{"name":"Candidats"},{"name":"Entreprises"},{"name":"Projets","description":"Projets / missions et affectations (multi-projets)"},{"name":"Offres"},{"name":"Deals"},{"name":"CRA","description":"Comptes rendus d'activité (une feuille par consultant, projet et mois)"},{"name":"Factures","description":"Numérotation légale attribuée à l'émission"},{"name":"Notes de frais"},{"name":"Congés"},{"name":"Webhooks","description":"Abonnements aux événements et journal des livraisons"},{"name":"MCP","description":"Outils pour agents (Model Context Protocol)"},{"name":"Système"}],"components":{"securitySchemes":{"userJwt":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Jeton de session utilisateur Hiveo (Supabase ou ZITADEL)."},"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"hiv_<préfixe>_<secret>","description":"Clé d'API d'organisation (Réglages → Import / API). Exemple : `Authorization: Bearer hiv_1a2b3c4d5e6f_…`"}},"schemas":{"Health":{"type":"object","properties":{"ok":{"type":"boolean"},"service":{"type":"string","enum":["hiveo-api"]},"version":{"type":"string"},"auth":{"type":"array","items":{"type":"string"}}},"required":["ok","service","version","auth"]},"Me":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":["string","null"]}},"required":["id"]},"membership":{"type":"object","properties":{"userId":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"authId":{"type":"string"},"organizationId":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"role":{"type":"string"},"email":{"type":["string","null"]}},"required":["userId","authId","organizationId","role","email"]},"auth":{"type":"object","properties":{"kind":{"type":"string","enum":["user","api_key"]},"api_key":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"prefix":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"rate_limit":{"type":"integer"}},"required":["id","prefix","scopes","rate_limit"]}},"required":["kind"]}},"required":["user","membership","auth"]},"Error":{"type":"object","properties":{"error":{"type":"string","example":"Candidat introuvable"},"code":{"type":"string","example":"not_found","description":"Code stable, à utiliser côté client"},"details":{"description":"Détails (erreurs de validation champ par champ…)"}},"required":["error","code"]},"McpRequest":{"type":"object","properties":{"jsonrpc":{"type":"string","description":"Présent (= \"2.0\") → Streamable HTTP JSON-RPC"},"id":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"null"}]},"method":{"type":"string","example":"tools/call"},"name":{"type":"string"},"arguments":{"type":"object","additionalProperties":{}},"params":{"type":"object","additionalProperties":{}}},"additionalProperties":{},"example":{"method":"tools/call","name":"list_cras","arguments":{"status":"submitted"}}},"ConsultantPage":{"type":"object","properties":{"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"items":{"type":"array","items":{"$ref":"#/components/schemas/Consultant"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["organization_id","items","pagination"]},"Consultant":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"first_name":{"type":"string"},"last_name":{"type":"string"},"email":{"type":["string","null"]},"title":{"type":["string","null"]},"contract_type":{"type":["string","null"]},"is_active":{"type":["boolean","null"]},"agency_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"hire_date":{"type":["string","null"]},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","organization_id","first_name","last_name","email","title","contract_type","is_active","agency_id","hire_date","created_at","updated_at"]},"Pagination":{"type":"object","properties":{"limit":{"type":"integer"},"offset":{"type":"integer"},"has_more":{"type":"boolean"},"next_offset":{"type":["integer","null"],"description":"Offset de la page suivante, null si dernière page"}},"required":["limit","offset","has_more","next_offset"]},"CandidatePage":{"type":"object","properties":{"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"items":{"type":"array","items":{"$ref":"#/components/schemas/Candidate"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["organization_id","items","pagination"]},"Candidate":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"agency_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"first_name":{"type":"string"},"last_name":{"type":"string"},"email":{"type":["string","null"]},"phone":{"type":["string","null"]},"city":{"type":["string","null"]},"country":{"type":["string","null"]},"current_title":{"type":["string","null"]},"current_company":{"type":["string","null"]},"experience_years":{"type":["number","null"]},"tjm_target":{"type":["number","null"]},"salary_target":{"type":["number","null"]},"skills":{"type":["array","null"],"items":{"type":"string"}},"tags":{"type":["array","null"],"items":{"type":"string"}},"linkedin_url":{"type":["string","null"]},"source":{"type":["string","null"]},"contract_type":{"type":["string","null"]},"availability":{"type":["string","null"]},"stage_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"score":{"type":["number","null"]},"gdpr_consent":{"type":"boolean"},"consultant_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","organization_id","agency_id","first_name","last_name","email","phone","city","country","current_title","current_company","experience_years","tjm_target","salary_target","skills","tags","linkedin_url","source","contract_type","availability","stage_id","score","gdpr_consent","consultant_id","created_at","updated_at"]},"CandidateInput":{"type":"object","properties":{"first_name":{"type":"string","minLength":1,"maxLength":100},"last_name":{"type":"string","minLength":1,"maxLength":100},"email":{"type":["string","null"],"maxLength":254,"format":"email"},"phone":{"type":["string","null"],"maxLength":40},"city":{"type":["string","null"],"maxLength":120},"country":{"type":["string","null"],"maxLength":80},"current_title":{"type":["string","null"],"maxLength":200},"current_company":{"type":["string","null"],"maxLength":200},"experience_years":{"type":["integer","null"],"minimum":0,"maximum":70},"tjm_target":{"type":["number","null"],"minimum":0,"maximum":10000},"salary_target":{"type":["number","null"],"minimum":0,"maximum":1000000},"skills":{"type":["array","null"],"items":{"type":"string","minLength":1,"maxLength":80},"maxItems":100},"tags":{"type":["array","null"],"items":{"type":"string","minLength":1,"maxLength":80},"maxItems":50},"linkedin_url":{"type":["string","null"],"maxLength":500,"format":"uri"},"source":{"type":["string","null"],"maxLength":80,"description":"Défaut : api","example":"jobboard"},"contract_type":{"type":["string","null"],"maxLength":40},"availability":{"type":["string","null"],"maxLength":120},"notes":{"type":["string","null"],"maxLength":10000},"gdpr_consent":{"type":"boolean","description":"Consentement RGPD recueilli (date posée automatiquement)"},"stage_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","description":"Étape du pipeline de recrutement (pipeline_stages)"},"agency_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"}},"required":["first_name","last_name"],"additionalProperties":false,"example":{"first_name":"Camille","last_name":"Martin","email":"camille.martin@example.com","current_title":"Développeuse React","skills":["React","TypeScript"],"tjm_target":550,"source":"jobboard","gdpr_consent":true}},"CandidatePatch":{"type":"object","properties":{"first_name":{"type":"string","minLength":1,"maxLength":100},"last_name":{"type":"string","minLength":1,"maxLength":100},"email":{"type":["string","null"],"maxLength":254,"format":"email"},"phone":{"type":["string","null"],"maxLength":40},"city":{"type":["string","null"],"maxLength":120},"country":{"type":["string","null"],"maxLength":80},"current_title":{"type":["string","null"],"maxLength":200},"current_company":{"type":["string","null"],"maxLength":200},"experience_years":{"type":["integer","null"],"minimum":0,"maximum":70},"tjm_target":{"type":["number","null"],"minimum":0,"maximum":10000},"salary_target":{"type":["number","null"],"minimum":0,"maximum":1000000},"skills":{"type":["array","null"],"items":{"type":"string","minLength":1,"maxLength":80},"maxItems":100},"tags":{"type":["array","null"],"items":{"type":"string","minLength":1,"maxLength":80},"maxItems":50},"linkedin_url":{"type":["string","null"],"maxLength":500,"format":"uri"},"source":{"type":["string","null"],"maxLength":80,"description":"Défaut : api","example":"jobboard"},"contract_type":{"type":["string","null"],"maxLength":40},"availability":{"type":["string","null"],"maxLength":120},"notes":{"type":["string","null"],"maxLength":10000},"gdpr_consent":{"type":"boolean","description":"Consentement RGPD recueilli (date posée automatiquement)"},"stage_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","description":"Étape du pipeline de recrutement (pipeline_stages)"},"agency_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"}},"additionalProperties":false},"CompanyPage":{"type":"object","properties":{"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"items":{"type":"array","items":{"$ref":"#/components/schemas/Company"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["organization_id","items","pagination"]},"Company":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"agency_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"name":{"type":"string"},"siren":{"type":["string","null"]},"siret":{"type":["string","null"]},"tva_intra":{"type":["string","null"]},"status":{"type":["string","null"]},"industry":{"type":["string","null"]},"address":{"type":["string","null"]},"postal_code":{"type":["string","null"]},"city":{"type":["string","null"]},"country":{"type":["string","null"]},"website":{"type":["string","null"]},"phone":{"type":["string","null"]},"billing_email":{"type":["string","null"]},"payment_delay":{"type":["string","null"]},"vat_category":{"type":"string"},"tags":{"type":["array","null"],"items":{"type":"string"}},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","organization_id","agency_id","name","siren","siret","tva_intra","status","industry","address","postal_code","city","country","website","phone","billing_email","payment_delay","vat_category","tags","created_at","updated_at"]},"CompanyInput":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"siren":{"type":["string","null"],"pattern":"^\\d{9}$"},"siret":{"type":["string","null"],"pattern":"^\\d{14}$"},"tva_intra":{"type":["string","null"],"maxLength":20},"status":{"type":["string","null"],"maxLength":40,"example":"client","description":"lead, prospect, client…"},"industry":{"type":["string","null"],"maxLength":120},"address":{"type":["string","null"],"maxLength":300},"postal_code":{"type":["string","null"],"maxLength":12},"city":{"type":["string","null"],"maxLength":120},"country":{"type":["string","null"],"maxLength":80},"website":{"type":["string","null"],"maxLength":300},"phone":{"type":["string","null"],"maxLength":40},"billing_email":{"type":["string","null"],"maxLength":254,"format":"email"},"payment_delay":{"type":["string","null"],"maxLength":40,"example":"30j"},"vat_category":{"type":"string","maxLength":40,"description":"Catégorie TVA (défaut de la base)"},"notes":{"type":["string","null"],"maxLength":10000},"tags":{"type":["array","null"],"items":{"type":"string","minLength":1,"maxLength":80},"maxItems":50},"agency_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"}},"required":["name"],"additionalProperties":false,"example":{"name":"ACME SAS","siren":"552100554","status":"client","city":"Paris"}},"CompanyPatch":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"siren":{"type":["string","null"],"pattern":"^\\d{9}$"},"siret":{"type":["string","null"],"pattern":"^\\d{14}$"},"tva_intra":{"type":["string","null"],"maxLength":20},"status":{"type":["string","null"],"maxLength":40,"example":"client","description":"lead, prospect, client…"},"industry":{"type":["string","null"],"maxLength":120},"address":{"type":["string","null"],"maxLength":300},"postal_code":{"type":["string","null"],"maxLength":12},"city":{"type":["string","null"],"maxLength":120},"country":{"type":["string","null"],"maxLength":80},"website":{"type":["string","null"],"maxLength":300},"phone":{"type":["string","null"],"maxLength":40},"billing_email":{"type":["string","null"],"maxLength":254,"format":"email"},"payment_delay":{"type":["string","null"],"maxLength":40,"example":"30j"},"vat_category":{"type":"string","maxLength":40,"description":"Catégorie TVA (défaut de la base)"},"notes":{"type":["string","null"],"maxLength":10000},"tags":{"type":["array","null"],"items":{"type":"string","minLength":1,"maxLength":80},"maxItems":50},"agency_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"}},"additionalProperties":false},"ProjectPage":{"type":"object","properties":{"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"items":{"type":"array","items":{"$ref":"#/components/schemas/Project"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["organization_id","items","pagination"]},"Project":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"agency_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"company_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"name":{"type":"string"},"project_type":{"type":"string","example":"regie"},"status":{"type":["string","null"]},"start_date":{"type":["string","null"]},"end_date":{"type":["string","null"]},"budget_eur":{"type":["number","null"]},"days_sold":{"type":["number","null"]},"tjm_sale":{"type":["number","null"]},"description":{"type":["string","null"]},"client_contact_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","organization_id","agency_id","company_id","name","project_type","status","start_date","end_date","budget_eur","days_sold","tjm_sale","description","client_contact_id","created_at","updated_at"]},"ProjectInput":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"company_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","description":"Client (entreprise de votre organisation)"},"project_type":{"type":"string","enum":["regie","forfait"],"description":"Défaut : regie"},"status":{"type":"string","maxLength":40,"example":"active"},"start_date":{"type":["string","null"],"pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-09-30"},"end_date":{"type":["string","null"],"pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-09-30"},"budget_eur":{"type":["number","null"],"minimum":0,"maximum":100000000},"days_sold":{"type":["number","null"],"minimum":0,"maximum":100000},"tjm_sale":{"type":["number","null"],"minimum":0,"maximum":10000},"description":{"type":["string","null"],"maxLength":20000},"client_contact_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"agency_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"}},"required":["name","company_id"],"additionalProperties":false,"example":{"name":"Refonte portail RH","company_id":"3f2504e0-4f89-41d3-9a0c-0305e82c3301","project_type":"regie","tjm_sale":650}},"ProjectPatch":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"company_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","description":"Client (entreprise de votre organisation)"},"project_type":{"type":"string","enum":["regie","forfait"],"description":"Défaut : regie"},"status":{"type":"string","maxLength":40,"example":"active"},"start_date":{"type":["string","null"],"pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-09-30"},"end_date":{"type":["string","null"],"pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-09-30"},"budget_eur":{"type":["number","null"],"minimum":0,"maximum":100000000},"days_sold":{"type":["number","null"],"minimum":0,"maximum":100000},"tjm_sale":{"type":["number","null"],"minimum":0,"maximum":10000},"description":{"type":["string","null"],"maxLength":20000},"client_contact_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"agency_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"}},"additionalProperties":false},"AssignmentList":{"type":"object","properties":{"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"project_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"items":{"type":"array","items":{"$ref":"#/components/schemas/Assignment"}}},"required":["organization_id","project_id","items"]},"Assignment":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"project_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"consultant_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"role":{"type":"string"},"tjm":{"type":"number"},"tjm_sale":{"type":["number","null"]},"start_date":{"type":["string","null"]},"end_date":{"type":["string","null"]},"days_worked":{"type":["number","null"]},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","project_id","consultant_id","role","tjm","tjm_sale","start_date","end_date","days_worked","created_at","updated_at"]},"AssignmentInput":{"type":"object","properties":{"consultant_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"tjm":{"type":"number","minimum":0,"maximum":10000,"description":"TJM de vente (arrondi à l'euro)","example":600},"role":{"type":"string","minLength":1,"maxLength":80,"description":"Défaut : consultant"},"start_date":{"type":["string","null"],"pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-09-30"},"end_date":{"type":["string","null"],"pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-09-30"}},"required":["consultant_id","tjm"],"additionalProperties":false},"JobOfferPage":{"type":"object","properties":{"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"items":{"type":"array","items":{"$ref":"#/components/schemas/JobOffer"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["organization_id","items","pagination"]},"JobOffer":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"agency_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"company_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"title":{"type":"string"},"status":{"type":["string","null"]},"contract_type":{"type":["string","null"]},"location":{"type":["string","null"]},"remote_policy":{"type":["string","null"]},"department":{"type":["string","null"]},"description":{"type":["string","null"]},"requirements":{"type":["array","null"],"items":{"type":"string"}},"salary_min":{"type":["number","null"]},"salary_max":{"type":["number","null"]},"tjm_target":{"type":["number","null"]},"urgency":{"type":["string","null"]},"positions_count":{"type":["number","null"]},"published_at":{"type":["string","null"]},"closed_at":{"type":["string","null"]},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","organization_id","agency_id","company_id","title","status","contract_type","location","remote_policy","department","description","requirements","salary_min","salary_max","tjm_target","urgency","positions_count","published_at","closed_at","created_at","updated_at"]},"JobOfferInput":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"company_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"status":{"type":"string","maxLength":40,"example":"open"},"contract_type":{"type":["string","null"],"maxLength":40},"location":{"type":["string","null"],"maxLength":200},"remote_policy":{"type":["string","null"],"maxLength":40},"department":{"type":["string","null"],"maxLength":120},"description":{"type":["string","null"],"maxLength":20000},"requirements":{"type":["array","null"],"items":{"type":"string","minLength":1,"maxLength":120},"maxItems":100},"salary_min":{"type":["number","null"],"minimum":0,"maximum":1000000},"salary_max":{"type":["number","null"],"minimum":0,"maximum":1000000},"tjm_target":{"type":["number","null"],"minimum":0,"maximum":10000},"urgency":{"type":["string","null"],"maxLength":40},"positions_count":{"type":["integer","null"],"minimum":1,"maximum":1000},"agency_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"}},"required":["title"],"additionalProperties":false,"example":{"title":"Développeur Java senior","contract_type":"cdi","location":"Lyon","requirements":["Java","Spring"]}},"JobOfferPatch":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"company_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"status":{"type":"string","maxLength":40,"example":"open"},"contract_type":{"type":["string","null"],"maxLength":40},"location":{"type":["string","null"],"maxLength":200},"remote_policy":{"type":["string","null"],"maxLength":40},"department":{"type":["string","null"],"maxLength":120},"description":{"type":["string","null"],"maxLength":20000},"requirements":{"type":["array","null"],"items":{"type":"string","minLength":1,"maxLength":120},"maxItems":100},"salary_min":{"type":["number","null"],"minimum":0,"maximum":1000000},"salary_max":{"type":["number","null"],"minimum":0,"maximum":1000000},"tjm_target":{"type":["number","null"],"minimum":0,"maximum":10000},"urgency":{"type":["string","null"],"maxLength":40},"positions_count":{"type":["integer","null"],"minimum":1,"maximum":1000},"agency_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"}},"additionalProperties":false},"DealPage":{"type":"object","properties":{"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"items":{"type":"array","items":{"$ref":"#/components/schemas/Deal"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["organization_id","items","pagination"]},"Deal":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"title":{"type":"string"},"company_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"stage_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"value_eur":{"type":["number","null"]},"probability":{"type":["number","null"]},"assigned_to":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"expected_close_date":{"type":["string","null"]},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","organization_id","title","company_id","stage_id","value_eur","probability","assigned_to","expected_close_date","created_at","updated_at"]},"DealPatch":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"value_eur":{"type":"number","minimum":0,"maximum":100000000},"amount":{"type":"number","minimum":0,"maximum":100000000,"description":"Alias de value_eur (compatibilité)"},"probability":{"type":"number","minimum":0,"maximum":100},"expected_close_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-09-30"},"expected_close":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-09-30","description":"Alias de expected_close_date (compatibilité)"}},"additionalProperties":false},"DealStageMove":{"type":"object","properties":{"stage_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"}},"required":["stage_id"],"additionalProperties":false},"CraPage":{"type":"object","properties":{"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"items":{"type":"array","items":{"$ref":"#/components/schemas/Cra"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["organization_id","items","pagination"]},"Cra":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"consultant_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"project_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"month":{"type":"integer"},"year":{"type":"integer"},"status":{"type":"string","example":"submitted"},"days":{"type":["array","null"],"items":{"type":"object","additionalProperties":{}},"description":"Jours du mois ({date, type: worked|half|off…})"},"validated_at":{"type":["string","null"]},"validated_by":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","organization_id","consultant_id","project_id","month","year","status","days","validated_at","validated_by","created_at","updated_at"]},"CraReject":{"type":"object","properties":{"reason":{"type":"string","maxLength":1000,"description":"Motif (visible par le consultant)"}},"additionalProperties":false},"InvoicePage":{"type":"object","properties":{"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"items":{"type":"array","items":{"$ref":"#/components/schemas/Invoice"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["organization_id","items","pagination"]},"Invoice":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"company_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"invoice_number":{"type":["string","null"],"description":"Numéro légal, attribué à l'émission (null pour un brouillon)"},"status":{"type":"string","example":"issued","description":"draft | issued | late | paid | cancelled | credited"},"period_start":{"type":["string","null"]},"period_end":{"type":["string","null"]},"total_ht":{"type":["number","null"]},"total_tva":{"type":["number","null"]},"total_ttc":{"type":["number","null"]},"issue_date":{"type":["string","null"]},"due_date":{"type":["string","null"]},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","organization_id","company_id","invoice_number","status","period_start","period_end","total_ht","total_tva","total_ttc","issue_date","due_date","created_at","updated_at"]},"InvoiceFromCraResult":{"type":"object","properties":{"invoice":{"$ref":"#/components/schemas/Invoice"},"cra_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"worked_days":{"type":"number"}},"required":["invoice","cra_id","worked_days"]},"InvoiceFromCra":{"type":"object","properties":{"cra_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"}},"required":["cra_id"],"additionalProperties":false},"IssuedInvoice":{"allOf":[{"$ref":"#/components/schemas/Invoice"},{"type":"object","properties":{"already_issued":{"type":"boolean","description":"true si la facture était déjà émise (appel idempotent)"},"issue_date_adjusted":{"type":"boolean","description":"true si la base a retenu une autre date d'émission que celle demandée"}},"required":["already_issued","issue_date_adjusted"]}]},"InvoiceIssue":{"type":"object","properties":{"due_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-09-30"},"payment_terms":{"type":"string","maxLength":200},"issue_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-09-30","description":"Date d'émission souhaitée ; la base l'ajuste (antidatage borné, ordre chronologique de la numérotation)"}},"additionalProperties":false},"ExpensePage":{"type":"object","properties":{"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"items":{"type":"array","items":{"$ref":"#/components/schemas/Expense"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["organization_id","items","pagination"]},"Expense":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"consultant_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"project_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"category":{"type":"string"},"description":{"type":"string"},"expense_date":{"type":"string"},"amount_ht":{"type":"number"},"tva_amount":{"type":"number"},"amount_ttc":{"type":"number"},"status":{"type":["string","null"],"example":"pending"},"has_receipt":{"type":"boolean"},"is_billable":{"type":["boolean","null"]},"ocr_needs_review":{"type":"boolean"},"approved_by":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"approved_at":{"type":["string","null"]},"rejection_reason":{"type":["string","null"]},"created_at":{"type":"string"}},"required":["id","organization_id","consultant_id","project_id","category","description","expense_date","amount_ht","tva_amount","amount_ttc","status","has_receipt","is_billable","ocr_needs_review","approved_by","approved_at","rejection_reason","created_at"]},"ExpenseDecision":{"type":"object","properties":{"decision":{"type":"string","enum":["approved","rejected"]},"reason":{"type":["string","null"],"maxLength":1000,"description":"Motif du refus (visible par le consultant)"},"force_review":{"type":"boolean","description":"Approuver une note marquée « À vérifier » malgré le blocage des réglages Validation"}},"required":["decision"],"additionalProperties":false,"example":{"decision":"approved"}},"LeaveRequestPage":{"type":"object","properties":{"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"items":{"type":"array","items":{"$ref":"#/components/schemas/LeaveRequest"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["organization_id","items","pagination"]},"LeaveRequest":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"consultant_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"leave_type":{"type":"string"},"start_date":{"type":"string"},"end_date":{"type":"string"},"business_days":{"type":"number"},"reason":{"type":["string","null"]},"status":{"type":["string","null"],"example":"pending"},"approved_by":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"approved_at":{"type":["string","null"]},"rejection_reason":{"type":["string","null"]},"created_at":{"type":"string"}},"required":["id","organization_id","consultant_id","leave_type","start_date","end_date","business_days","reason","status","approved_by","approved_at","rejection_reason","created_at"]},"LeaveDecision":{"type":"object","properties":{"decision":{"type":"string","enum":["approved","rejected"]},"reason":{"type":["string","null"],"maxLength":1000,"description":"Motif du refus — obligatoire si le réglage « motif de refus » est actif (défaut)"}},"required":["decision"],"additionalProperties":false,"example":{"decision":"rejected","reason":"Période de mise en production"}},"WebhookEndpointList":{"type":"object","properties":{"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"items":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEndpoint"}}},"required":["organization_id","items"]},"WebhookEndpoint":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"url":{"type":"string"},"description":{"type":["string","null"]},"events":{"type":"array","items":{"type":"string","enum":["candidate.created","invoice.issued","invoice.paid","invoice.credited","cra.submitted","cra.validated","expense.approved","expense.rejected","leave_request.approved","leave_request.rejected"]}},"is_active":{"type":"boolean"},"created_at":{"type":"string"},"updated_at":{"type":"string"},"last_success_at":{"type":["string","null"]},"last_failure_at":{"type":["string","null"]},"consecutive_failures":{"type":"integer"},"disabled_reason":{"type":["string","null"]}},"required":["id","organization_id","url","description","events","is_active","created_at","updated_at","last_success_at","last_failure_at","consecutive_failures","disabled_reason"]},"WebhookEndpointCreated":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"url":{"type":"string"},"description":{"type":["string","null"]},"events":{"type":"array","items":{"type":"string","enum":["candidate.created","invoice.issued","invoice.paid","invoice.credited","cra.submitted","cra.validated","expense.approved","expense.rejected","leave_request.approved","leave_request.rejected"]}},"is_active":{"type":"boolean"},"created_at":{"type":"string"},"secret":{"type":"string","description":"Secret de signature HMAC (whsec_…) — affiché UNE SEULE FOIS, à conserver côté récepteur","example":"whsec_3b1f…"}},"required":["id","url","description","events","is_active","created_at","secret"]},"WebhookEndpointInput":{"type":"object","properties":{"url":{"type":"string","maxLength":2000},"events":{"type":"array","items":{"type":"string","enum":["candidate.created","invoice.issued","invoice.paid","invoice.credited","cra.submitted","cra.validated","expense.approved","expense.rejected","leave_request.approved","leave_request.rejected"]},"minItems":1},"description":{"type":["string","null"],"maxLength":200}},"required":["url","events"],"additionalProperties":false,"example":{"url":"https://erp.example.com/hooks/hiveo","events":["invoice.issued","cra.validated"],"description":"ERP"}},"WebhookEndpointUpdated":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"url":{"type":"string"},"description":{"type":["string","null"]},"events":{"type":"array","items":{"type":"string","enum":["candidate.created","invoice.issued","invoice.paid","invoice.credited","cra.submitted","cra.validated","expense.approved","expense.rejected","leave_request.approved","leave_request.rejected"]}},"is_active":{"type":"boolean"},"created_at":{"type":"string"},"updated_at":{"type":"string"},"last_success_at":{"type":["string","null"]},"last_failure_at":{"type":["string","null"]},"consecutive_failures":{"type":"integer"},"disabled_reason":{"type":["string","null"]}}},"WebhookEndpointPatch":{"type":"object","properties":{"url":{"type":"string","maxLength":2000},"events":{"type":"array","items":{"type":"string","enum":["candidate.created","invoice.issued","invoice.paid","invoice.credited","cra.submitted","cra.validated","expense.approved","expense.rejected","leave_request.approved","leave_request.rejected"]},"minItems":1},"description":{"type":["string","null"],"maxLength":200},"is_active":{"type":"boolean","description":"Réactiver remet à zéro le compteur d'échecs"}},"additionalProperties":false},"WebhookEndpointDeleted":{"type":"object","properties":{"deleted":{"type":"boolean","enum":[true]},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"}},"required":["deleted","id"]},"WebhookTestQueued":{"type":"object","properties":{"queued":{"type":"boolean","enum":[true]},"id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"}},"required":["queued","id"]},"WebhookDeliveryPage":{"type":"object","properties":{"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"items":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDelivery"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["organization_id","items","pagination"]},"WebhookDelivery":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"endpoint_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"event_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"event_type":{"type":"string"},"status":{"type":"string","enum":["pending","delivering","succeeded","failed","dead","skipped"]},"attempts":{"type":"integer"},"next_attempt_at":{"type":"string"},"last_status_code":{"type":["integer","null"]},"last_error":{"type":["string","null"]},"created_at":{"type":"string"},"delivered_at":{"type":["string","null"]}},"required":["id","endpoint_id","event_id","event_type","status","attempts","next_attempt_at","last_status_code","last_error","created_at","delivered_at"]},"ReportingDatasetList":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ReportingDataset"}}},"required":["items"]},"ReportingDataset":{"type":"object","properties":{"name":{"type":"string","enum":["agencies","clients","consultants","invoices","activity","production","pipeline","costs"]},"description":{"type":"string"},"periodic":{"type":"boolean","description":"true : filtré par la période from / to"},"columns":{"type":"array","items":{"type":"string"}}},"required":["name","description","periodic","columns"]},"ReportingDatasetPage":{"type":"object","properties":{"organization_id":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"dataset":{"type":"string"},"period":{"type":["object","null"],"properties":{"from":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]},"agency_id":{"type":["string","null"],"format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"columns":{"type":"array","items":{"type":"string"}},"items":{"type":"array","items":{"type":"object","additionalProperties":{}}},"pagination":{"type":"object","properties":{"limit":{"type":"integer"},"offset":{"type":"integer"},"total":{"type":"integer"},"has_more":{"type":"boolean"},"next_offset":{"type":["integer","null"]}},"required":["limit","offset","total","has_more","next_offset"]}},"required":["organization_id","dataset","period","agency_id","columns","items","pagination"]}},"parameters":{}},"paths":{"/v1/health":{"get":{"tags":["Système"],"summary":"État du service","operationId":"health","security":[],"responses":{"200":{"description":"Service disponible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}}}}},"/v1/me":{"get":{"tags":["Compte"],"summary":"Identité de l'appelant","description":"Utilisateur, organisation et, pour une clé d'API, ses scopes. Aucun scope requis.","operationId":"getMe","security":[{"userJwt":[]},{"apiKey":[]}],"responses":{"200":{"description":"Identité","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/mcp/tools":{"get":{"tags":["MCP"],"summary":"Outils MCP disponibles","operationId":"listMcpTools","security":[{"userJwt":[]},{"apiKey":[]}],"responses":{"200":{"description":"Outils","content":{"application/json":{"schema":{"type":"object","properties":{"tools":{"type":"array","items":{"type":"object","additionalProperties":{}}}},"required":["tools"]}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/mcp":{"post":{"tags":["MCP"],"summary":"Appel MCP (legacy tools/list|call, ou Streamable HTTP JSON-RPC)","description":"Sans `jsonrpc` : contrat legacy tools/list|tools/call. Avec `jsonrpc: \"2.0\"` : transport Streamable HTTP (même protocole que `POST /mcp`). Chaque outil exige le scope de sa ressource pour une clé d'API. Préférer `https://api.hiveo.xyz/mcp` pour Cursor.","operationId":"callMcp","security":[{"userJwt":[]},{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpRequest"}}}},"responses":{"200":{"description":"Résultat MCP","content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/consultants":{"get":{"tags":["Consultants"],"summary":"Lister les consultants","description":"Scope clé d'API : `consultants:read`.","operationId":"listConsultants","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"consultants:read","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":500,"default":100,"description":"Taille de page (1-500, défaut 100)","example":50},"required":false,"description":"Taille de page (1-500, défaut 100)","name":"limit","in":"query"},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0,"description":"Décalage (utiliser pagination.next_offset de la page précédente)","example":0},"required":false,"description":"Décalage (utiliser pagination.next_offset de la page précédente)","name":"offset","in":"query"},{"schema":{"type":"string","enum":["active","inactive"],"description":"Collaborateurs actifs ou sortis"},"required":false,"description":"Collaborateurs actifs ou sortis","name":"status","in":"query"},{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"required":false,"name":"agency_id","in":"query"},{"schema":{"type":"string","description":"Tri : colonne, préfixée de « - » pour l'ordre décroissant. Valeurs : last_name, first_name, created_at, updated_at, hire_date. Défaut : last_name","example":"last_name"},"required":false,"description":"Tri : colonne, préfixée de « - » pour l'ordre décroissant. Valeurs : last_name, first_name, created_at, updated_at, hire_date. Défaut : last_name","name":"sort","in":"query"}],"responses":{"200":{"description":"Page de consultants","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsultantPage"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/consultants/{id}":{"get":{"tags":["Consultants"],"summary":"Détail d'un consultant","description":"Scope clé d'API : `consultants:read`.","operationId":"getConsultant","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"consultants:read","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Consultant","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Consultant"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/candidates":{"get":{"tags":["Candidats"],"summary":"Lister les candidats","description":"Scope clé d'API : `candidates:read`.","operationId":"listCandidates","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"candidates:read","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":500,"default":100,"description":"Taille de page (1-500, défaut 100)","example":50},"required":false,"description":"Taille de page (1-500, défaut 100)","name":"limit","in":"query"},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0,"description":"Décalage (utiliser pagination.next_offset de la page précédente)","example":0},"required":false,"description":"Décalage (utiliser pagination.next_offset de la page précédente)","name":"offset","in":"query"},{"schema":{"type":"string","maxLength":100,"description":"Recherche nom, prénom, e-mail, titre"},"required":false,"description":"Recherche nom, prénom, e-mail, titre","name":"q","in":"query"},{"schema":{"type":"string","maxLength":254,"description":"E-mail exact (insensible à la casse) — dédoublonnage"},"required":false,"description":"E-mail exact (insensible à la casse) — dédoublonnage","name":"email","in":"query"},{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"required":false,"name":"stage_id","in":"query"},{"schema":{"type":"string","maxLength":80},"required":false,"name":"source","in":"query"},{"schema":{"type":"string","maxLength":80,"description":"Compétence exacte contenue dans skills"},"required":false,"description":"Compétence exacte contenue dans skills","name":"skill","in":"query"},{"schema":{"type":"string","format":"date-time","example":"2026-09-28T10:00:00Z"},"required":false,"name":"created_after","in":"query"},{"schema":{"type":"string","format":"date-time","example":"2026-09-28T10:00:00Z","description":"Synchronisation incrémentale"},"required":false,"description":"Synchronisation incrémentale","name":"updated_after","in":"query"},{"schema":{"type":"string","description":"Tri : colonne, préfixée de « - » pour l'ordre décroissant. Valeurs : created_at, updated_at, last_name, score. Défaut : -created_at","example":"-created_at"},"required":false,"description":"Tri : colonne, préfixée de « - » pour l'ordre décroissant. Valeurs : created_at, updated_at, last_name, score. Défaut : -created_at","name":"sort","in":"query"}],"responses":{"200":{"description":"Page de candidats","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidatePage"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Candidats"],"summary":"Créer un candidat","description":"Déclenche l'événement webhook `candidate.created`. `source` vaut `api` par défaut.\n\nScope clé d'API : `candidates:write`.","operationId":"createCandidate","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"candidates:write","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidateInput"}}}},"responses":{"201":{"description":"Candidat créé","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Candidate"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/candidates/{id}":{"get":{"tags":["Candidats"],"summary":"Détail d'un candidat","description":"Scope clé d'API : `candidates:read`.","operationId":"getCandidate","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"candidates:read","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Candidat","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Candidate"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"tags":["Candidats"],"summary":"Mettre à jour un candidat","description":"Scope clé d'API : `candidates:write`.","operationId":"updateCandidate","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"candidates:write","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidatePatch"}}}},"responses":{"200":{"description":"Candidat mis à jour","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Candidate"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/companies":{"get":{"tags":["Entreprises"],"summary":"Lister les entreprises","description":"Scope clé d'API : `companies:read`.","operationId":"listCompanies","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"companies:read","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":500,"default":100,"description":"Taille de page (1-500, défaut 100)","example":50},"required":false,"description":"Taille de page (1-500, défaut 100)","name":"limit","in":"query"},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0,"description":"Décalage (utiliser pagination.next_offset de la page précédente)","example":0},"required":false,"description":"Décalage (utiliser pagination.next_offset de la page précédente)","name":"offset","in":"query"},{"schema":{"type":"string","maxLength":100,"description":"Recherche sur le nom"},"required":false,"description":"Recherche sur le nom","name":"q","in":"query"},{"schema":{"type":"string","pattern":"^\\d{9}$"},"required":false,"name":"siren","in":"query"},{"schema":{"type":"string","maxLength":40},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","format":"date-time","example":"2026-09-28T10:00:00Z"},"required":false,"name":"updated_after","in":"query"},{"schema":{"type":"string","description":"Tri : colonne, préfixée de « - » pour l'ordre décroissant. Valeurs : name, created_at, updated_at. Défaut : name","example":"name"},"required":false,"description":"Tri : colonne, préfixée de « - » pour l'ordre décroissant. Valeurs : name, created_at, updated_at. Défaut : name","name":"sort","in":"query"}],"responses":{"200":{"description":"Page d'entreprises","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyPage"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Entreprises"],"summary":"Créer une entreprise","description":"Scope clé d'API : `companies:write`.","operationId":"createCompany","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"companies:write","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyInput"}}}},"responses":{"201":{"description":"Entreprise créée","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Company"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/companies/{id}":{"get":{"tags":["Entreprises"],"summary":"Détail d'une entreprise","description":"Scope clé d'API : `companies:read`.","operationId":"getCompany","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"companies:read","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Entreprise","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Company"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"tags":["Entreprises"],"summary":"Mettre à jour une entreprise","description":"Scope clé d'API : `companies:write`.","operationId":"updateCompany","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"companies:write","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyPatch"}}}},"responses":{"200":{"description":"Entreprise mise à jour","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Company"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects":{"get":{"tags":["Projets"],"summary":"Lister les projets / missions","description":"Scope clé d'API : `projects:read`.","operationId":"listProjects","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"projects:read","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":500,"default":100,"description":"Taille de page (1-500, défaut 100)","example":50},"required":false,"description":"Taille de page (1-500, défaut 100)","name":"limit","in":"query"},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0,"description":"Décalage (utiliser pagination.next_offset de la page précédente)","example":0},"required":false,"description":"Décalage (utiliser pagination.next_offset de la page précédente)","name":"offset","in":"query"},{"schema":{"type":"string","maxLength":100,"description":"Recherche sur le nom"},"required":false,"description":"Recherche sur le nom","name":"q","in":"query"},{"schema":{"type":"string","maxLength":40},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"required":false,"name":"company_id","in":"query"},{"schema":{"type":"string","description":"Tri : colonne, préfixée de « - » pour l'ordre décroissant. Valeurs : created_at, updated_at, name, start_date, end_date. Défaut : -created_at","example":"-created_at"},"required":false,"description":"Tri : colonne, préfixée de « - » pour l'ordre décroissant. Valeurs : created_at, updated_at, name, start_date, end_date. Défaut : -created_at","name":"sort","in":"query"}],"responses":{"200":{"description":"Page de projets","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectPage"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Projets"],"summary":"Créer un projet","description":"Scope clé d'API : `projects:write`.","operationId":"createProject","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"projects:write","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectInput"}}}},"responses":{"201":{"description":"Projet créé","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}":{"get":{"tags":["Projets"],"summary":"Détail d'un projet","description":"Scope clé d'API : `projects:read`.","operationId":"getProject","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"projects:read","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Projet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"tags":["Projets"],"summary":"Mettre à jour un projet","description":"Scope clé d'API : `projects:write`.","operationId":"updateProject","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"projects:write","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectPatch"}}}},"responses":{"200":{"description":"Projet mis à jour","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/assignments":{"get":{"tags":["Projets"],"summary":"Affectations d'un projet","description":"Scope clé d'API : `projects:read`.","operationId":"listProjectAssignments","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"projects:read","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Affectations","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignmentList"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Projets"],"summary":"Affecter un consultant au projet","description":"Crée l'affectation, ou met à jour l'affectation existante du consultant sur ce projet (TJM, rôle, dates). Un consultant peut être affecté à plusieurs projets : une feuille CRA par projet.\n\nScope clé d'API : `projects:write`.","operationId":"assignConsultant","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"projects:write","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignmentInput"}}}},"responses":{"200":{"description":"Affectation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Assignment"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflit avec l'état courant (règle métier)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/job-offers":{"get":{"tags":["Offres"],"summary":"Lister les offres d'emploi / besoins","description":"Scope clé d'API : `job_offers:read`.","operationId":"listJobOffers","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"job_offers:read","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":500,"default":100,"description":"Taille de page (1-500, défaut 100)","example":50},"required":false,"description":"Taille de page (1-500, défaut 100)","name":"limit","in":"query"},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0,"description":"Décalage (utiliser pagination.next_offset de la page précédente)","example":0},"required":false,"description":"Décalage (utiliser pagination.next_offset de la page précédente)","name":"offset","in":"query"},{"schema":{"type":"string","maxLength":100,"description":"Recherche sur l'intitulé"},"required":false,"description":"Recherche sur l'intitulé","name":"q","in":"query"},{"schema":{"type":"string","maxLength":40},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"required":false,"name":"company_id","in":"query"},{"schema":{"type":"string","description":"Tri : colonne, préfixée de « - » pour l'ordre décroissant. Valeurs : created_at, updated_at, title, published_at. Défaut : -created_at","example":"-created_at"},"required":false,"description":"Tri : colonne, préfixée de « - » pour l'ordre décroissant. Valeurs : created_at, updated_at, title, published_at. Défaut : -created_at","name":"sort","in":"query"}],"responses":{"200":{"description":"Page d'offres","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobOfferPage"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Offres"],"summary":"Créer une offre","description":"Scope clé d'API : `job_offers:write`.","operationId":"createJobOffer","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"job_offers:write","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobOfferInput"}}}},"responses":{"201":{"description":"Offre créée","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobOffer"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/job-offers/{id}":{"get":{"tags":["Offres"],"summary":"Détail d'une offre","description":"Scope clé d'API : `job_offers:read`.","operationId":"getJobOffer","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"job_offers:read","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Offre","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobOffer"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"tags":["Offres"],"summary":"Mettre à jour une offre","description":"Scope clé d'API : `job_offers:write`.","operationId":"updateJobOffer","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"job_offers:write","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobOfferPatch"}}}},"responses":{"200":{"description":"Offre mise à jour","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobOffer"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/deals":{"get":{"tags":["Deals"],"summary":"Lister les opportunités","description":"Scope clé d'API : `deals:read`.","operationId":"listDeals","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"deals:read","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":500,"default":100,"description":"Taille de page (1-500, défaut 100)","example":50},"required":false,"description":"Taille de page (1-500, défaut 100)","name":"limit","in":"query"},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0,"description":"Décalage (utiliser pagination.next_offset de la page précédente)","example":0},"required":false,"description":"Décalage (utiliser pagination.next_offset de la page précédente)","name":"offset","in":"query"},{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"required":false,"name":"stage_id","in":"query"},{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"required":false,"name":"company_id","in":"query"},{"schema":{"type":"string","description":"Tri : colonne, préfixée de « - » pour l'ordre décroissant. Valeurs : updated_at, created_at, expected_close_date, value_eur. Défaut : -updated_at","example":"-updated_at"},"required":false,"description":"Tri : colonne, préfixée de « - » pour l'ordre décroissant. Valeurs : updated_at, created_at, expected_close_date, value_eur. Défaut : -updated_at","name":"sort","in":"query"}],"responses":{"200":{"description":"Page de deals","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DealPage"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/deals/{id}":{"get":{"tags":["Deals"],"summary":"Détail d'un deal","description":"Scope clé d'API : `deals:read`.","operationId":"getDeal","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"deals:read","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Deal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Deal"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"tags":["Deals"],"summary":"Mettre à jour un deal","description":"Scope clé d'API : `deals:write`.","operationId":"updateDeal","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"deals:write","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DealPatch"}}}},"responses":{"200":{"description":"Deal mis à jour","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Deal"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/deals/{id}/stage":{"post":{"tags":["Deals"],"summary":"Changer l'étape pipeline d'un deal","description":"Scope clé d'API : `deals:write`.","operationId":"moveDealStage","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"deals:write","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DealStageMove"}}}},"responses":{"200":{"description":"Deal déplacé","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Deal"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/cras":{"get":{"tags":["CRA"],"summary":"Lister les CRA","description":"Multi-projets : un consultant a une feuille CRA par projet et par mois.\n\nScope clé d'API : `cras:read`.","operationId":"listCras","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"cras:read","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":500,"default":100,"description":"Taille de page (1-500, défaut 100)","example":50},"required":false,"description":"Taille de page (1-500, défaut 100)","name":"limit","in":"query"},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0,"description":"Décalage (utiliser pagination.next_offset de la page précédente)","example":0},"required":false,"description":"Décalage (utiliser pagination.next_offset de la page précédente)","name":"offset","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":12},"required":false,"name":"month","in":"query"},{"schema":{"type":"integer","minimum":2000,"maximum":2100},"required":false,"name":"year","in":"query"},{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"required":false,"name":"consultant_id","in":"query"},{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"required":false,"name":"project_id","in":"query"},{"schema":{"type":"string","enum":["draft","submitted","validated","rejected","to_complete"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","description":"Tri : colonne, préfixée de « - » pour l'ordre décroissant. Valeurs : created_at, updated_at, year. Défaut : -year","example":"-year"},"required":false,"description":"Tri : colonne, préfixée de « - » pour l'ordre décroissant. Valeurs : created_at, updated_at, year. Défaut : -year","name":"sort","in":"query"}],"responses":{"200":{"description":"Page de CRA","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CraPage"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/cras/{id}":{"get":{"tags":["CRA"],"summary":"Détail d'un CRA","description":"Scope clé d'API : `cras:read`.","operationId":"getCra","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"cras:read","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"CRA","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Cra"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/cras/{id}/submit":{"post":{"tags":["CRA"],"summary":"Soumettre un CRA","description":"Depuis draft, rejected ou to_complete.\n\nScope clé d'API : `cras:write`.","operationId":"submitCra","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"cras:write","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"CRA soumis","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Cra"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflit avec l'état courant (règle métier)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/cras/{id}/validate":{"post":{"tags":["CRA"],"summary":"Valider un CRA soumis","description":"Contrôle de double saisie multi-feuilles : si un jour est déjà travaillé sur une autre feuille soumise ou validée du consultant ce mois-ci, la validation est refusée (409 `double_booked`, `details.days`). Déclenche l'événement webhook `cra.validated`.\n\nScope clé d'API : `cras:write`.","operationId":"validateCra","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"cras:write","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"CRA validé","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Cra"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflit avec l'état courant (règle métier)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/cras/{id}/reject":{"post":{"tags":["CRA"],"summary":"Refuser un CRA soumis","description":"Scope clé d'API : `cras:write`.","operationId":"rejectCra","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"cras:write","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CraReject"}}}},"responses":{"200":{"description":"CRA refusé","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Cra"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflit avec l'état courant (règle métier)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/invoices":{"get":{"tags":["Factures"],"summary":"Lister les factures","description":"Un brouillon (`draft`) n'a pas de numéro ; `credited` = facture rectifiée par avoir.\n\nScope clé d'API : `invoices:read`.","operationId":"listInvoices","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"invoices:read","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":500,"default":100,"description":"Taille de page (1-500, défaut 100)","example":50},"required":false,"description":"Taille de page (1-500, défaut 100)","name":"limit","in":"query"},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0,"description":"Décalage (utiliser pagination.next_offset de la page précédente)","example":0},"required":false,"description":"Décalage (utiliser pagination.next_offset de la page précédente)","name":"offset","in":"query"},{"schema":{"type":"string","enum":["draft","issued","late","paid","cancelled","credited"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"required":false,"name":"company_id","in":"query"},{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"required":false,"name":"project_id","in":"query"},{"schema":{"type":"string","maxLength":60},"required":false,"name":"invoice_number","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-09-30"},"required":false,"name":"issued_from","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-09-30"},"required":false,"name":"issued_to","in":"query"},{"schema":{"type":"string","description":"Tri : colonne, préfixée de « - » pour l'ordre décroissant. Valeurs : created_at, updated_at, issue_date, due_date, total_ttc. Défaut : -created_at","example":"-created_at"},"required":false,"description":"Tri : colonne, préfixée de « - » pour l'ordre décroissant. Valeurs : created_at, updated_at, issue_date, due_date, total_ttc. Défaut : -created_at","name":"sort","in":"query"}],"responses":{"200":{"description":"Page de factures","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoicePage"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/invoices/{id}":{"get":{"tags":["Factures"],"summary":"Détail d'une facture","description":"Scope clé d'API : `invoices:read`.","operationId":"getInvoice","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"invoices:read","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Facture","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/invoices/from-cra":{"post":{"tags":["Factures"],"summary":"Créer un brouillon de facture depuis un CRA validé","description":"Brouillon SANS numéro : le numéro légal est attribué à l'émission.\n\nScope clé d'API : `invoices:write`.","operationId":"createInvoiceFromCra","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"invoices:write","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceFromCra"}}}},"responses":{"200":{"description":"Brouillon créé","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceFromCraResult"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflit avec l'état courant (règle métier)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/invoices/{id}/issue":{"post":{"tags":["Factures"],"summary":"Émettre une facture brouillon","description":"Attribue le numéro légal et la date d'émission sous verrou (RPC `issue_invoice`, numérotation continue). Idempotent : une facture déjà émise est renvoyée avec `already_issued: true`. Déclenche l'événement webhook `invoice.issued`.\n\nScope clé d'API : `invoices:write`.","operationId":"issueInvoice","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"invoices:write","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceIssue"}}}},"responses":{"200":{"description":"Facture émise","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssuedInvoice"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflit avec l'état courant (règle métier)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/expenses":{"get":{"tags":["Notes de frais"],"summary":"Lister les notes de frais","description":"Scope clé d'API : `expenses:read`.","operationId":"listExpenses","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"expenses:read","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":500,"default":100,"description":"Taille de page (1-500, défaut 100)","example":50},"required":false,"description":"Taille de page (1-500, défaut 100)","name":"limit","in":"query"},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0,"description":"Décalage (utiliser pagination.next_offset de la page précédente)","example":0},"required":false,"description":"Décalage (utiliser pagination.next_offset de la page précédente)","name":"offset","in":"query"},{"schema":{"type":"string","enum":["pending","approved","rejected","cancelled"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"required":false,"name":"consultant_id","in":"query"},{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"required":false,"name":"project_id","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-09-30","description":"expense_date ≥ from"},"required":false,"description":"expense_date ≥ from","name":"from","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-09-30","description":"expense_date ≤ to"},"required":false,"description":"expense_date ≤ to","name":"to","in":"query"},{"schema":{"type":"string","description":"Tri : colonne, préfixée de « - » pour l'ordre décroissant. Valeurs : expense_date, created_at, amount_ttc. Défaut : -expense_date","example":"-expense_date"},"required":false,"description":"Tri : colonne, préfixée de « - » pour l'ordre décroissant. Valeurs : expense_date, created_at, amount_ttc. Défaut : -expense_date","name":"sort","in":"query"}],"responses":{"200":{"description":"Page de notes de frais","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpensePage"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/expenses/{id}":{"get":{"tags":["Notes de frais"],"summary":"Détail d'une note de frais","description":"Scope clé d'API : `expenses:read`.","operationId":"getExpense","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"expenses:read","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Note de frais","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Expense"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/expenses/{id}/decision":{"post":{"tags":["Notes de frais"],"summary":"Approuver ou refuser une note de frais","description":"Uniquement pour une note au statut `pending`. Applique les réglages Validation de l'organisation (justificatif exigé → 409 `missing_receipt` ; note « À vérifier » → 409 `needs_review` sauf `force_review`). Le consultant est notifié par e-mail.\n\nScope clé d'API : `expenses:write`.","operationId":"decideExpense","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"expenses:write","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpenseDecision"}}}},"responses":{"200":{"description":"Note de frais décidée","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Expense"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflit avec l'état courant (règle métier)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/leave-requests":{"get":{"tags":["Congés"],"summary":"Lister les demandes de congé","description":"Scope clé d'API : `leave_requests:read`.","operationId":"listLeaveRequests","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"leave_requests:read","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":500,"default":100,"description":"Taille de page (1-500, défaut 100)","example":50},"required":false,"description":"Taille de page (1-500, défaut 100)","name":"limit","in":"query"},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0,"description":"Décalage (utiliser pagination.next_offset de la page précédente)","example":0},"required":false,"description":"Décalage (utiliser pagination.next_offset de la page précédente)","name":"offset","in":"query"},{"schema":{"type":"string","enum":["pending","approved","rejected","cancelled"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"required":false,"name":"consultant_id","in":"query"},{"schema":{"type":"string","maxLength":40},"required":false,"name":"leave_type","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-09-30","description":"Demandes qui se terminent à partir de cette date"},"required":false,"description":"Demandes qui se terminent à partir de cette date","name":"from","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-09-30","description":"Demandes qui commencent au plus tard à cette date"},"required":false,"description":"Demandes qui commencent au plus tard à cette date","name":"to","in":"query"},{"schema":{"type":"string","description":"Tri : colonne, préfixée de « - » pour l'ordre décroissant. Valeurs : start_date, created_at. Défaut : -start_date","example":"-start_date"},"required":false,"description":"Tri : colonne, préfixée de « - » pour l'ordre décroissant. Valeurs : start_date, created_at. Défaut : -start_date","name":"sort","in":"query"}],"responses":{"200":{"description":"Page de demandes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaveRequestPage"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/leave-requests/{id}":{"get":{"tags":["Congés"],"summary":"Détail d'une demande de congé","description":"Scope clé d'API : `leave_requests:read`.","operationId":"getLeaveRequest","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"leave_requests:read","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Demande de congé","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaveRequest"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/leave-requests/{id}/decision":{"post":{"tags":["Congés"],"summary":"Approuver ou refuser une demande de congé","description":"Uniquement pour une demande `pending`. Si l'organisation bloque l'approbation à solde négatif, l'API refuse d'approuver (409 `balance_check_required`) : le solde n'est calculé que dans Hiveo.\n\nScope clé d'API : `leave_requests:write`.","operationId":"decideLeaveRequest","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"leave_requests:write","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaveDecision"}}}},"responses":{"200":{"description":"Demande décidée","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaveRequest"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflit avec l'état courant (règle métier)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks/endpoints":{"get":{"tags":["Webhooks"],"summary":"Lister les abonnements webhooks","description":"Réservé aux administrateurs de l'organisation (une clé d'API agit au nom de son créateur admin).\n\nScope clé d'API : `webhooks:read`.","operationId":"listWebhookEndpoints","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"webhooks:read","responses":{"200":{"description":"Abonnements","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointList"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Webhooks"],"summary":"Créer un abonnement webhook","description":"Réservé aux administrateurs de l'organisation (une clé d'API agit au nom de son créateur admin). 10 abonnements maximum. L'hôte doit être un nom de domaine public en HTTPS.\n\nScope clé d'API : `webhooks:write`.","operationId":"createWebhookEndpoint","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"webhooks:write","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointInput"}}}},"responses":{"201":{"description":"Abonnement créé (secret affiché une fois)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointCreated"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks/endpoints/{id}":{"patch":{"tags":["Webhooks"],"summary":"Modifier un abonnement webhook","description":"Réservé aux administrateurs de l'organisation (une clé d'API agit au nom de son créateur admin).\n\nScope clé d'API : `webhooks:write`.","operationId":"updateWebhookEndpoint","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"webhooks:write","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointPatch"}}}},"responses":{"200":{"description":"Abonnement modifié","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointUpdated"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Webhooks"],"summary":"Supprimer un abonnement webhook","description":"Réservé aux administrateurs de l'organisation (une clé d'API agit au nom de son créateur admin).\n\nScope clé d'API : `webhooks:write`.","operationId":"deleteWebhookEndpoint","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"webhooks:write","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Supprimé","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointDeleted"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks/endpoints/{id}/test":{"post":{"tags":["Webhooks"],"summary":"Envoyer un événement de test (ping)","description":"Réservé aux administrateurs de l'organisation (une clé d'API agit au nom de son créateur admin). L'événement `ping` part dans la minute.\n\nScope clé d'API : `webhooks:write`.","operationId":"testWebhookEndpoint","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"webhooks:write","parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","example":"3f2504e0-4f89-41d3-9a0c-0305e82c3301"},"required":true,"name":"id","in":"path"}],"responses":{"202":{"description":"Ping enfilé","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookTestQueued"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Ressource introuvable dans votre organisation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks/deliveries":{"get":{"tags":["Webhooks"],"summary":"Journal des livraisons (30 jours)","description":"Réservé aux administrateurs de l'organisation (une clé d'API agit au nom de son créateur admin).\n\nScope clé d'API : `webhooks:read`.","operationId":"listWebhookDeliveries","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"webhooks:read","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":500,"default":100,"description":"Taille de page (1-500, défaut 100)","example":50},"required":false,"description":"Taille de page (1-500, défaut 100)","name":"limit","in":"query"},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0,"description":"Décalage (utiliser pagination.next_offset de la page précédente)","example":0},"required":false,"description":"Décalage (utiliser pagination.next_offset de la page précédente)","name":"offset","in":"query"},{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"required":false,"name":"endpoint_id","in":"query"},{"schema":{"type":"string","enum":["pending","delivering","succeeded","failed","dead","skipped"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","maxLength":60},"required":false,"name":"event_type","in":"query"},{"schema":{"type":"string","description":"Tri : colonne, préfixée de « - » pour l'ordre décroissant. Valeurs : created_at. Défaut : -created_at","example":"-created_at"},"required":false,"description":"Tri : colonne, préfixée de « - » pour l'ordre décroissant. Valeurs : created_at. Défaut : -created_at","name":"sort","in":"query"}],"responses":{"200":{"description":"Livraisons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDeliveryPage"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/reporting/datasets":{"get":{"tags":["Reporting & BI"],"summary":"Lister les jeux de données BI","description":"Module Reporting & BI actif et rôle super_admin, admin_agency, directeur ou business_manager requis (403 `module_inactive` / `forbidden`).\n\nScope clé d'API : `reporting:read`.","operationId":"listReportingDatasets","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"reporting:read","responses":{"200":{"description":"Jeux de données disponibles","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportingDatasetList"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/reporting/datasets/{dataset}":{"get":{"tags":["Reporting & BI"],"summary":"Lire un jeu de données BI (JSON ou CSV, paginé)","description":"Lecture seule, pour Power BI / Excel (voir docs/reporting-power-bi.md). Aucun salaire exposé. CSV : en-têtes `X-Next-Offset` (absent sur la dernière page), `X-Has-More`, `X-Total-Count`.\n\nScope clé d'API : `reporting:read`.","operationId":"getReportingDataset","security":[{"userJwt":[]},{"apiKey":[]}],"x-hiveo-scope":"reporting:read","parameters":[{"schema":{"type":"string","enum":["agencies","clients","consultants","invoices","activity","production","pipeline","costs"],"example":"invoices"},"required":true,"name":"dataset","in":"path"},{"schema":{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])$","description":"Premier mois inclus (YYYY-MM). Défaut : 11 mois avant `to`. 36 mois maximum.","example":"2026-01"},"required":false,"description":"Premier mois inclus (YYYY-MM). Défaut : 11 mois avant `to`. 36 mois maximum.","name":"from","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])$","description":"Dernier mois inclus (YYYY-MM). Défaut : mois en cours.","example":"2026-09"},"required":false,"description":"Dernier mois inclus (YYYY-MM). Défaut : mois en cours.","name":"to","in":"query"},{"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i","description":"Vue d'une agence. Imposée pour un utilisateur (ou une clé créée par un utilisateur) rattaché à une agence hors siège."},"required":false,"description":"Vue d'une agence. Imposée pour un utilisateur (ou une clé créée par un utilisateur) rattaché à une agence hors siège.","name":"agency_id","in":"query"},{"schema":{"type":"string","enum":["json","csv"],"default":"json","description":"json (défaut) ou csv (UTF-8 avec BOM, séparateur virgule)"},"required":false,"description":"json (défaut) ou csv (UTF-8 avec BOM, séparateur virgule)","name":"format","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":1000,"default":500,"description":"Taille de page (1-1000, défaut 500)"},"required":false,"description":"Taille de page (1-1000, défaut 500)","name":"limit","in":"query"},{"schema":{"type":"integer","minimum":0,"maximum":1000000,"default":0,"description":"Décalage (pagination.next_offset de la page précédente, en-tête X-Next-Offset en CSV)"},"required":false,"description":"Décalage (pagination.next_offset de la page précédente, en-tête X-Next-Offset en CSV)","name":"offset","in":"query"}],"responses":{"200":{"description":"Page de lignes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportingDatasetPage"}},"text/csv":{"schema":{"type":"string"}}}},"401":{"description":"Authentification manquante ou invalide (JWT ou clé d'API)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Accès refusé (scope de la clé, rôle, RLS)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Trop de lignes : réduire la période","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}},"required":["error","code"]}}}},"422":{"description":"Paramètres ou corps invalides","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de requêtes de la clé d'API atteinte (voir Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"webhooks":{}}