{"openapi":"3.1.0","info":{"title":"Subsidievinder","description":"AI-gestuurd subsidieadviesplatform — De Subsidieadviseurs × Twin AI","version":"1.0.0"},"paths":{"/api/auth/register":{"post":{"tags":["auth"],"summary":"Register","operationId":"register_api_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login":{"post":{"tags":["auth"],"summary":"Login","description":"Login met optionele 2FA-stap.\n\nFlow:\n  1. Frontend POST { email, password } zonder totp_code\n  2. Als TOTP uit: directe AuthResponse met tokens\n  3. Als TOTP aan en geen code meegestuurd: 200 met TotpChallengeResponse\n  4. Frontend toont code-invoer → POST { email, password, totp_code }\n  5. Server verifieert TOTP, retourneert AuthResponse","operationId":"login_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginWithTotpRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/refresh":{"post":{"tags":["auth"],"summary":"Refresh","operationId":"refresh_api_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPair"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/me":{"get":{"tags":["auth"],"summary":"Me","operationId":"me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/auth/totp/setup":{"post":{"tags":["auth"],"summary":"Totp Setup","description":"Genereer een nieuw TOTP-secret en geef het terug + QR-code data URL.\nHet secret wordt opgeslagen maar TOTP staat nog uit tot verificatie via /totp/verify.","operationId":"totp_setup_api_auth_totp_setup_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TotpSetupResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/auth/totp/verify":{"post":{"tags":["auth"],"summary":"Totp Verify","description":"Verifieer code en activeer 2FA voor de gebruiker.","operationId":"totp_verify_api_auth_totp_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TotpVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/auth/totp/disable":{"post":{"tags":["auth"],"summary":"Totp Disable","description":"Schakel 2FA uit — vereist een geldige code als security-stap.","operationId":"totp_disable_api_auth_totp_disable_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TotpVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/auth/totp/status":{"get":{"tags":["auth"],"summary":"Totp Status","operationId":"totp_status_api_auth_totp_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TotpStatusResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/auth/password/request-reset":{"post":{"tags":["auth"],"summary":"Request Password Reset","description":"Vraag een wachtwoord-reset link aan.\n\nGenereert een token (1u geldig), slaat de hash op, en — als e-mail\ngeconfigureerd is — stuurt een mail. Anders geeft de reset_url direct\nterug zodat de adviseur 'm handmatig kan delen.\n\nSecurity: geeft altijd 'sent: true' terug ongeacht of e-mail bestaat\n(timing-attack preventie). Geen account-enumeration.","operationId":"request_password_reset_api_auth_password_request_reset_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/password/reset":{"post":{"tags":["auth"],"summary":"Reset Password","description":"Voltooi de wachtwoord-reset met token + nieuw wachtwoord.","operationId":"reset_password_api_auth_password_reset_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetConfirm"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clients":{"get":{"tags":["clients"],"summary":"List Clients","operationId":"list_clients_api_clients_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClientOut"},"title":"Response List Clients Api Clients Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["clients"],"summary":"Create Client","operationId":"create_client_api_clients_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clients/{client_id}":{"get":{"tags":["clients"],"summary":"Get Client","operationId":"get_client_api_clients__client_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["clients"],"summary":"Update Client","operationId":"update_client_api_clients__client_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["clients"],"summary":"Delete Client","operationId":"delete_client_api_clients__client_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Client Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clients/import":{"post":{"tags":["clients"],"summary":"Import Clients Csv","description":"Bulk-import klanten uit CSV-bestand.\n\nAccepteert:\n  - Comma- of semicolon-separated CSV\n  - UTF-8 of Latin-1 encoding (auto-detect)\n  - Header-rij met flex naamgeving (zie ACCEPTED_HEADERS)\n\nPer rij: maakt nieuwe klant aan, of slaat over als KvK al bestaat\nbinnen dezelfde organisatie.\nMaximaal 500 rijen per import — voorkomt timeouts.","operationId":"import_clients_csv_api_clients_import_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_import_clients_csv_api_clients_import_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/regelingen":{"get":{"tags":["regelingen"],"summary":"List Regelingen","description":"Interne seed-tabel — vereist login. Voor admin-curated regelingen.","operationId":"list_regelingen_api_regelingen_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RegelingOut"},"title":"Response List Regelingen Api Regelingen Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/regelingen/rvo":{"get":{"tags":["regelingen"],"summary":"List Rvo","description":"Publieke endpoint — live RVO open-data, gefilterd + gepagineerd.\n\nGeen auth vereist (CC-0 licentie). Gebruikt 6-uur in-memory cache zodat\neen burst aan requests RVO niet bombardeert.","operationId":"list_rvo_api_regelingen_rvo_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Zoek in titel/intro/tags/subsidie-namen","title":"Q"},"description":"Zoek in titel/intro/tags/subsidie-namen"},{"name":"sector","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sector"}},{"name":"doelgroep","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doelgroep"}},{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Onze interne code (WBSO-2026 etc.)","title":"Code"},"description":"Onze interne code (WBSO-2026 etc.)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Rvo Api Regelingen Rvo Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/regelingen/rvo/recent":{"get":{"tags":["regelingen"],"summary":"List Rvo Recent","description":"RVO regelingen die in laatste N dagen zijn gewijzigd. Publiek.","operationId":"list_rvo_recent_api_regelingen_rvo_recent_get","parameters":[{"name":"dagen","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":14,"title":"Dagen"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Rvo Recent Api Regelingen Rvo Recent Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/aanvragen":{"get":{"tags":["aanvragen"],"summary":"List Aanvragen","operationId":"list_aanvragen_api_aanvragen_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AanvraagStatus"},{"type":"null"}],"title":"Status"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Client Id"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AanvraagOut"},"title":"Response List Aanvragen Api Aanvragen Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["aanvragen"],"summary":"Create Aanvraag","operationId":"create_aanvraag_api_aanvragen_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AanvraagCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AanvraagOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/aanvragen/{aanvraag_id}":{"get":{"tags":["aanvragen"],"summary":"Get Aanvraag","operationId":"get_aanvraag_api_aanvragen__aanvraag_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"aanvraag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Aanvraag Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AanvraagDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["aanvragen"],"summary":"Update Aanvraag","operationId":"update_aanvraag_api_aanvragen__aanvraag_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"aanvraag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Aanvraag Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AanvraagUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AanvraagOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["aanvragen"],"summary":"Delete Aanvraag","operationId":"delete_aanvraag_api_aanvragen__aanvraag_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"aanvraag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Aanvraag Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/aanvragen/{aanvraag_id}/content":{"post":{"tags":["aanvragen"],"summary":"Upsert Content","operationId":"upsert_content_api_aanvragen__aanvraag_id__content_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"aanvraag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Aanvraag Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AanvraagContentCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AanvraagContentOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/genereer-tekst":{"post":{"tags":["ai"],"summary":"Genereer Tekst","operationId":"genereer_tekst_api_ai_genereer_tekst_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenereerTekstRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenereerTekstResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/ai/pre-audit":{"post":{"tags":["ai"],"summary":"Pre Audit","operationId":"pre_audit_api_ai_pre_audit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreAuditRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreAuditResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/ai/subsidie-scan":{"post":{"tags":["ai"],"summary":"Subsidie Scan","operationId":"subsidie_scan_api_ai_subsidie_scan_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubsidieScanRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubsidieScanResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/ai/verantwoording":{"post":{"tags":["ai"],"summary":"Verantwoording","operationId":"verantwoording_api_ai_verantwoording_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerantwoordingRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerantwoordingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/jobs/{job_id}":{"get":{"tags":["jobs"],"summary":"Get Job Status","operationId":"get_job_status_api_jobs__job_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Job Status Api Jobs  Job Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rapportage/dashboard":{"get":{"tags":["rapportage"],"summary":"Dashboard","operationId":"dashboard_api_rapportage_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RapportageResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/rapportage/activiteit":{"get":{"tags":["rapportage"],"summary":"Activiteit Feed","operationId":"activiteit_feed_api_rapportage_activiteit_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"},"title":"Response Activiteit Feed Api Rapportage Activiteit Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/radar/scan":{"post":{"tags":["radar"],"summary":"Scan Kvk","operationId":"scan_kvk_api_radar_scan_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KVKScanRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyScanResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/radar/search":{"post":{"tags":["radar"],"summary":"Radar Search","operationId":"radar_search_api_radar_search_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/radar/scan-manual":{"post":{"tags":["radar"],"summary":"Scan Manual","operationId":"scan_manual_api_radar_scan_manual_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanManualRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyScanResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/radar/scan-by-name":{"post":{"tags":["radar"],"summary":"Scan By Name","description":"Probeer eerst overheid.io op naam; valt anders terug op Claude AI-profiel.","operationId":"scan_by_name_api_radar_scan_by_name_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanByNameRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyScanResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/radar/scan-suggestion":{"post":{"tags":["radar"],"summary":"Scan From Suggestion","operationId":"scan_from_suggestion_api_radar_scan_suggestion_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanBySuggestionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyScanResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/radar/companies":{"get":{"tags":["radar"],"summary":"List Companies","operationId":"list_companies_api_radar_companies_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CompanyOut"},"type":"array","title":"Response List Companies Api Radar Companies Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/radar/companies/{company_id}":{"get":{"tags":["radar"],"summary":"Company Detail","operationId":"company_detail_api_radar_companies__company_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"company_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Company Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/calculator/wbso":{"post":{"tags":["calculator"],"summary":"Wbso","operationId":"wbso_api_calculator_wbso_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WBSOInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WBSOOutput"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/calculator/mit":{"post":{"tags":["calculator"],"summary":"Mit","operationId":"mit_api_calculator_mit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MITInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MITOutput"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/calculator/eia":{"post":{"tags":["calculator"],"summary":"Eia","operationId":"eia_api_calculator_eia_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EIAInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EIAOutput"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/calculator/slim":{"post":{"tags":["calculator"],"summary":"Slim","operationId":"slim_api_calculator_slim_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SLIMInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SLIMOutput"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/scraper/run":{"post":{"tags":["scraper"],"summary":"Run Scraper","operationId":"run_scraper_api_scraper_run_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScrapeRunResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/scraper/log":{"get":{"tags":["scraper"],"summary":"Scraper Log","operationId":"scraper_log_api_scraper_log_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ScrapeLogEntry"},"type":"array","title":"Response Scraper Log Api Scraper Log Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/zorg/scan":{"post":{"tags":["zorg"],"summary":"Zorg Scan","description":"Scan een zorgorganisatie tegen de zorg-fondsen kennisbank.","operationId":"zorg_scan_api_zorg_scan_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganisatieProfielIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Zorg Scan Api Zorg Scan Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/zorg/fondsen":{"get":{"tags":["zorg"],"summary":"Fondsen Lijst","operationId":"fondsen_lijst_api_zorg_fondsen_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"doelgroep","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Doelgroep"}},{"name":"provincie","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Provincie"}},{"name":"categorie","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Categorie"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Fondsen Lijst Api Zorg Fondsen Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/zorg/fondsen/{code}":{"get":{"tags":["zorg"],"summary":"Fonds Detail","operationId":"fonds_detail_api_zorg_fondsen__code__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Fonds Detail Api Zorg Fondsen  Code  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/zorg/tips":{"get":{"tags":["zorg"],"summary":"Tips","operationId":"tips_api_zorg_tips_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"categorie","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Categorie"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Tips Api Zorg Tips Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/zorg/filters":{"get":{"tags":["zorg"],"summary":"Filter Opties","operationId":"filter_opties_api_zorg_filters_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Filter Opties Api Zorg Filters Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/zorg/aanvraag/genereer":{"post":{"tags":["zorg"],"summary":"Aanvraag Genereer","description":"Genereer een AI-conceptbrief voor een specifiek zorg-fonds.","operationId":"aanvraag_genereer_api_zorg_aanvraag_genereer_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AanvraagGenereerIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Aanvraag Genereer Api Zorg Aanvraag Genereer Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/aanvragen/{aanvraag_id}/toetsing":{"get":{"tags":["dossier"],"summary":"Haal Toetsing","description":"Geef alle DUS-I toetsingsvragen met huidige antwoorden + live score.","operationId":"haal_toetsing_api_aanvragen__aanvraag_id__toetsing_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"aanvraag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Aanvraag Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Haal Toetsing Api Aanvragen  Aanvraag Id  Toetsing Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/aanvragen/{aanvraag_id}/toetsing/{vraag_code}":{"put":{"tags":["dossier"],"summary":"Update Toetsvraag","operationId":"update_toetsvraag_api_aanvragen__aanvraag_id__toetsing__vraag_code__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"aanvraag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Aanvraag Id"}},{"name":"vraag_code","in":"path","required":true,"schema":{"type":"string","title":"Vraag Code"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToetsAntwoordIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Update Toetsvraag Api Aanvragen  Aanvraag Id  Toetsing  Vraag Code  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/aanvragen/{aanvraag_id}/documenten":{"get":{"tags":["dossier"],"summary":"Haal Documenten","operationId":"haal_documenten_api_aanvragen__aanvraag_id__documenten_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"aanvraag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Aanvraag Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Haal Documenten Api Aanvragen  Aanvraag Id  Documenten Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/aanvragen/{aanvraag_id}/documenten/{doc_id}":{"patch":{"tags":["dossier"],"summary":"Update Document","operationId":"update_document_api_aanvragen__aanvraag_id__documenten__doc_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"aanvraag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Aanvraag Id"}},{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Doc Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentStatusIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Update Document Api Aanvragen  Aanvraag Id  Documenten  Doc Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/aanvragen/{aanvraag_id}/documenten/{doc_id}/upload":{"post":{"tags":["dossier"],"summary":"Upload Document Bestand","description":"Upload een bestand voor een document-checklist item.\n\nAccepteert multipart/form-data. Maximaal 10 MB. Het bestand wordt als\nbase64 opgeslagen; de status wordt automatisch op 'aanwezig' gezet.","operationId":"upload_document_bestand_api_aanvragen__aanvraag_id__documenten__doc_id__upload_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"aanvraag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Aanvraag Id"}},{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Doc Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_document_bestand_api_aanvragen__aanvraag_id__documenten__doc_id__upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Upload Document Bestand Api Aanvragen  Aanvraag Id  Documenten  Doc Id  Upload Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/aanvragen/{aanvraag_id}/documenten/{doc_id}/download":{"get":{"tags":["dossier"],"summary":"Download Document Bestand","description":"Download het geüploade bestand voor een document-checklist item.\n\nRetourneert een binary response met het originele MIME-type en een\nContent-Disposition header voor de browser.","operationId":"download_document_bestand_api_aanvragen__aanvraag_id__documenten__doc_id__download_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"aanvraag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Aanvraag Id"}},{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/aanvragen/{aanvraag_id}/notities":{"get":{"tags":["dossier"],"summary":"Haal Notities","operationId":"haal_notities_api_aanvragen__aanvraag_id__notities_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"aanvraag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Aanvraag Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Haal Notities Api Aanvragen  Aanvraag Id  Notities Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["dossier"],"summary":"Voeg Notitie Toe","operationId":"voeg_notitie_toe_api_aanvragen__aanvraag_id__notities_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"aanvraag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Aanvraag Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotitieIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Voeg Notitie Toe Api Aanvragen  Aanvraag Id  Notities Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/aanvragen/_dossier/fase-flow":{"get":{"tags":["dossier","dossier"],"summary":"Fase Flow Referentie","operationId":"fase_flow_referentie_api_aanvragen__dossier_fase_flow_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Fase Flow Referentie Api Aanvragen  Dossier Fase Flow Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/aanvragen/_dossier/toetsvragen-templates":{"get":{"tags":["dossier","dossier"],"summary":"Toetsvragen Templates","operationId":"toetsvragen_templates_api_aanvragen__dossier_toetsvragen_templates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Toetsvragen Templates Api Aanvragen  Dossier Toetsvragen Templates Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/klant-portaal/tokens":{"post":{"tags":["klant-portaal"],"summary":"Create Token","description":"Genereer een nieuw klant-portaal token voor een aanvraag.\n\nTrekt automatisch oude actieve tokens voor dezelfde aanvraag in (max 1 actief).","operationId":"create_token_api_klant_portaal_tokens_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/klant-portaal/tokens/{aanvraag_id}":{"get":{"tags":["klant-portaal"],"summary":"List Tokens","description":"Lijst alle tokens (actief + ingetrokken) voor een aanvraag.","operationId":"list_tokens_api_klant_portaal_tokens__aanvraag_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"aanvraag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Aanvraag Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TokenOut"},"title":"Response List Tokens Api Klant Portaal Tokens  Aanvraag Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/klant-portaal/tokens/{token_id}":{"delete":{"tags":["klant-portaal"],"summary":"Revoke Token","description":"Trek een token expliciet in. Klant ziet vanaf nu 'verlopen' bericht.","operationId":"revoke_token_api_klant_portaal_tokens__token_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Token Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/k/{token}":{"get":{"tags":["klant-portaal"],"summary":"Klant View","description":"Klant-portaal: bekijk dossier (read-only) met de documentenlijst.","operationId":"klant_view_api_k__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KlantDossierResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/k/{token}/documenten/{doc_id}/upload":{"post":{"tags":["klant-portaal"],"summary":"Klant Upload","description":"Klant uploadt een document zonder login (alleen via geldige token).","operationId":"klant_upload_api_k__token__documenten__doc_id__upload_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Doc Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_klant_upload_api_k__token__documenten__doc_id__upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/k/{token}/notities":{"post":{"tags":["klant-portaal"],"summary":"Klant Notitie","description":"Klant stuurt een bericht/notitie naar de adviseur.\n\nGeen auth nodig — alleen geldig token. De notitie wordt opgeslagen als\nAanvraagNotitie met type='klant_bericht' zodat de adviseur 'm in zijn\ndossier-panel ziet.","operationId":"klant_notitie_api_k__token__notities_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KlantNotitieRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/aanvragen/{aanvraag_id}/export":{"get":{"tags":["export"],"summary":"Export Dossier","description":"Download complete dossier als ZIP. Vereist auth + cross-tenant guard.","operationId":"export_dossier_api_aanvragen__aanvraag_id__export_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"aanvraag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Aanvraag Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/public-checkout-url":{"get":{"tags":["billing"],"summary":"Public Checkout Url","description":"Marketing CTA endpoint — geeft een URL terug om naar te redirecten.\n\nWorkflow:\n  1. Als Stripe geconfigureerd + plan heeft Price ID: maak echte Stripe\n     Checkout session zonder customer (Stripe vraagt email tijdens flow)\n  2. Anders: redirect naar /register?plan=... zodat de user eerst een\n     account maakt — dan kan in-app checkout met juiste org_id\n\nGeen auth vereist. Idempotent — kan gerust gepoll worden.","operationId":"public_checkout_url_api_billing_public_checkout_url_get","parameters":[{"name":"plan","in":"query","required":false,"schema":{"type":"string","default":"professional","title":"Plan"}},{"name":"trial","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Trial"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Public Checkout Url Api Billing Public Checkout Url Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/checkout":{"post":{"tags":["billing"],"summary":"Create Checkout","description":"Maak een checkout-sessie aan voor het gekozen plan.\n\nReturns:\n  - Stripe URL als STRIPE_SECRET_KEY gezet is\n  - Mollie URL als MOLLIE_API_KEY gezet is\n  - Stub URL anders (UI-melding \"Plan een gesprek\")","operationId":"create_checkout_api_billing_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/billing/webhook":{"post":{"tags":["billing"],"summary":"Stripe Webhook","description":"Stripe webhook endpoint — handle subscription lifecycle events.\n\nConfigureer in Stripe Dashboard:\n  Webhook URL: https://subsidieai-pro-api.fly.dev/api/billing/webhook\n  Events: checkout.session.completed, customer.subscription.created,\n          customer.subscription.updated, customer.subscription.deleted,\n          invoice.payment_succeeded, invoice.payment_failed\n\nVereist STRIPE_WEBHOOK_SECRET env var voor signature verification.\nZonder secret: accepteert events maar valideert niet (alleen voor lokale test).","operationId":"stripe_webhook_api_billing_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Stripe Webhook Api Billing Webhook Post"}}}}}}},"/api/billing/customer-portal":{"post":{"tags":["billing"],"summary":"Customer Portal","description":"Genereer Stripe Customer Portal URL voor de huidige user's organisatie.\n\nCustomer Portal laat klanten: factuur-historie zien, payment-method updaten,\nplan switchen, subscription cancelen. Zonder dat wij dat zelf hoeven bouwen.","operationId":"customer_portal_api_billing_customer_portal_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Customer Portal Api Billing Customer Portal Post"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/kvk/zoek":{"get":{"tags":["kvk"],"summary":"Zoek Bedrijven","description":"Live autocomplete: naam of KVK → lijst suggesties.\n\nProbeert in volgorde:\n  1. overheid.io OpenKVK (als OVERHEID_IO_KEY gezet)\n  2. Lokale mock-database (6 demo-bedrijven + naam-zoek)\n\nGeen auth nodig — voor publieke leadgen.","operationId":"zoek_bedrijven_api_kvk_zoek_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"description":"Naam of KVK-nummer (min 2 tekens)","title":"Q"},"description":"Naam of KVK-nummer (min 2 tekens)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":8,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Zoek Bedrijven Api Kvk Zoek Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kvk/stats":{"get":{"tags":["kvk"],"summary":"Cache Stats Publiek","description":"Hoeveel bedrijven hebben we al in onze permanente DB cache?\n\nPubliek leesbaar — toont ons de groei van eigen KVK-database.","operationId":"cache_stats_publiek_api_kvk_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Cache Stats Publiek Api Kvk Stats Get"}}}}}}},"/api/kvk/{kvk_nummer}":{"get":{"tags":["kvk"],"summary":"Haal Bedrijf Op","description":"Volledig bedrijfsprofiel op basis van KVK-nummer.\n\nLookup chain:\n  1. Redis cache (24u TTL)\n  2. Demo mock (KVK 11111111-66666666)\n  3. overheid.io (echte data, vereist API key)\n  4. KVK Open Data HVDS (gratis, geen key)\n  5. KVK test-API\n  6. Deterministische generic mock\n\nAltijd geldig resultaat (worst-case: mock), NOOIT een 404.","operationId":"haal_bedrijf_op_api_kvk__kvk_nummer__get","parameters":[{"name":"kvk_nummer","in":"path","required":true,"schema":{"type":"string","title":"Kvk Nummer"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Haal Bedrijf Op Api Kvk  Kvk Nummer  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kvk/admin/sync-wikidata":{"post":{"tags":["kvk"],"summary":"Sync Wikidata","description":"Bulk-sync alle Nederlandse bedrijven met KVK-nummer uit Wikidata.\n\nDoel: organisch groeien naar een eigen gratis KVK-database zonder\nexterne rate-limits. Wikidata heeft momenteel ~4710 NL bedrijven met\nKVK-nummer en groeit langzaam.\n\nGeschat: 2-5 minuten voor volledige sync.","operationId":"sync_wikidata_api_kvk_admin_sync_wikidata_post","parameters":[{"name":"alleen_nieuw","in":"query","required":false,"schema":{"type":"boolean","description":"Skip bestaande KVK-nummers","default":false,"title":"Alleen Nieuw"},"description":"Skip bestaande KVK-nummers"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Sync Wikidata Api Kvk Admin Sync Wikidata Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/leads/wbso-calc":{"post":{"tags":["leads"],"summary":"Lead Wbso Calc","description":"Capture lead vanaf WBSO calculator + stuur resultaat-mail.","operationId":"lead_wbso_calc_api_leads_wbso_calc_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WBSOLeadIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Lead Wbso Calc Api Leads Wbso Calc Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/leads/kalender":{"post":{"tags":["leads"],"summary":"Lead Kalender","description":"Capture lead vanaf exit-intent of /resources/kalender — stuur PDF.","operationId":"lead_kalender_api_leads_kalender_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KalenderLeadIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Lead Kalender Api Leads Kalender Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/leads/count":{"get":{"tags":["leads"],"summary":"Lead Count","description":"Publieke stat — hoeveel leads in totaal? Voor 'social proof' op landing.","operationId":"lead_count_api_leads_count_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"integer"},"type":"object","title":"Response Lead Count Api Leads Count Get"}}}}}}},"/api/leads/csv":{"get":{"tags":["leads"],"summary":"Lead Csv","description":"Export leads als CSV — voor analyse in Excel / Google Sheets.\n\nGeen auth in MVP — bedoeld voor admin-only middleware in volgende sessie.\nDefault 1000 rijen; max 10.000.","operationId":"lead_csv_api_leads_csv_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":1000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/leads/purge-test":{"delete":{"tags":["leads"],"summary":"Lead Purge Test","description":"Verwijder test-leads (emails eindigend op @test.nl of @example.nl/com/org).\n\nAdmin-only. Gebruik na E2E-tests om DB schoon te houden.","operationId":"lead_purge_test_api_leads_purge_test_delete","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Lead Purge Test Api Leads Purge Test Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/leads/{lead_id}":{"delete":{"tags":["leads"],"summary":"Lead Delete","description":"Verwijder één specifieke lead op ID. Admin-only.","operationId":"lead_delete_api_leads__lead_id__delete","parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"integer","title":"Lead Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Lead Delete Api Leads  Lead Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/leads/list":{"get":{"tags":["leads"],"summary":"Lead List","description":"Admin endpoint — laatste N leads voor /admin/leads dashboard.\n\nGeen auth in deze MVP — bedoeld voor admin-only middleware in volgende sessie.\nBevat geen PII anders dan e-mail + bron — payload-velden zijn aggregaat.","operationId":"lead_list_api_leads_list_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Lead List Api Leads List Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/errors":{"post":{"tags":["errors"],"summary":"Capture Client Error","description":"Opslaan + optioneel doorsturen.","operationId":"capture_client_error_api_errors_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientErrorIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Capture Client Error Api Errors Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/errors/recent":{"get":{"tags":["errors"],"summary":"Recent Errors","description":"Admin view — laatste N client errors.","operationId":"recent_errors_api_errors_recent_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Recent Errors Api Errors Recent Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kalender/pdf":{"get":{"tags":["kalender"],"summary":"Kalender Pdf","description":"Subsidiekalender 2026 als PDF — publiek beschikbaar.","operationId":"kalender_pdf_api_kalender_pdf_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/kalender/ical":{"get":{"tags":["kalender"],"summary":"Kalender Ical","description":"Subsidiekalender als iCal — importeerbaar in Google Calendar/Outlook.","operationId":"kalender_ical_api_kalender_ical_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/gdpr/my-data":{"get":{"tags":["gdpr"],"summary":"Export My Data","description":"AVG Art. 15 — geef alle persoonsgegevens van de ingelogde user terug.\n\nInclusief: user-record, organisatie, aanvragen, klanten (waar user owner is),\nactiviteitlog. Excludeert: andere users' data, system-wide data.","operationId":"export_my_data_api_gdpr_my_data_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Export My Data Api Gdpr My Data Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/gdpr/my-data.zip":{"get":{"tags":["gdpr"],"summary":"Export My Data Zip","description":"Hetzelfde als /my-data maar als download (JSON binnen ZIP).","operationId":"export_my_data_zip_api_gdpr_my_data_zip_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/gdpr/request-deletion":{"post":{"tags":["gdpr"],"summary":"Request Deletion","description":"AVG Art. 17 — markeer account voor deletion binnen 30 dagen.\n\nWij houden ons aan de wet: data wordt 30 dagen bewaard (kan herstart\nworden indien gebruiker zich bedenkt) en daarna definitief gewist.\n\nImplementatie nu: log alleen het verzoek — handmatige verwerking. In\nsessie 5 wordt dit een geautomatiseerd cron-proces.","operationId":"request_deletion_api_gdpr_request_deletion_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Request Deletion Api Gdpr Request Deletion Post"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/affiliate/register":{"post":{"tags":["affiliate"],"summary":"Affiliate Register","description":"Schrijf nieuwe affiliate in en geef unieke code terug.","operationId":"affiliate_register_api_affiliate_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Affiliate Register Api Affiliate Register Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/affiliate/click":{"post":{"tags":["affiliate"],"summary":"Affiliate Click","description":"Track een click — gebeurt automatisch wanneer iemand met ?ref=CODE landt.","operationId":"affiliate_click_api_affiliate_click_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClickIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Affiliate Click Api Affiliate Click Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/affiliate/conversion":{"post":{"tags":["affiliate"],"summary":"Affiliate Conversion","description":"Track conversie (lead/trial/paid) — aangeroepen door interne flow.\n\nVoorlopig open endpoint — in productie achter admin-auth zetten.","operationId":"affiliate_conversion_api_affiliate_conversion_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversionIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Affiliate Conversion Api Affiliate Conversion Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/affiliate/{code}/stats":{"get":{"tags":["affiliate"],"summary":"Affiliate Stats","description":"Publiek (read-only) dashboard-data voor één affiliate.\n\nGeen auth — affiliate code zelf is het 'geheim'. Code-rotatie indien gecompromiteerd.","operationId":"affiliate_stats_api_affiliate__code__stats_get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Affiliate Stats Api Affiliate  Code  Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/marketing/linkedin-post":{"post":{"tags":["marketing"],"summary":"Linkedin Post","description":"Genereer een LinkedIn-post op basis van topic + toon.\n\nBedoeld voor adviseurs die regelmatig willen posten over subsidie-trends\nmaar geen tijd hebben voor copywriting. Wij genereren een eerste draft —\nde adviseur edit dat in 2 minuten naar persoonlijke stem.\n\nGeen auth — rate-limited per IP (60/min via global rate limit).","operationId":"linkedin_post_api_marketing_linkedin_post_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInPostIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Linkedin Post Api Marketing Linkedin Post Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/marketing/email-draft":{"post":{"tags":["marketing"],"summary":"Email Draft","description":"Genereer e-mail draft voor lifecycle-marketing.\n\nTe gebruiken door admin om snel een eerste versie te krijgen voordat\nde redactie het personaliseert.","operationId":"email_draft_api_marketing_email_draft_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailDraftIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Email Draft Api Marketing Email Draft Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/seo/config":{"get":{"tags":["seo"],"summary":"Get Config","description":"Geeft alle huidige site_settings terug. Publiek (waarden zijn al in HTML zichtbaar).","operationId":"get_config_api_seo_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Config Api Seo Config Get"}}}}}},"post":{"tags":["seo"],"summary":"Set Config","description":"Upsert een setting. Admin-only.","operationId":"set_config_api_seo_config_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Set Config Api Seo Config Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/seo/config/{key}":{"delete":{"tags":["seo"],"summary":"Delete Setting","operationId":"delete_setting_api_seo_config__key__delete","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Delete Setting Api Seo Config  Key  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"tags":["health"],"summary":"Health","description":"Snelle health check zonder DB-query — gebruikt door Fly + load balancers.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Health Health Get"}}}}}}},"/api/status":{"get":{"tags":["health"],"summary":"Status","description":"Uitgebreide status check — gebruikt door monitoring tools.\n\nChecks:\n  - Database connectivity (SELECT 1)\n  - Anthropic API key configured\n  - Uptime since process started\n  - App version + environment","operationId":"status_api_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"tags":["health"],"summary":"Root","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Root  Get"}}}}}}}},"components":{"schemas":{"AanvraagContentCreate":{"properties":{"sectie":{"type":"string","maxLength":100,"minLength":1,"title":"Sectie"},"inhoud":{"type":"string","maxLength":200000,"title":"Inhoud","default":""},"ai_gegenereerd":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ai Gegenereerd"}},"type":"object","required":["sectie"],"title":"AanvraagContentCreate"},"AanvraagContentOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"sectie":{"type":"string","title":"Sectie"},"inhoud":{"type":"string","title":"Inhoud"},"ai_gegenereerd":{"type":"boolean","title":"Ai Gegenereerd"},"versie":{"type":"integer","title":"Versie"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","sectie","inhoud","ai_gegenereerd","versie","updated_at"],"title":"AanvraagContentOut"},"AanvraagCreate":{"properties":{"client_id":{"type":"string","format":"uuid","title":"Client Id"},"regeling_id":{"type":"string","format":"uuid","title":"Regeling Id"},"titel":{"type":"string","maxLength":255,"minLength":2,"title":"Titel"},"bedrag":{"anyOf":[{"type":"number","maximum":100000000.0,"exclusiveMinimum":0.0},{"type":"string"},{"type":"null"}],"title":"Bedrag"},"deadline":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Deadline"}},"type":"object","required":["client_id","regeling_id","titel"],"title":"AanvraagCreate"},"AanvraagDetailOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"titel":{"type":"string","title":"Titel"},"status":{"$ref":"#/components/schemas/AanvraagStatus"},"bedrag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bedrag"},"deadline":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Deadline"},"ai_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ai Score"},"client":{"$ref":"#/components/schemas/ClientOut"},"regeling":{"$ref":"#/components/schemas/RegelingOut"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"content_items":{"items":{"$ref":"#/components/schemas/AanvraagContentOut"},"type":"array","title":"Content Items","default":[]}},"type":"object","required":["id","titel","status","bedrag","deadline","ai_score","client","regeling","created_at","updated_at"],"title":"AanvraagDetailOut"},"AanvraagGenereerIn":{"properties":{"organisatie":{"$ref":"#/components/schemas/OrganisatieProfielIn"},"fonds_code":{"type":"string","maxLength":80,"minLength":1,"title":"Fonds Code"},"project_titel":{"type":"string","maxLength":200,"minLength":2,"title":"Project Titel"},"project_doelstelling":{"type":"string","maxLength":2000,"minLength":10,"title":"Project Doelstelling"},"project_doelgroep":{"type":"string","maxLength":1000,"title":"Project Doelgroep","default":""},"project_activiteiten":{"type":"string","maxLength":2000,"title":"Project Activiteiten","default":""},"gevraagd_bedrag":{"anyOf":[{"type":"number","maximum":10000000.0,"minimum":0.0},{"type":"null"}],"title":"Gevraagd Bedrag"},"looptijd_maanden":{"anyOf":[{"type":"integer","maximum":120.0,"minimum":1.0},{"type":"null"}],"title":"Looptijd Maanden"}},"type":"object","required":["organisatie","fonds_code","project_titel","project_doelstelling"],"title":"AanvraagGenereerIn"},"AanvraagOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"titel":{"type":"string","title":"Titel"},"status":{"$ref":"#/components/schemas/AanvraagStatus"},"bedrag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bedrag"},"deadline":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Deadline"},"ai_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ai Score"},"client":{"$ref":"#/components/schemas/ClientOut"},"regeling":{"$ref":"#/components/schemas/RegelingOut"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","titel","status","bedrag","deadline","ai_score","client","regeling","created_at","updated_at"],"title":"AanvraagOut"},"AanvraagStatus":{"type":"string","enum":["concept","in_review","ingediend","toegekend","afgewezen","verantwoording","afgerond"],"title":"AanvraagStatus"},"AanvraagUpdate":{"properties":{"titel":{"anyOf":[{"type":"string","maxLength":255,"minLength":2},{"type":"null"}],"title":"Titel"},"status":{"anyOf":[{"$ref":"#/components/schemas/AanvraagStatus"},{"type":"null"}]},"bedrag":{"anyOf":[{"type":"number","maximum":100000000.0,"minimum":0.0},{"type":"string"},{"type":"null"}],"title":"Bedrag"},"deadline":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Deadline"}},"type":"object","title":"AanvraagUpdate"},"AuthResponse":{"properties":{"tokens":{"$ref":"#/components/schemas/TokenPair"},"user":{"$ref":"#/components/schemas/UserOut"},"organization":{"$ref":"#/components/schemas/OrganizationOut"}},"type":"object","required":["tokens","user","organization"],"title":"AuthResponse"},"BedrijfSuggestionOut":{"properties":{"bron_id":{"type":"string","title":"Bron Id"},"kvk_nummer":{"type":"string","title":"Kvk Nummer"},"handelsnaam":{"type":"string","title":"Handelsnaam"},"plaats":{"type":"string","title":"Plaats"},"bron":{"type":"string","title":"Bron"}},"type":"object","required":["bron_id","kvk_nummer","handelsnaam","plaats","bron"],"title":"BedrijfSuggestionOut"},"BedrijfsProfiel":{"properties":{"sector":{"type":"string","title":"Sector"},"grootte":{"type":"string","enum":["zzp","mkb_klein","mkb_middel","mkb_groot","corporate"],"title":"Grootte"},"activiteiten":{"type":"string","minLength":10,"title":"Activiteiten"},"regio":{"type":"string","title":"Regio"},"budget_indicatie":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Budget Indicatie"},"innovatiegraad":{"anyOf":[{"type":"string","enum":["laag","middel","hoog"]},{"type":"null"}],"title":"Innovatiegraad"}},"type":"object","required":["sector","grootte","activiteiten","regio"],"title":"BedrijfsProfiel"},"Body_import_clients_csv_api_clients_import_post":{"properties":{"bestand":{"type":"string","format":"binary","title":"Bestand"}},"type":"object","required":["bestand"],"title":"Body_import_clients_csv_api_clients_import_post"},"Body_klant_upload_api_k__token__documenten__doc_id__upload_post":{"properties":{"bestand":{"type":"string","format":"binary","title":"Bestand"}},"type":"object","required":["bestand"],"title":"Body_klant_upload_api_k__token__documenten__doc_id__upload_post"},"Body_upload_document_bestand_api_aanvragen__aanvraag_id__documenten__doc_id__upload_post":{"properties":{"bestand":{"type":"string","format":"binary","title":"Bestand"}},"type":"object","required":["bestand"],"title":"Body_upload_document_bestand_api_aanvragen__aanvraag_id__documenten__doc_id__upload_post"},"CheckoutRequest":{"properties":{"plan":{"type":"string","title":"Plan"}},"type":"object","required":["plan"],"title":"CheckoutRequest"},"CheckoutResponse":{"properties":{"checkout_url":{"type":"string","title":"Checkout Url"},"provider":{"type":"string","title":"Provider"},"configured":{"type":"boolean","title":"Configured"}},"type":"object","required":["checkout_url","provider","configured"],"title":"CheckoutResponse"},"ClickIn":{"properties":{"code":{"type":"string","maxLength":16,"title":"Code"},"landing_path":{"type":"string","maxLength":500,"title":"Landing Path","default":"/"},"referrer":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Referrer"}},"type":"object","required":["code"],"title":"ClickIn"},"ClientCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":2,"title":"Name"},"kvk":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Kvk"},"sector":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Sector"},"contact_email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Contact Email"}},"type":"object","required":["name"],"title":"ClientCreate"},"ClientErrorIn":{"properties":{"message":{"type":"string","maxLength":2000,"title":"Message"},"stack":{"anyOf":[{"type":"string","maxLength":8000},{"type":"null"}],"title":"Stack"},"filename":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Filename"},"lineno":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lineno"},"url":{"type":"string","maxLength":500,"title":"Url"},"userAgent":{"type":"string","maxLength":500,"title":"Useragent"},"timestamp":{"type":"string","maxLength":40,"title":"Timestamp"}},"type":"object","required":["message","url","userAgent","timestamp"],"title":"ClientErrorIn"},"ClientOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"kvk":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kvk"},"sector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sector"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email"}},"type":"object","required":["id","name","kvk","sector","contact_email"],"title":"ClientOut"},"ClientUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"kvk":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kvk"},"sector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sector"},"contact_email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Contact Email"}},"type":"object","title":"ClientUpdate"},"CompanyDetailResponse":{"properties":{"company":{"$ref":"#/components/schemas/CompanyOut"},"summary":{"$ref":"#/components/schemas/ScanSummary"},"scan_results":{"items":{"$ref":"#/components/schemas/ScanResultOut"},"type":"array","title":"Scan Results"}},"type":"object","required":["company","summary","scan_results"],"title":"CompanyDetailResponse"},"CompanyOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"kvk":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kvk"},"rechtsvorm":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rechtsvorm"},"sbi_codes":{"items":{"type":"string"},"type":"array","title":"Sbi Codes"},"sbi_omschrijvingen":{"items":{"type":"string"},"type":"array","title":"Sbi Omschrijvingen"},"activiteitsomschrijving":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Activiteitsomschrijving"},"aantal_medewerkers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Aantal Medewerkers"},"postcode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postcode"},"straat":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Straat"},"huisnummer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Huisnummer"},"gemeente":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gemeente"},"provincie":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provincie"},"oprichtingsdatum":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Oprichtingsdatum"},"bedrijfsgrootte":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bedrijfsgrootte"},"is_starter":{"type":"boolean","title":"Is Starter"},"omzet_indicatie":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Omzet Indicatie"},"lat":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lon"},"bag_pand_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bag Pand Id"},"bag_vbo_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bag Vbo Id"},"bouwjaar":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bouwjaar"},"oppervlakte_m2":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Oppervlakte M2"},"gebruiksdoel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gebruiksdoel"},"wijk_naam":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wijk Naam"},"buurt_naam":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Buurt Naam"},"inwoners_buurt":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Inwoners Buurt"},"gem_inkomen_buurt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gem Inkomen Buurt"},"bevolkingsdichtheid":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bevolkingsdichtheid"},"energielabel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Energielabel"},"enrichment_data":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Enrichment Data"}},"type":"object","required":["id","name","kvk","rechtsvorm","sbi_codes","sbi_omschrijvingen","activiteitsomschrijving","aantal_medewerkers","postcode","gemeente","provincie","oprichtingsdatum","bedrijfsgrootte","is_starter","omzet_indicatie"],"title":"CompanyOut"},"CompanyScanResponse":{"properties":{"company":{"$ref":"#/components/schemas/CompanyOut"},"summary":{"$ref":"#/components/schemas/ScanSummary"},"top_matches":{"items":{"$ref":"#/components/schemas/ScanResultOut"},"type":"array","title":"Top Matches"}},"type":"object","required":["company","summary","top_matches"],"title":"CompanyScanResponse"},"ConversionIn":{"properties":{"code":{"type":"string","maxLength":16,"title":"Code"},"type":{"type":"string","maxLength":40,"title":"Type"},"email":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Email"},"value_eur":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value Eur"}},"type":"object","required":["code","type"],"title":"ConversionIn"},"DocumentStatusIn":{"properties":{"status":{"type":"string","pattern":"^(ontbreekt|aanwezig|afgekeurd)$","title":"Status"},"omschrijving":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Omschrijving"}},"type":"object","required":["status"],"title":"DocumentStatusIn"},"EIAInput":{"properties":{"investeringsbedrag":{"type":"number","maximum":200000000.0,"minimum":2500.0,"title":"Investeringsbedrag"},"vpb_tarief":{"type":"number","maximum":0.4,"minimum":0.0,"title":"Vpb Tarief","default":0.258}},"type":"object","required":["investeringsbedrag"],"title":"EIAInput"},"EIAOutput":{"properties":{"regeling":{"type":"string","title":"Regeling","default":"EIA 2026"},"investeringsbedrag":{"type":"integer","title":"Investeringsbedrag"},"aftrekbaar":{"type":"integer","title":"Aftrekbaar"},"netto_voordeel":{"type":"integer","title":"Netto Voordeel"},"effectief_percentage":{"type":"number","title":"Effectief Percentage"},"toelichting":{"type":"string","title":"Toelichting"}},"type":"object","required":["investeringsbedrag","aftrekbaar","netto_voordeel","effectief_percentage","toelichting"],"title":"EIAOutput"},"EmailDraftIn":{"properties":{"type":{"type":"string","title":"Type","description":"welcome | trial_nudge | re_engagement | newsletter"},"customer_naam":{"type":"string","maxLength":120,"title":"Customer Naam","default":"adviseur"},"context":{"type":"string","maxLength":500,"title":"Context","default":""}},"type":"object","required":["type"],"title":"EmailDraftIn"},"GenereerTekstRequest":{"properties":{"regeling_naam":{"type":"string","maxLength":255,"minLength":2,"title":"Regeling Naam"},"klant_info":{"type":"object","title":"Klant Info"},"project_beschrijving":{"type":"string","minLength":10,"title":"Project Beschrijving"},"sectie_type":{"type":"string","enum":["projectomschrijving","motivatie","innovatie","begroting_toelichting","planning","impact","samenwerking"],"title":"Sectie Type"},"extra_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extra Context"}},"type":"object","required":["regeling_naam","klant_info","project_beschrijving","sectie_type"],"title":"GenereerTekstRequest"},"GenereerTekstResponse":{"properties":{"tekst":{"type":"string","title":"Tekst"},"sectie_type":{"type":"string","title":"Sectie Type"},"woorden":{"type":"integer","title":"Woorden"}},"type":"object","required":["tekst","sectie_type","woorden"],"title":"GenereerTekstResponse"},"GrafiekPunt":{"properties":{"label":{"type":"string","title":"Label"},"waarde":{"type":"number","title":"Waarde"}},"type":"object","required":["label","waarde"],"title":"GrafiekPunt"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImportResult":{"properties":{"totaal":{"type":"integer","title":"Totaal"},"aangemaakt":{"type":"integer","title":"Aangemaakt"},"overgeslagen":{"type":"integer","title":"Overgeslagen"},"fouten":{"type":"integer","title":"Fouten"},"rijen":{"items":{"$ref":"#/components/schemas/ImportRow"},"type":"array","title":"Rijen"}},"type":"object","required":["totaal","aangemaakt","overgeslagen","fouten","rijen"],"title":"ImportResult"},"ImportRow":{"properties":{"row":{"type":"integer","title":"Row"},"name":{"type":"string","title":"Name"},"kvk":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kvk"},"sector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sector"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email"},"status":{"type":"string","title":"Status"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}},"type":"object","required":["row","name","kvk","sector","contact_email","status"],"title":"ImportRow"},"KVKScanRequest":{"properties":{"kvk_nummer":{"type":"string","maxLength":8,"minLength":8,"pattern":"^\\d{8}$","title":"Kvk Nummer"},"ai_diepteanalyse":{"type":"boolean","title":"Ai Diepteanalyse","default":true}},"type":"object","required":["kvk_nummer"],"title":"KVKScanRequest"},"KalenderLeadIn":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"source":{"type":"string","maxLength":40,"title":"Source","default":"exit_intent"},"path":{"type":"string","maxLength":200,"title":"Path","default":""}},"type":"object","required":["email"],"title":"KalenderLeadIn"},"KlantDossierResponse":{"properties":{"aanvraag_id":{"type":"string","format":"uuid","title":"Aanvraag Id"},"titel":{"type":"string","title":"Titel"},"status":{"type":"string","title":"Status"},"bedrag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bedrag"},"deadline":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deadline"},"klant_naam":{"type":"string","title":"Klant Naam"},"klant_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Klant Email"},"regeling_naam":{"type":"string","title":"Regeling Naam"},"regeling_type":{"type":"string","title":"Regeling Type"},"documenten":{"items":{"type":"object"},"type":"array","title":"Documenten"},"portaal_naam":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Portaal Naam"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"daysleft":{"type":"integer","title":"Daysleft"}},"type":"object","required":["aanvraag_id","titel","status","bedrag","deadline","klant_naam","klant_email","regeling_naam","regeling_type","documenten","portaal_naam","expires_at","daysleft"],"title":"KlantDossierResponse","description":"Read-only data die de klant te zien krijgt op /k/:token."},"KlantNotitieRequest":{"properties":{"inhoud":{"type":"string","title":"Inhoud"},"afzender_naam":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Afzender Naam"}},"type":"object","required":["inhoud"],"title":"KlantNotitieRequest"},"KpiOut":{"properties":{"aanvragen_totaal":{"type":"integer","title":"Aanvragen Totaal"},"aanvragen_actief":{"type":"integer","title":"Aanvragen Actief"},"aanvragen_toegekend":{"type":"integer","title":"Aanvragen Toegekend"},"aanvragen_afgewezen":{"type":"integer","title":"Aanvragen Afgewezen"},"slagingskans_percentage":{"type":"number","title":"Slagingskans Percentage"},"totaal_aangevraagd_eur":{"type":"number","title":"Totaal Aangevraagd Eur"},"totaal_toegekend_eur":{"type":"number","title":"Totaal Toegekend Eur"},"uren_bespaard":{"type":"integer","title":"Uren Bespaard"}},"type":"object","required":["aanvragen_totaal","aanvragen_actief","aanvragen_toegekend","aanvragen_afgewezen","slagingskans_percentage","totaal_aangevraagd_eur","totaal_toegekend_eur","uren_bespaard"],"title":"KpiOut"},"LinkedInPostIn":{"properties":{"onderwerp":{"type":"string","maxLength":200,"minLength":4,"title":"Onderwerp","description":"Topic — bv. 'WBSO 2026 tarieven' of 'DUS-I checklist'"},"toon":{"type":"string","maxLength":40,"title":"Toon","description":"professioneel | enthousiast | educatief","default":"professioneel"},"cta":{"type":"string","maxLength":120,"title":"Cta","description":"Call-to-action zin","default":"Lees onze gids"},"max_lengte":{"type":"integer","maximum":3000.0,"minimum":200.0,"title":"Max Lengte","description":"Max chars (LinkedIn limit 3000)","default":1200},"locale":{"type":"string","maxLength":4,"title":"Locale","description":"nl | en","default":"nl"}},"type":"object","required":["onderwerp"],"title":"LinkedInPostIn"},"LoginWithTotpRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"totp_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Totp Code"}},"type":"object","required":["email","password"],"title":"LoginWithTotpRequest","description":"Login wanneer 2FA aanstaat — verstuurt e-mail + wachtwoord + totp_code."},"MITInput":{"properties":{"projectkosten":{"type":"number","maximum":1000000.0,"minimum":0.0,"title":"Projectkosten"},"type":{"type":"string","pattern":"^(rd_samenwerking|haalbaarheid)$","title":"Type","default":"rd_samenwerking"}},"type":"object","required":["projectkosten"],"title":"MITInput"},"MITOutput":{"properties":{"regeling":{"type":"string","title":"Regeling"},"projectkosten":{"type":"integer","title":"Projectkosten"},"subsidie":{"type":"integer","title":"Subsidie"},"eigen_bijdrage":{"type":"integer","title":"Eigen Bijdrage"},"percentage":{"type":"integer","title":"Percentage"},"toelichting":{"type":"string","title":"Toelichting"}},"type":"object","required":["regeling","projectkosten","subsidie","eigen_bijdrage","percentage","toelichting"],"title":"MITOutput"},"NotitieIn":{"properties":{"inhoud":{"type":"string","maxLength":5000,"minLength":1,"title":"Inhoud"},"type":{"type":"string","pattern":"^(notitie|actie|waarschuwing)$","title":"Type","default":"notitie"}},"type":"object","required":["inhoud"],"title":"NotitieIn"},"OrganisatieProfielIn":{"properties":{"naam":{"type":"string","maxLength":200,"minLength":1,"title":"Naam"},"rechtsvorm":{"type":"string","maxLength":80,"title":"Rechtsvorm","default":""},"sector":{"type":"string","maxLength":120,"title":"Sector","default":""},"provincie":{"type":"string","maxLength":40,"title":"Provincie","default":""},"doelgroepen":{"items":{"type":"string"},"type":"array","title":"Doelgroepen"},"themas":{"items":{"type":"string"},"type":"array","title":"Themas"},"projecttype":{"type":"string","maxLength":80,"title":"Projecttype","default":""},"omschrijving":{"type":"string","maxLength":5000,"title":"Omschrijving","default":""}},"type":"object","required":["naam"],"title":"OrganisatieProfielIn"},"OrganizationOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"kvk":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kvk"},"plan":{"type":"string","title":"Plan"}},"type":"object","required":["id","name","kvk","plan"],"title":"OrganizationOut"},"PasswordResetConfirm":{"properties":{"token":{"type":"string","title":"Token"},"nieuw_wachtwoord":{"type":"string","title":"Nieuw Wachtwoord"}},"type":"object","required":["token","nieuw_wachtwoord"],"title":"PasswordResetConfirm"},"PasswordResetRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"PasswordResetRequest"},"PasswordResetRequestResponse":{"properties":{"sent":{"type":"boolean","title":"Sent"},"reset_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reset Url"},"expires_in_minutes":{"type":"integer","title":"Expires In Minutes","default":60}},"type":"object","required":["sent"],"title":"PasswordResetRequestResponse","description":"Antwoord bij /password/request-reset.\nBevat een directe reset_url als e-mail-service niet geconfigureerd is,\nzodat de adviseur de link handmatig kan delen. Anders alleen 'sent: true'."},"PreAuditBevinding":{"properties":{"categorie":{"type":"string","enum":["volledigheid","juridisch","financieel","technisch"],"title":"Categorie"},"ernst":{"type":"string","enum":["info","waarschuwing","kritiek"],"title":"Ernst"},"sectie":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sectie"},"bevinding":{"type":"string","title":"Bevinding"},"aanbeveling":{"type":"string","title":"Aanbeveling"}},"type":"object","required":["categorie","ernst","bevinding","aanbeveling"],"title":"PreAuditBevinding"},"PreAuditRequest":{"properties":{"aanvraag_id":{"type":"string","format":"uuid","title":"Aanvraag Id"}},"type":"object","required":["aanvraag_id"],"title":"PreAuditRequest"},"PreAuditResponse":{"properties":{"score":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Score"},"samenvatting":{"type":"string","title":"Samenvatting"},"bevindingen":{"items":{"$ref":"#/components/schemas/PreAuditBevinding"},"type":"array","title":"Bevindingen"}},"type":"object","required":["score","samenvatting","bevindingen"],"title":"PreAuditResponse"},"RapportageResponse":{"properties":{"kpis":{"$ref":"#/components/schemas/KpiOut"},"omzet_per_maand":{"items":{"$ref":"#/components/schemas/GrafiekPunt"},"type":"array","title":"Omzet Per Maand"},"slagingskans_per_regeling":{"items":{"$ref":"#/components/schemas/GrafiekPunt"},"type":"array","title":"Slagingskans Per Regeling"},"tijdwinst_per_maand":{"items":{"$ref":"#/components/schemas/GrafiekPunt"},"type":"array","title":"Tijdwinst Per Maand"}},"type":"object","required":["kpis","omzet_per_maand","slagingskans_per_regeling","tijdwinst_per_maand"],"title":"RapportageResponse"},"RefreshRequest":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"RefreshRequest"},"RegelingMini":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"naam":{"type":"string","title":"Naam"},"uitvoerder":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uitvoerder"},"type":{"type":"string","title":"Type"},"categorie":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Categorie"},"deadline":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Deadline"},"is_doorlopend":{"type":"boolean","title":"Is Doorlopend"},"url_rvo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url Rvo"},"samenvatting":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Samenvatting"}},"type":"object","required":["id","code","naam","uitvoerder","type","categorie","deadline","is_doorlopend","url_rvo","samenvatting"],"title":"RegelingMini"},"RegelingOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"naam":{"type":"string","title":"Naam"},"type":{"type":"string","title":"Type"},"categorie":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Categorie"},"uitvoerder":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uitvoerder"},"samenvatting":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Samenvatting"},"min_bedrag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Min Bedrag"},"max_bedrag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Max Bedrag"},"deadline":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Deadline"},"is_doorlopend":{"type":"boolean","title":"Is Doorlopend","default":false},"url_rvo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url Rvo"},"url_aanvraag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url Aanvraag"},"beschrijving":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beschrijving"},"is_actief":{"type":"boolean","title":"Is Actief","default":true}},"type":"object","required":["id","naam","type","min_bedrag","max_bedrag","deadline","beschrijving"],"title":"RegelingOut"},"RegisterIn":{"properties":{"naam":{"type":"string","maxLength":255,"title":"Naam"},"email":{"type":"string","format":"email","title":"Email"},"company":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Company"},"tier":{"type":"string","title":"Tier","default":"affiliate"}},"type":"object","required":["naam","email"],"title":"RegisterIn"},"RegisterRequest":{"properties":{"organization_name":{"type":"string","maxLength":255,"minLength":2,"title":"Organization Name"},"kvk":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Kvk"},"name":{"type":"string","maxLength":255,"minLength":2,"title":"Name"},"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password"}},"type":"object","required":["organization_name","name","email","password"],"title":"RegisterRequest"},"SLIMInput":{"properties":{"opleidingskosten":{"type":"number","maximum":10000000.0,"minimum":0.0,"title":"Opleidingskosten"},"aantal_fte":{"type":"integer","maximum":1000.0,"minimum":0.0,"title":"Aantal Fte"}},"type":"object","required":["opleidingskosten","aantal_fte"],"title":"SLIMInput"},"SLIMOutput":{"properties":{"regeling":{"type":"string","title":"Regeling","default":"SLIM 2026"},"categorie":{"type":"string","title":"Categorie"},"opleidingskosten":{"type":"integer","title":"Opleidingskosten"},"subsidie":{"type":"integer","title":"Subsidie"},"eigen_bijdrage":{"type":"integer","title":"Eigen Bijdrage"},"percentage":{"type":"integer","title":"Percentage"},"max_subsidie":{"type":"integer","title":"Max Subsidie"},"toelichting":{"type":"string","title":"Toelichting"}},"type":"object","required":["categorie","opleidingskosten","subsidie","eigen_bijdrage","percentage","max_subsidie","toelichting"],"title":"SLIMOutput"},"ScanByNameRequest":{"properties":{"naam":{"type":"string","maxLength":120,"minLength":2,"title":"Naam"},"ai_diepteanalyse":{"type":"boolean","title":"Ai Diepteanalyse","default":true}},"type":"object","required":["naam"],"title":"ScanByNameRequest"},"ScanBySuggestionRequest":{"properties":{"bron_id":{"type":"string","title":"Bron Id"},"kvk_nummer":{"type":"string","title":"Kvk Nummer"},"handelsnaam":{"type":"string","title":"Handelsnaam"},"plaats":{"type":"string","title":"Plaats","default":""},"bron":{"type":"string","title":"Bron","default":"overheid_io"},"ai_diepteanalyse":{"type":"boolean","title":"Ai Diepteanalyse","default":true}},"type":"object","required":["bron_id","kvk_nummer","handelsnaam"],"title":"ScanBySuggestionRequest"},"ScanManualRequest":{"properties":{"naam":{"type":"string","maxLength":255,"minLength":2,"title":"Naam"},"sbi_codes":{"items":{"type":"string"},"type":"array","maxItems":10,"minItems":1,"title":"Sbi Codes"},"activiteitsomschrijving":{"type":"string","maxLength":2000,"minLength":10,"title":"Activiteitsomschrijving"},"aantal_medewerkers":{"type":"integer","maximum":500000.0,"minimum":0.0,"title":"Aantal Medewerkers"},"rechtsvorm":{"type":"string","maxLength":50,"title":"Rechtsvorm","default":"Besloten Vennootschap"},"provincie":{"type":"string","maxLength":50,"title":"Provincie","default":"Onbekend"},"postcode":{"type":"string","maxLength":10,"title":"Postcode","default":""},"gemeente":{"type":"string","maxLength":100,"title":"Gemeente","default":""},"omzet_indicatie":{"anyOf":[{"type":"number","maximum":1000000000000.0,"minimum":0.0},{"type":"null"}],"title":"Omzet Indicatie"},"is_starter":{"type":"boolean","title":"Is Starter","default":false},"ai_diepteanalyse":{"type":"boolean","title":"Ai Diepteanalyse","default":true}},"type":"object","required":["naam","sbi_codes","activiteitsomschrijving","aantal_medewerkers"],"title":"ScanManualRequest"},"ScanResultOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"regeling":{"$ref":"#/components/schemas/RegelingMini"},"eligibility_score":{"type":"integer","title":"Eligibility Score"},"eligibility_klasse":{"type":"string","title":"Eligibility Klasse"},"hard_match":{"type":"boolean","title":"Hard Match"},"match_reasons":{"items":{},"type":"array","title":"Match Reasons"},"blokkerende_criteria":{"items":{},"type":"array","title":"Blokkerende Criteria"},"geschat_bedrag_min":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geschat Bedrag Min"},"geschat_bedrag_max":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geschat Bedrag Max"},"bedrag_uitleg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bedrag Uitleg"},"ai_reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Reasoning"},"ai_kansen":{"items":{},"type":"array","title":"Ai Kansen"},"ai_valkuilen":{"items":{},"type":"array","title":"Ai Valkuilen"},"aanbevolen_actie":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aanbevolen Actie"},"status":{"type":"string","title":"Status"},"scan_timestamp":{"type":"string","format":"date-time","title":"Scan Timestamp"}},"type":"object","required":["id","regeling","eligibility_score","eligibility_klasse","hard_match","match_reasons","blokkerende_criteria","geschat_bedrag_min","geschat_bedrag_max","bedrag_uitleg","ai_reasoning","ai_kansen","ai_valkuilen","aanbevolen_actie","status","scan_timestamp"],"title":"ScanResultOut"},"ScanSummary":{"properties":{"totaal_regelingen":{"type":"integer","title":"Totaal Regelingen"},"aantal_100_procent":{"type":"integer","title":"Aantal 100 Procent"},"aantal_waarschijnlijk":{"type":"integer","title":"Aantal Waarschijnlijk"},"aantal_mogelijk":{"type":"integer","title":"Aantal Mogelijk"},"aantal_uitgesloten":{"type":"integer","title":"Aantal Uitgesloten"},"totaal_potentieel":{"type":"object","title":"Totaal Potentieel"},"duration_ms":{"type":"integer","title":"Duration Ms"}},"type":"object","required":["totaal_regelingen","aantal_100_procent","aantal_waarschijnlijk","aantal_mogelijk","aantal_uitgesloten","totaal_potentieel","duration_ms"],"title":"ScanSummary"},"ScrapeLogEntry":{"properties":{"bron":{"type":"string","title":"Bron"},"status":{"type":"string","title":"Status"},"items_found":{"type":"integer","title":"Items Found"},"items_new":{"type":"integer","title":"Items New"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"uitgevoerd_op":{"type":"string","format":"date-time","title":"Uitgevoerd Op"}},"type":"object","required":["bron","status","items_found","items_new","error","uitgevoerd_op"],"title":"ScrapeLogEntry"},"ScrapeRunResponse":{"properties":{"status":{"type":"string","title":"Status"},"items_found":{"type":"integer","title":"Items Found"},"items_new":{"type":"integer","title":"Items New"},"duration_ms":{"type":"integer","title":"Duration Ms"},"new_regelingen":{"items":{"type":"object"},"type":"array","title":"New Regelingen"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["status","items_found","items_new","duration_ms","new_regelingen"],"title":"ScrapeRunResponse"},"SearchRequest":{"properties":{"query":{"type":"string","maxLength":80,"minLength":2,"title":"Query"}},"type":"object","required":["query"],"title":"SearchRequest"},"SearchResponse":{"properties":{"bron_actief":{"type":"string","title":"Bron Actief"},"suggestions":{"items":{"$ref":"#/components/schemas/BedrijfSuggestionOut"},"type":"array","title":"Suggestions"}},"type":"object","required":["bron_actief","suggestions"],"title":"SearchResponse"},"SettingIn":{"properties":{"key":{"type":"string","maxLength":80,"title":"Key","description":"Bv. gsc_verification | bing_verification"},"value":{"type":"string","maxLength":500,"title":"Value"}},"type":"object","required":["key","value"],"title":"SettingIn"},"SubsidieMatch":{"properties":{"regeling_naam":{"type":"string","title":"Regeling Naam"},"match_percentage":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Match Percentage"},"uitleg":{"type":"string","title":"Uitleg"},"type":{"type":"string","title":"Type"},"indicatief_bedrag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Indicatief Bedrag"}},"type":"object","required":["regeling_naam","match_percentage","uitleg","type"],"title":"SubsidieMatch"},"SubsidieScanRequest":{"properties":{"profiel":{"$ref":"#/components/schemas/BedrijfsProfiel"}},"type":"object","required":["profiel"],"title":"SubsidieScanRequest"},"SubsidieScanResponse":{"properties":{"matches":{"items":{"$ref":"#/components/schemas/SubsidieMatch"},"type":"array","title":"Matches"}},"type":"object","required":["matches"],"title":"SubsidieScanResponse"},"ToetsAntwoordIn":{"properties":{"antwoord":{"type":"string","pattern":"^(Ja|Nee|N\\.v\\.t\\.)$","title":"Antwoord"},"toelichting":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Toelichting"}},"type":"object","required":["antwoord"],"title":"ToetsAntwoordIn"},"TokenCreateRequest":{"properties":{"aanvraag_id":{"type":"string","format":"uuid","title":"Aanvraag Id"},"naam":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Naam"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"geldigheid_dagen":{"type":"integer","title":"Geldigheid Dagen","default":90}},"type":"object","required":["aanvraag_id"],"title":"TokenCreateRequest"},"TokenOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"token":{"type":"string","title":"Token"},"aanvraag_id":{"type":"string","format":"uuid","title":"Aanvraag Id"},"naam":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Naam"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"last_accessed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Accessed At"},"access_count":{"type":"integer","title":"Access Count"},"is_active":{"type":"boolean","title":"Is Active"},"portaal_url":{"type":"string","title":"Portaal Url"}},"type":"object","required":["id","token","aanvraag_id","naam","email","expires_at","created_at","revoked_at","last_accessed_at","access_count","is_active","portaal_url"],"title":"TokenOut"},"TokenPair":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"}},"type":"object","required":["access_token","refresh_token"],"title":"TokenPair"},"TotpSetupResponse":{"properties":{"secret":{"type":"string","title":"Secret"},"otpauth_url":{"type":"string","title":"Otpauth Url"},"qr_code_data_url":{"type":"string","title":"Qr Code Data Url"}},"type":"object","required":["secret","otpauth_url","qr_code_data_url"],"title":"TotpSetupResponse","description":"Response bij setup-start. Geeft secret + otpauth URL terug.\nFrontend toont QR code op basis van otpauth_url."},"TotpStatusResponse":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"verified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Verified At"}},"type":"object","required":["enabled"],"title":"TotpStatusResponse"},"TotpVerifyRequest":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"TotpVerifyRequest"},"UserOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"org_id":{"type":"string","format":"uuid","title":"Org Id"},"name":{"type":"string","title":"Name"},"email":{"type":"string","format":"email","title":"Email"},"role":{"$ref":"#/components/schemas/UserRole"}},"type":"object","required":["id","org_id","name","email","role"],"title":"UserOut"},"UserRole":{"type":"string","enum":["admin","senior","junior","viewer"],"title":"UserRole"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerantwoordingRequest":{"properties":{"aanvraag_id":{"type":"string","format":"uuid","title":"Aanvraag Id"},"projectresultaten":{"type":"string","minLength":20,"title":"Projectresultaten"},"afgeronde_activiteiten":{"items":{"type":"string"},"type":"array","title":"Afgeronde Activiteiten","default":[]},"afwijkingen":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Afwijkingen"}},"type":"object","required":["aanvraag_id","projectresultaten"],"title":"VerantwoordingRequest"},"VerantwoordingResponse":{"properties":{"document":{"type":"string","title":"Document"},"aanvraag_id":{"type":"string","format":"uuid","title":"Aanvraag Id"}},"type":"object","required":["document","aanvraag_id"],"title":"VerantwoordingResponse"},"WBSOInput":{"properties":{"fte_so":{"type":"number","maximum":500.0,"minimum":0.0,"title":"Fte So","description":"Aantal FTE dat S&O-werk doet"},"is_starter":{"type":"boolean","title":"Is Starter","default":false},"gem_bruto_uurloon":{"type":"number","maximum":200.0,"minimum":10.0,"title":"Gem Bruto Uurloon","default":36.0},"extra_kosten":{"type":"number","minimum":0.0,"title":"Extra Kosten","default":0}},"type":"object","required":["fte_so"],"title":"WBSOInput"},"WBSOLeadIn":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"input":{"type":"object","title":"Input"},"resultaat":{"type":"object","title":"Resultaat"}},"type":"object","required":["email"],"title":"WBSOLeadIn"},"WBSOOutput":{"properties":{"regeling":{"type":"string","title":"Regeling","default":"WBSO 2026"},"so_uren_per_jaar":{"type":"integer","title":"So Uren Per Jaar"},"so_loonsom":{"type":"integer","title":"So Loonsom"},"voordeel_eerste_schijf":{"type":"integer","title":"Voordeel Eerste Schijf"},"voordeel_tweede_schijf":{"type":"integer","title":"Voordeel Tweede Schijf"},"totaal_voordeel":{"type":"integer","title":"Totaal Voordeel"},"maandelijks_voordeel":{"type":"integer","title":"Maandelijks Voordeel"},"tarief_eerste_schijf":{"type":"string","title":"Tarief Eerste Schijf"},"grens_eerste_schijf":{"type":"integer","title":"Grens Eerste Schijf"},"toelichting":{"type":"string","title":"Toelichting"}},"type":"object","required":["so_uren_per_jaar","so_loonsom","voordeel_eerste_schijf","voordeel_tweede_schijf","totaal_voordeel","maandelijks_voordeel","tarief_eerste_schijf","grens_eerste_schijf","toelichting"],"title":"WBSOOutput"}},"securitySchemes":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"/api/auth/login"}}}}}}