{"openapi":"3.1.0","info":{"title":"Turing Verify API","summary":"Document fraud detection API","description":"Forensic document verification — detect forged diplomas, IDs, and certificates. See docs/api-platform-design.md for the full surface.","version":"1.0.0-phase1"},"paths":{"/verify":{"post":{"tags":["verify"],"summary":"Verify","description":"Accept a document image and stream verification progress via SSE.\n\nThe response is a text/event-stream that emits:\n- init: verification_id and filename\n- stage: stage start/complete with labels and details\n- progress: individual detail messages within a stage\n- verdict: the final JSON verdict from the AI model\n- error: if something goes wrong\n\nIf the user is authenticated (Bearer token), the verification is\nlinked to their account for dashboard history.","operationId":"verify_verify_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_verify_verify_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/verify/{verification_id}/status":{"get":{"tags":["verify"],"summary":"Verification Status","description":"Placeholder endpoint for checking verification status.\n\nIn a production system this would look up the verification in a\ndatabase. For now it returns a simple status dict.","operationId":"verification_status_verify__verification_id__status_get","parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/verify/calibrate/feedback":{"post":{"tags":["verify"],"summary":"Submit Calibration Feedback","description":"Accept human-corrected annotation positions for calibration.\n\nStores the feedback in the calibration_feedback SQLite table.\nWhen enough feedback accumulates (20+), logs a suggestion to\nrun the recalibration pipeline.","operationId":"submit_calibration_feedback_verify_calibrate_feedback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalibrationFeedbackRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/report/generate":{"post":{"tags":["report"],"summary":"Generate","description":"Generate a PDF forensic report from a verification verdict.\n\nRequires authentication. Accepts the full verdict JSON object\nin the request body and returns a downloadable PDF file.","operationId":"generate_report_generate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dashboard/verifications":{"get":{"tags":["dashboard"],"summary":"List Verifications","description":"List the authenticated user's verification history.","operationId":"list_verifications_dashboard_verifications_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/stats":{"get":{"tags":["dashboard"],"summary":"User Stats","description":"Get verification stats for the authenticated user.","operationId":"user_stats_dashboard_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dashboard/verification/{verification_id}":{"get":{"tags":["dashboard"],"summary":"Get Verification","description":"Get a single verification result.\n\nPublicly accessible (verification results are shareable via link).\nSensitive fields (user_id, document_image_path) are stripped from response.","operationId":"get_verification_dashboard_verification__verification_id__get","parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/verification/{verification_id}/report":{"get":{"tags":["dashboard"],"summary":"Download Report","description":"Download the PDF report for a verification.\n\nPublicly accessible via UUID-based verification ID (unguessable share link).\nRate-limited to prevent abuse.","operationId":"download_report_dashboard_verification__verification_id__report_get","parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/verification/{verification_id}/badged-document":{"get":{"tags":["dashboard"],"summary":"Download Badged Document","description":"Download the original document with a verification badge overlay.\n\nPublicly accessible via UUID-based verification ID (unguessable share link).\nReturns a PNG image of the document with a \"Turing Verified\" badge.","operationId":"download_badged_document_dashboard_verification__verification_id__badged_document_get","parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/verification/{verification_id}/image":{"get":{"tags":["dashboard"],"summary":"Get Verification Image","description":"Serve the original document image.\n\nPublicly accessible via UUID-based verification ID (unguessable share link).\nRate-limited to prevent abuse.","operationId":"get_verification_image_dashboard_verification__verification_id__image_get","parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/verification/{verification_id}/image/{page}":{"get":{"tags":["dashboard"],"summary":"Get Verification Page Image","description":"Serve a specific page of the original document as JPEG.\n\nPublicly accessible via UUID-based verification ID (unguessable share link).\nRate-limited to prevent abuse.","operationId":"get_verification_page_image_dashboard_verification__verification_id__image__page__get","parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}},{"name":"page","in":"path","required":true,"schema":{"type":"integer","title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/verification/{verification_id}/og-image":{"get":{"tags":["dashboard"],"summary":"Get Verification Og Image","description":"Generate and serve an Open Graph image for social media sharing.\n\nPublic endpoint — crawlers (Facebook, Twitter, LinkedIn) need access.\nCaches generated images in /data/og-cache/. Use ?v=N to bust cache.","operationId":"get_verification_og_image_dashboard_verification__verification_id__og_image_get","parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}},{"name":"v","in":"query","required":false,"schema":{"type":"string","default":"4","title":"V"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/sync-user":{"post":{"tags":["dashboard"],"summary":"Sync User","description":"Sync user data after OAuth login (requires valid JWT).","operationId":"sync_user_dashboard_sync_user_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncUserRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/referral":{"get":{"tags":["dashboard"],"summary":"Get User Referral","description":"Get the authenticated user's personal referral link and stats.","operationId":"get_user_referral_dashboard_referral_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dashboard/complete-profile":{"post":{"tags":["dashboard"],"summary":"Complete Profile","description":"Complete user profile and earn +3 bonus verifications.","operationId":"complete_profile_dashboard_complete_profile_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteProfileRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/tos-status":{"get":{"tags":["dashboard"],"summary":"Tos Status","description":"Check if the authenticated user has accepted the Terms of Service.","operationId":"tos_status_dashboard_tos_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dashboard/accept-tos":{"post":{"tags":["dashboard"],"summary":"Accept Tos Endpoint","description":"Record the user's acceptance of the Terms of Service.","operationId":"accept_tos_endpoint_dashboard_accept_tos_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptTosRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/ensure-tos":{"post":{"tags":["dashboard"],"summary":"Ensure Tos Endpoint","description":"Check ToS status and auto-accept if not yet accepted. Single round-trip.","operationId":"ensure_tos_endpoint_dashboard_ensure_tos_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dashboard/calibrate":{"post":{"tags":["dashboard"],"summary":"Calibrate","description":"Accept annotation corrections and refit the correction model.\n\nStores each correction in calibration_feedback, then refits the\npiecewise-linear correction model from all accumulated feedback.\nReturns the updated correction parameters.","operationId":"calibrate_dashboard_calibrate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalibrateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/admin/set-quota":{"post":{"tags":["dashboard"],"summary":"Admin Set Quota","description":"Set a user's monthly verification quota and plan (admin only, secured by ADMIN_SECRET).","operationId":"admin_set_quota_dashboard_admin_set_quota_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetQuotaRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/admin/create-coupon":{"post":{"tags":["dashboard"],"summary":"Admin Create Coupon","description":"Create a new coupon code (admin only). Code is auto-generated if not provided.","operationId":"admin_create_coupon_dashboard_admin_create_coupon_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__dashboard__CreateCouponRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/admin/delete-coupon":{"post":{"tags":["dashboard"],"summary":"Admin Delete Coupon","description":"Delete a coupon code (admin only).","operationId":"admin_delete_coupon_dashboard_admin_delete_coupon_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteCouponRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/admin/clear-cache":{"post":{"tags":["dashboard"],"summary":"Admin Clear Cache","description":"Clear cached verification results for a file hash (admin only).","operationId":"admin_clear_cache_dashboard_admin_clear_cache_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClearCacheRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/admin/update-verification":{"post":{"tags":["dashboard"],"summary":"Admin Update Verification","description":"Update fields in a verification's verdict_json (admin only).","operationId":"admin_update_verification_dashboard_admin_update_verification_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateVerificationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/claim-anonymous":{"post":{"tags":["dashboard"],"summary":"Claim Anonymous","description":"Claim anonymous verifications for the authenticated user.\n\nAfter a user signs up / logs in, this links any anonymous verifications\nthey performed (matched by fingerprint, cookie, or IP) to their account.","operationId":"claim_anonymous_dashboard_claim_anonymous_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimAnonymousRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/create-checkout-session":{"post":{"tags":["billing"],"summary":"Create Checkout","description":"Create a Stripe Checkout Session and return the URL.","operationId":"create_checkout_billing_create_checkout_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/create-portal-session":{"post":{"tags":["billing"],"summary":"Create Portal","description":"Create a Stripe Customer Portal session for subscription management.","operationId":"create_portal_billing_create_portal_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/purchase-overage":{"post":{"tags":["billing"],"summary":"Purchase Overage","description":"Purchase an overage pack (one-time payment) for extra verifications.","operationId":"purchase_overage_billing_purchase_overage_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OverageRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/status":{"get":{"tags":["billing"],"summary":"Billing Status","description":"Get the current user's billing/subscription status.","operationId":"billing_status_billing_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/billing/webhook":{"post":{"tags":["billing"],"summary":"Stripe Webhook","description":"Handle incoming Stripe webhook events.\n\nThis endpoint does NOT require auth — Stripe calls it directly.\nSignature verification ensures authenticity.","operationId":"stripe_webhook_billing_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/billing/validate-referral":{"get":{"tags":["billing"],"summary":"Validate Referral","description":"Validate a referral code. Public endpoint, no auth required.","operationId":"validate_referral_billing_validate_referral_get","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/redeem-coupon":{"post":{"tags":["billing"],"summary":"Redeem Coupon Endpoint","description":"Redeem a coupon code for the authenticated user.\n\nSupports both the legacy single-use coupons table and the new multi-use coupon_codes table.","operationId":"redeem_coupon_endpoint_billing_redeem_coupon_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemCouponRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/gdpr/my-data":{"get":{"tags":["gdpr"],"summary":"Get My Data","description":"List all verification data for the authenticated user.","operationId":"get_my_data_gdpr_my_data_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/gdpr/export":{"get":{"tags":["gdpr"],"summary":"Export Data","description":"Export all user data (GDPR Article 20 — data portability).","operationId":"export_data_gdpr_export_get","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","default":"json","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/gdpr/delete-verification/{verification_id}":{"post":{"tags":["gdpr"],"summary":"Delete Verification","description":"Delete a specific verification (GDPR Article 17 — right to erasure).","operationId":"delete_verification_gdpr_delete_verification__verification_id__post","parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/gdpr/delete-account":{"post":{"tags":["gdpr"],"summary":"Delete Account","description":"Delete ALL user data and account (GDPR Article 17 — right to erasure).","operationId":"delete_account_gdpr_delete_account_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/gdpr/dispute/{verification_id}":{"post":{"tags":["gdpr"],"summary":"Dispute Verification","description":"Submit a dispute for a verification result.\n\nOnly the owner of the verification can file a dispute.","operationId":"dispute_verification_gdpr_dispute__verification_id__post","parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisputeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/gdpr/admin/disputes":{"get":{"tags":["gdpr"],"summary":"Admin List Disputes","description":"Admin: list disputes filed against verification verdicts (GDPR Art. 22 queue).","operationId":"admin_list_disputes_gdpr_admin_disputes_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(pending|upheld|rejected|withdrawn)$"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/gdpr/admin/disputes/{dispute_id}/resolve":{"post":{"tags":["gdpr"],"summary":"Admin Resolve Dispute","description":"Admin: resolve a dispute (upheld = AI was wrong; rejected = AI stands; withdrawn).","operationId":"admin_resolve_dispute_gdpr_admin_disputes__dispute_id__resolve_post","parameters":[{"name":"dispute_id","in":"path","required":true,"schema":{"type":"integer","title":"Dispute Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveDisputeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/gdpr/lookup":{"get":{"tags":["gdpr"],"summary":"Lookup Verifications","description":"Look up verifications by holder name (requires authentication to prevent user enumeration).","operationId":"lookup_verifications_gdpr_lookup_get","parameters":[{"name":"holder","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2,"maxLength":100},{"type":"null"}],"title":"Holder"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/review/submit":{"post":{"tags":["review"],"summary":"Submit Review","description":"Submit a human review/override for a verification.","operationId":"submit_review_review_submit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitReviewRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/review/history":{"get":{"tags":["review"],"summary":"Review History","description":"Get the authenticated user's submitted reviews.","operationId":"review_history_review_history_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/review/admin/analytics":{"get":{"tags":["review"],"summary":"Admin Analytics","description":"Get override statistics (admin only).","operationId":"admin_analytics_review_admin_analytics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/review/admin/suggestions":{"get":{"tags":["review"],"summary":"Admin Suggestions","description":"Get pending rule suggestions (admin only).","operationId":"admin_suggestions_review_admin_suggestions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/review/admin/approve/{suggestion_id}":{"post":{"tags":["review"],"summary":"Admin Approve","description":"Approve a rule suggestion and write to overrides file (admin only).","operationId":"admin_approve_review_admin_approve__suggestion_id__post","parameters":[{"name":"suggestion_id","in":"path","required":true,"schema":{"type":"integer","title":"Suggestion Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/review/admin/reject/{suggestion_id}":{"post":{"tags":["review"],"summary":"Admin Reject","description":"Reject a rule suggestion (admin only).","operationId":"admin_reject_review_admin_reject__suggestion_id__post","parameters":[{"name":"suggestion_id","in":"path","required":true,"schema":{"type":"integer","title":"Suggestion Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/review/admin/generate-suggestions":{"post":{"tags":["review"],"summary":"Admin Generate Suggestions","description":"Trigger the learning engine to analyze overrides and generate suggestions (admin only).","operationId":"admin_generate_suggestions_review_admin_generate_suggestions_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/send-magic-link":{"post":{"tags":["auth"],"summary":"Send Magic Link","description":"Generate and send a magic link to the user's email.\n\nOptional `callback_url` (relative path on our own domain) gets appended so\nthe frontend can redirect the user back to the page they came from\n(e.g. /claim/<token>) after sign-in.","operationId":"send_magic_link_auth_send_magic_link_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendMagicLinkRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/verify-magic-link":{"post":{"tags":["auth"],"summary":"Verify Magic Link Endpoint","description":"Verify a magic link token and return user info + JWT.","operationId":"verify_magic_link_endpoint_auth_verify_magic_link_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyMagicLinkRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/register":{"post":{"tags":["auth"],"summary":"Register","description":"Register a new account with email + password.","operationId":"register_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login":{"post":{"tags":["auth"],"summary":"Login","description":"Sign in with email + password.","operationId":"login_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/folders":{"get":{"tags":["folders"],"summary":"List Folders","description":"List all applicant folders for the current user.","operationId":"list_folders_folders_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["folders"],"summary":"Create New Folder","description":"Create a new applicant folder.","operationId":"create_new_folder_folders_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFolderRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/folders/{folder_id}":{"get":{"tags":["folders"],"summary":"Get Folder Detail","description":"Get folder details with all verifications and cross-doc summary.","operationId":"get_folder_detail_folders__folder_id__get","parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["folders"],"summary":"Update Folder Endpoint","description":"Update folder metadata.","operationId":"update_folder_endpoint_folders__folder_id__patch","parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFolderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["folders"],"summary":"Delete Folder Endpoint","description":"Delete a folder (verifications are preserved).","operationId":"delete_folder_endpoint_folders__folder_id__delete","parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/folders/{folder_id}/verifications":{"post":{"tags":["folders"],"summary":"Add To Folder","description":"Link an existing verification to a folder.","operationId":"add_to_folder_folders__folder_id__verifications_post","parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddVerificationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["folders"],"summary":"List Folder Verifications","description":"List all verifications in a folder.","operationId":"list_folder_verifications_folders__folder_id__verifications_get","parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/folders/{folder_id}/summary":{"get":{"tags":["folders"],"summary":"Folder Summary","description":"Get cross-document consistency summary for a folder.","operationId":"folder_summary_folders__folder_id__summary_get","parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/folders/{folder_id}/export":{"get":{"tags":["folders"],"summary":"Export Folder Csv","description":"Export folder verification results as CSV.","operationId":"export_folder_csv_folders__folder_id__export_get","parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketplace/purchase-credits":{"post":{"tags":["marketplace"],"summary":"Purchase Credits","description":"Create a Stripe Checkout session for a credit pack purchase.","operationId":"purchase_credits_marketplace_purchase_credits_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseCreditsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketplace/credits":{"get":{"tags":["marketplace"],"summary":"Get Credits","description":"Return the user's remaining credits and available pack options.","operationId":"get_credits_marketplace_credits_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketplace/transactions":{"get":{"tags":["marketplace"],"summary":"Get Transactions","description":"Return the user's marketplace transaction history.","operationId":"get_transactions_marketplace_transactions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/holder/profile":{"get":{"tags":["holder"],"summary":"Get Profile","description":"Get the current user's holder profile and credentials.","operationId":"get_profile_holder_profile_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["holder"],"summary":"Create Profile","description":"Create a holder profile for the authenticated user.","operationId":"create_profile_holder_profile_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProfileRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["holder"],"summary":"Update Profile Endpoint","description":"Update the current user's holder profile.","operationId":"update_profile_endpoint_holder_profile_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProfileRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holder/claim/{verification_id}":{"post":{"tags":["holder"],"summary":"Claim Credential","description":"Claim a verification as a holder credential.","operationId":"claim_credential_holder_claim__verification_id__post","parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holder/credentials":{"get":{"tags":["holder"],"summary":"List Credentials","description":"List all credentials for the authenticated user's profile.","operationId":"list_credentials_holder_credentials_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/holder/credentials/{credential_id}":{"delete":{"tags":["holder"],"summary":"Remove Credential","description":"Remove a credential from the holder's profile.","operationId":"remove_credential_holder_credentials__credential_id__delete","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","title":"Credential Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["holder"],"summary":"Update Credential Endpoint","description":"Update a credential's label, category, is_pinned, or is_public.","operationId":"update_credential_endpoint_holder_credentials__credential_id__patch","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","title":"Credential Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCredentialRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holder/credentials/reorder":{"post":{"tags":["holder"],"summary":"Reorder Credentials Endpoint","description":"Batch update display_order for credentials.","operationId":"reorder_credentials_endpoint_holder_credentials_reorder_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderCredentialsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holder/stats":{"get":{"tags":["holder"],"summary":"Get Holder Stats","description":"Return credential count and profile view count for the authenticated user.","operationId":"get_holder_stats_holder_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/holder/profile/avatar":{"post":{"tags":["holder"],"summary":"Upload Avatar","description":"Upload an avatar image for the authenticated user's profile.","operationId":"upload_avatar_holder_profile_avatar_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_avatar_holder_profile_avatar_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holder/profile/avatar/{filename}":{"get":{"tags":["holder"],"summary":"Serve Avatar","description":"Serve an uploaded avatar image file.","operationId":"serve_avatar_holder_profile_avatar__filename__get","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holder/timeline":{"get":{"tags":["holder"],"summary":"Get Timeline","description":"Get the merged timeline of credentials and life events for the authenticated user.","operationId":"get_timeline_holder_timeline_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/holder/life-events":{"post":{"tags":["holder"],"summary":"Create Life Event Endpoint","description":"Create a life event for the authenticated user's profile.","operationId":"create_life_event_endpoint_holder_life_events_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLifeEventRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holder/life-events/{event_id}":{"patch":{"tags":["holder"],"summary":"Update Life Event Endpoint","description":"Update a life event.","operationId":"update_life_event_endpoint_holder_life_events__event_id__patch","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLifeEventRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["holder"],"summary":"Delete Life Event Endpoint","description":"Delete a life event (verify ownership via profile).","operationId":"delete_life_event_endpoint_holder_life_events__event_id__delete","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holder/achievements":{"get":{"tags":["holder"],"summary":"Get Achievements","description":"Return all achievements with unlock status for the authenticated user.","operationId":"get_achievements_holder_achievements_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/holder/achievements/check":{"post":{"tags":["holder"],"summary":"Check Achievements Endpoint","description":"Trigger an achievement check and return any newly unlocked achievements.","operationId":"check_achievements_endpoint_holder_achievements_check_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/holder/export/resume":{"get":{"tags":["holder"],"summary":"Export Resume","description":"Generate and return a PDF resume from the user's profile, credentials, and events.","operationId":"export_resume_holder_export_resume_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/holder/cv/upload":{"post":{"tags":["holder"],"summary":"Upload Cv","description":"Upload a CV/resume file (PDF or DOCX, max 10MB).","operationId":"upload_cv_holder_cv_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_cv_holder_cv_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holder/cv/{cv_id}/parse":{"post":{"tags":["holder"],"summary":"Parse Cv Endpoint","description":"Parse a previously uploaded CV and extract life events.","operationId":"parse_cv_endpoint_holder_cv__cv_id__parse_post","parameters":[{"name":"cv_id","in":"path","required":true,"schema":{"type":"string","title":"Cv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holder/cv/uploads":{"get":{"tags":["holder"],"summary":"List Cv Uploads","description":"List all CV uploads for the authenticated user.","operationId":"list_cv_uploads_holder_cv_uploads_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/holder/cv/{cv_id}":{"delete":{"tags":["holder"],"summary":"Delete Cv Endpoint","description":"Delete a CV upload and optionally its derived life events.","operationId":"delete_cv_endpoint_holder_cv__cv_id__delete","parameters":[{"name":"cv_id","in":"path","required":true,"schema":{"type":"string","title":"Cv Id"}},{"name":"delete_events","in":"query","required":false,"schema":{"type":"boolean","description":"Also delete life events derived from this CV","default":false,"title":"Delete Events"},"description":"Also delete life events derived from this CV"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holder/social-links":{"get":{"tags":["holder"],"summary":"List Social Links","description":"List all social links for the authenticated user.","operationId":"list_social_links_holder_social_links_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["holder"],"summary":"Create Social Link Endpoint","description":"Create or update a social link for the authenticated user.","operationId":"create_social_link_endpoint_holder_social_links_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSocialLinkRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holder/social-links/{link_id}":{"delete":{"tags":["holder"],"summary":"Delete Social Link Endpoint","description":"Delete a social link and clear the corresponding profile URL.","operationId":"delete_social_link_endpoint_holder_social_links__link_id__delete","parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"string","title":"Link Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holder/social-links/{link_id}/parse":{"post":{"tags":["holder"],"summary":"Parse Social Link Endpoint","description":"Parse a social profile link to extract life events.","operationId":"parse_social_link_endpoint_holder_social_links__link_id__parse_post","parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"string","title":"Link Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holder/biography/generate":{"post":{"tags":["holder"],"summary":"Generate Biography Endpoint","description":"Generate a Wikipedia-style biography from the user's profile data.","operationId":"generate_biography_endpoint_holder_biography_generate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/holder/biography":{"get":{"tags":["holder"],"summary":"Get Biography","description":"Return the cached biography JSON for the current user.","operationId":"get_biography_holder_biography_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/holder/public/{slug}":{"get":{"tags":["holder"],"summary":"Get Public Profile","description":"Get a public holder profile with public credentials.","operationId":"get_public_profile_holder_public__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holder/badge/{badge_hash}":{"get":{"tags":["holder"],"summary":"Get Badge Data","description":"Get verification data for a single badge.\n\nOnly returns data if both the credential and its parent profile are public.","operationId":"get_badge_data_holder_badge__badge_hash__get","parameters":[{"name":"badge_hash","in":"path","required":true,"schema":{"type":"string","title":"Badge Hash"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holder/badge/{badge_hash}/image":{"get":{"tags":["holder"],"summary":"Get Badge Image","description":"Generate or return cached badge PNG image.\n\nOnly returns data if both the credential and its parent profile are public.","operationId":"get_badge_image_holder_badge__badge_hash__image_get","parameters":[{"name":"badge_hash","in":"path","required":true,"schema":{"type":"string","title":"Badge Hash"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holder/badge/{badge_hash}/certificate":{"get":{"tags":["holder"],"summary":"Get Badge Certificate","description":"Generate a PDF certificate for a badge.\n\nOnly returns data if both the credential and its parent profile are public.","operationId":"get_badge_certificate_holder_badge__badge_hash__certificate_get","parameters":[{"name":"badge_hash","in":"path","required":true,"schema":{"type":"string","title":"Badge Hash"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/issuer-approval/check/{verification_id}":{"get":{"tags":["issuer-approval"],"summary":"Check Eligibility","description":"Check if issuer approval can be requested for this verification.","operationId":"check_eligibility_issuer_approval_check__verification_id__get","parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/issuer-approval/preview":{"post":{"tags":["issuer-approval"],"summary":"Preview Approval Email","description":"Return the rendered email content without sending it, so the user can preview.","operationId":"preview_approval_email_issuer_approval_preview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewApprovalRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/issuer-approval/send":{"post":{"tags":["issuer-approval"],"summary":"Send Approval Request","description":"Send an issuer approval email to the institution.","operationId":"send_approval_request_issuer_approval_send_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendApprovalRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/issuer-approval/status/{verification_id}":{"get":{"tags":["issuer-approval"],"summary":"Get Approval Status","description":"Get the status of an issuer approval request.","operationId":"get_approval_status_issuer_approval_status__verification_id__get","parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/issuer-approval/view/{secure_token}":{"get":{"tags":["issuer-approval"],"summary":"View Approval Request","description":"Public endpoint for institution staff to view the verification request.","operationId":"view_approval_request_issuer_approval_view__secure_token__get","parameters":[{"name":"secure_token","in":"path","required":true,"schema":{"type":"string","title":"Secure Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/issuer-approval/respond/{secure_token}":{"post":{"tags":["issuer-approval"],"summary":"Respond To Request","description":"Public endpoint for institution staff to confirm or dispute.","operationId":"respond_to_request_issuer_approval_respond__secure_token__post","parameters":[{"name":"secure_token","in":"path","required":true,"schema":{"type":"string","title":"Secure Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstitutionResponse"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/issuer-approval/my-requests":{"get":{"tags":["issuer-approval"],"summary":"Get My Requests","description":"Get recent issuer approval requests for the current user (for dashboard).","operationId":"get_my_requests_issuer_approval_my_requests_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/issuer-approval/admin/tracker/stats":{"get":{"tags":["issuer-approval"],"summary":"Get Tracker Stats","description":"Get aggregate issuer approval request statistics.","operationId":"get_tracker_stats_issuer_approval_admin_tracker_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/issuer-approval/admin/tracker":{"get":{"tags":["issuer-approval"],"summary":"Get Tracker List","description":"List issuer approval requests with filtering and pagination.","operationId":"get_tracker_list_issuer_approval_admin_tracker_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"email_status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/coupons/check/{code}":{"get":{"tags":["coupons"],"summary":"Check Coupon","description":"Check if a coupon code is valid (public, no auth needed).","operationId":"check_coupon_coupons_check__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/coupons/redeem":{"post":{"tags":["coupons"],"summary":"Redeem Coupon Endpoint","description":"Redeem a coupon code. Requires authentication.","operationId":"redeem_coupon_endpoint_coupons_redeem_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemCouponRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/coupons/admin":{"get":{"tags":["coupons"],"summary":"Admin List Coupons","description":"List all coupon codes with stats (super admin only).","operationId":"admin_list_coupons_coupons_admin_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["coupons"],"summary":"Admin Create Coupon","description":"Create a new coupon code (super admin only).","operationId":"admin_create_coupon_coupons_admin_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__coupons__CreateCouponRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/coupons/admin/{code}":{"delete":{"tags":["coupons"],"summary":"Admin Deactivate Coupon","description":"Deactivate a coupon by code (super admin only).","operationId":"admin_deactivate_coupon_coupons_admin__code__delete","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/claim/lookup/{token}":{"get":{"tags":["claim"],"summary":"Lookup","description":"Public lookup — returns institution branding info for a token.","operationId":"lookup_claim_lookup__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/claim/redeem":{"post":{"tags":["claim"],"summary":"Redeem","description":"Redeem a claim token for the authenticated user.\n\nSingle-use: a token that's already been redeemed returns 409.","operationId":"redeem_claim_redeem_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/wall/cards":{"get":{"tags":["wall"],"summary":"List Cards","description":"Public feed of redacted fraud detections.\n\nReturns the most recent REJECTED / SUSPECT verifications from anonymous\nuploads, fully scrubbed of PII.","operationId":"list_cards_wall_cards_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":1,"default":24,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Cards Wall Cards Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/wall/dashboard":{"get":{"tags":["wall"],"summary":"Wall Dashboard","description":"Single endpoint that returns the entire dashboard payload.\n\nFrontend calls this once on server-render and again every 30s for live\nupdates. Cheaper than 9 separate round-trips.","operationId":"wall_dashboard_wall_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Wall Dashboard Wall Dashboard Get"}}}}}}},"/wall/stats":{"get":{"tags":["wall"],"summary":"Wall Stats","operationId":"wall_stats_wall_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Wall Stats Wall Stats Get"}}}}}}},"/wall/techniques":{"get":{"tags":["wall"],"summary":"Wall Techniques","operationId":"wall_techniques_wall_techniques_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Wall Techniques Wall Techniques Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/wall/impersonated":{"get":{"tags":["wall"],"summary":"Wall Impersonated","operationId":"wall_impersonated_wall_impersonated_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Wall Impersonated Wall Impersonated Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/wall/trusted":{"get":{"tags":["wall"],"summary":"Wall Trusted","operationId":"wall_trusted_wall_trusted_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Wall Trusted Wall Trusted Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/wall/map":{"get":{"tags":["wall"],"summary":"Wall Map","operationId":"wall_map_wall_map_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Wall Map Wall Map Get"}}}}}}},"/wall/doc-types":{"get":{"tags":["wall"],"summary":"Wall Doc Types","operationId":"wall_doc_types_wall_doc_types_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Wall Doc Types Wall Doc Types Get"}}}}}}},"/wall/timeline":{"get":{"tags":["wall"],"summary":"Wall Timeline","operationId":"wall_timeline_wall_timeline_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Wall Timeline Wall Timeline Get"}}}}}}},"/wall/evolution":{"get":{"tags":["wall"],"summary":"Wall Evolution","operationId":"wall_evolution_wall_evolution_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Wall Evolution Wall Evolution Get"}}}}}}},"/wall/heatmap":{"get":{"tags":["wall"],"summary":"Wall Heatmap","operationId":"wall_heatmap_wall_heatmap_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Wall Heatmap Wall Heatmap Get"}}}}}}},"/wall/recent":{"get":{"tags":["wall"],"summary":"Wall Recent","operationId":"wall_recent_wall_recent_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Wall Recent Wall Recent Get"}}}}}}},"/wall/notice":{"post":{"tags":["wall"],"summary":"Wall Notice","description":"DSA Art. 16 notice-and-action endpoint.\n\nRecords a takedown / right-of-reply request against a named institution on\nthe Wall. Written to `wall_notices` table; reviewed by the legal contact\nwithin 5 business days (DSA Art. 17 statement of reasons).","operationId":"wall_notice_wall_notice_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WallNotice"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Wall Notice Wall Notice Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/health":{"get":{"tags":["v1","Health"],"summary":"Liveness probe","description":"Unauthenticated probe for load balancers and status pages.\n\nZero credits, zero DB reads, always-200 on a running process.","operationId":"get_health","responses":{"200":{"description":"Service is up.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.verify.turingcerts.com/v1/health\""},{"lang":"python","label":"requests","source":"import requests\nr = requests.get(\"https://api.verify.turingcerts.com/v1/health\")\nr.raise_for_status()\nprint(r.json())"},{"lang":"javascript","label":"fetch","source":"const r = await fetch(\"https://api.verify.turingcerts.com/v1/health\");\nconsole.log(await r.json());"},{"lang":"go","label":"net/http","source":"package main\n\nimport (\"encoding/json\"; \"fmt\"; \"net/http\")\n\nfunc main() {\n  r, _ := http.Get(\"https://api.verify.turingcerts.com/v1/health\")\n  defer r.Body.Close()\n  var b map[string]any\n  json.NewDecoder(r.Body).Decode(&b)\n  fmt.Println(b)\n}"}]}},"/v1/status":{"get":{"tags":["v1","Health"],"summary":"Per-token status","description":"Returns the token's rate-limit and credit state.\n\nScopes aren't enforced here — any valid token can read its own\nstatus. ``plan`` may be null if the token was minted under a plan\nthat has since been downgraded; callers should still honour 403\n``plan_required`` on write endpoints.","operationId":"get_status","responses":{"200":{"description":"Token accepted; rate-limit and credit state returned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}},"401":{"description":"Missing or malformed Authorization header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.verify.turingcerts.com/v1/status\" \\\n  -H \"Authorization: Bearer $TV_API_KEY\""},{"lang":"python","label":"requests","source":"import os, requests\nheaders = {\"Authorization\": f\"Bearer {os.environ[\"TV_API_KEY\"]}\"}\nr = requests.get(\"https://api.verify.turingcerts.com/v1/status\", headers=headers)\nprint(r.json())"},{"lang":"javascript","label":"fetch","source":"const r = await fetch(\"https://api.verify.turingcerts.com/v1/status\", {\n  headers: { Authorization: `Bearer ${process.env.TV_API_KEY}` },\n});\nconsole.log(await r.json());"},{"lang":"go","label":"net/http","source":"req, _ := http.NewRequest(\"GET\", \"https://api.verify.turingcerts.com/v1/status\", nil)\nreq.Header.Set(\"Authorization\", \"Bearer \"+os.Getenv(\"TV_API_KEY\"))\nresp, _ := http.DefaultClient.Do(req)\ndefer resp.Body.Close()"}]}},"/v1/verifications":{"post":{"tags":["v1","Verifications"],"summary":"Submit a document for verification","description":"Submit one document and get a verdict.\n\nAccepts either a multipart upload, a ``document_url``, or a\n``document_base64``. Test-mode tokens (``tv_test_sk_...``) return\na deterministic verdict without calling the engine; live tokens\ndrive the real pipeline. Idempotency-Key replays for 24h.","operationId":"create_verification","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_verification"}}}},"responses":{"200":{"description":"Synchronous verdict.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Verification"}}}},"400":{"description":"Bad input (unsupported MIME, too big, missing source).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Overage opted in but card declined.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Plan does not grant API access, or token missing scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency-Key reused with a different body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit or quota exhausted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.verify.turingcerts.com/v1/verifications\" \\\n  -H \"Authorization: Bearer $TV_API_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -F \"file=@/path/to/diploma.pdf\""},{"lang":"python","label":"requests","source":"import os, uuid, requests\nheaders = {\n  \"Authorization\": f\"Bearer {os.environ[\\\"TV_API_KEY\\\"]}\",\n  \"Idempotency-Key\": str(uuid.uuid4()),\n}\nwith open(\"diploma.pdf\", \"rb\") as f:\n  r = requests.post(\n    \"https://api.verify.turingcerts.com/v1/verifications\",\n    headers=headers, files={\"file\": f},\n  )\nprint(r.json())"},{"lang":"javascript","label":"fetch","source":"import { randomUUID } from 'node:crypto';\nimport fs from 'node:fs';\nconst body = new FormData();\nbody.append('file', new Blob([fs.readFileSync('diploma.pdf')]));\nconst r = await fetch('https://api.verify.turingcerts.com/v1/verifications', {\n  method: 'POST',\n  headers: {\n    'Authorization': `Bearer ${process.env.TV_API_KEY}`,\n    'Idempotency-Key': randomUUID(),\n  },\n  body,\n});\nconsole.log(await r.json());"},{"lang":"go","label":"net/http","source":"// multipart file upload omitted for brevity; see\n// https://api.verify.turingcerts.com/v1/docs#go-multipart\nreq, _ := http.NewRequest(\"POST\", \"https://api.verify.turingcerts.com/v1/verifications\", body)\nreq.Header.Set(\"Authorization\", \"Bearer \"+os.Getenv(\"TV_API_KEY\"))\nreq.Header.Set(\"Idempotency-Key\", uuid.NewString())\nreq.Header.Set(\"Content-Type\", writer.FormDataContentType())\nresp, _ := http.DefaultClient.Do(req)"}]},"get":{"tags":["v1","Verifications"],"summary":"List verifications","description":"Cursor-paginated list of the caller's verifications.\n\nSorted ``created_at DESC``. ``starting_after`` is the last item's\nid from the previous page. ``has_more`` is True when another page\nexists; ``next_cursor`` is the id to feed into the next call.","operationId":"list_verifications","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"starting_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor from a previous page.","title":"Starting After"},"description":"Opaque cursor from a previous page."}],"responses":{"200":{"description":"Cursor-paginated list of verifications.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Verifications"}}}},"401":{"description":"Missing or invalid bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Token missing 'verifications:read' scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.verify.turingcerts.com/v1/verifications?limit=20\" \\\n  -H \"Authorization: Bearer $TV_API_KEY\""},{"lang":"python","label":"requests","source":"import requests, os\nr = requests.get(\n  \"https://api.verify.turingcerts.com/v1/verifications\",\n  headers={\"Authorization\": f\"Bearer {os.environ[\\\"TV_API_KEY\\\"]}\"},\n  params={\"limit\": 20},\n)\nprint([v['id'] for v in r.json()['data']])"},{"lang":"javascript","label":"fetch","source":"const u = new URL('https://api.verify.turingcerts.com/v1/verifications');\nu.searchParams.set('limit', '20');\nconst r = await fetch(u, {\n  headers: { 'Authorization': `Bearer ${process.env.TV_API_KEY}` }\n});\nconst { data, pagination } = await r.json();"},{"lang":"go","label":"net/http","source":"req, _ := http.NewRequest(\"GET\", \"https://api.verify.turingcerts.com/v1/verifications?limit=20\", nil)\nreq.Header.Set(\"Authorization\", \"Bearer \"+os.Getenv(\"TV_API_KEY\"))\nresp, _ := http.DefaultClient.Do(req)"}]}},"/v1/verifications/{verification_id}":{"get":{"tags":["v1","Verifications"],"summary":"Fetch a verification","description":"Fetch a verdict by id. 404 if not owned by the caller — we\ndon't leak the existence of other users' verifications.","operationId":"get_verification","parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}}],"responses":{"200":{"description":"The verification record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Verification"}}}},"401":{"description":"Missing or invalid bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Token missing 'verifications:read' scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Verification not found, or not owned by this user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.verify.turingcerts.com/v1/verifications/ver_01HY...\" \\\n  -H \"Authorization: Bearer $TV_API_KEY\""},{"lang":"python","label":"requests","source":"import requests, os\nvid = \"ver_01HY...\"\nr = requests.get(\n  f\"https://api.verify.turingcerts.com/v1/verifications/{vid}\",\n  headers={\"Authorization\": f\"Bearer {os.environ[\\\"TV_API_KEY\\\"]}\"},\n)\nprint(r.json())"},{"lang":"javascript","label":"fetch","source":"const id = 'ver_01HY...';\nconst r = await fetch(\n  `https://api.verify.turingcerts.com/v1/verifications/${id}`,\n  { headers: { 'Authorization': `Bearer ${process.env.TV_API_KEY}` } },\n);"},{"lang":"go","label":"net/http","source":"url := \"https://api.verify.turingcerts.com/v1/verifications/\" + id\nreq, _ := http.NewRequest(\"GET\", url, nil)\nreq.Header.Set(\"Authorization\", \"Bearer \"+os.Getenv(\"TV_API_KEY\"))"}]}},"/v1/verifications/batch":{"post":{"tags":["v1","Verifications"],"summary":"Submit a batch of documents","description":"Submit up to 1000 documents in a single call (Business only).\n\nSynchronous for Phase 1 — every item is processed before the\nresponse returns. Phase 3 adds async + webhook notify. Test-mode\nbatches charge zero; live-mode batches charge N credits.","operationId":"create_verification_batch","responses":{"200":{"description":"Synchronous batch result with per-item verdicts.","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Verification Batch"}}}},"400":{"description":"Malformed batch body or exceeds 1000 items.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Batch is Business-only (or missing scope).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.verify.turingcerts.com/v1/verifications/batch\" \\\n  -H \"Authorization: Bearer $TV_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"items\":[{\"document_url\":\"https://...\"},{\"document_url\":\"https://...\"}]}'"},{"lang":"python","label":"requests","source":"import requests, os\nr = requests.post(\n  \"https://api.verify.turingcerts.com/v1/verifications/batch\",\n  headers={\"Authorization\": f\"Bearer {os.environ[\\\"TV_API_KEY\\\"]}\"},\n  json={\"items\": [{\"document_url\": u} for u in urls]},\n)\nprint([v['id'] for v in r.json()['data']])"},{"lang":"javascript","label":"fetch","source":"const r = await fetch('https://api.verify.turingcerts.com/v1/verifications/batch', {\n  method: 'POST',\n  headers: {\n    'Authorization': `Bearer ${process.env.TV_API_KEY}`,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({ items: urls.map(u => ({ document_url: u })) }),\n});"},{"lang":"go","label":"net/http","source":"buf, _ := json.Marshal(map[string]any{\"items\": items})\nreq, _ := http.NewRequest(\"POST\", \"https://api.verify.turingcerts.com/v1/verifications/batch\", bytes.NewReader(buf))\nreq.Header.Set(\"Authorization\", \"Bearer \"+os.Getenv(\"TV_API_KEY\"))\nreq.Header.Set(\"Content-Type\", \"application/json\")"}]}},"/v1/webhooks":{"get":{"tags":["v1","Webhooks"],"summary":"List webhook endpoints","operationId":"list_webhook_endpoints","responses":{"200":{"description":"All endpoints owned by the caller (active + disabled).","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/WebhookEndpoint"},"type":"array","title":"Response List Webhook Endpoints"}}}},"401":{"description":"Session cookie missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X GET \"https://api.verify.turingcerts.com/v1/webhooks\" \\\n  -H \"Authorization: Bearer $TV_API_KEY\""}]},"post":{"tags":["v1","Webhooks"],"summary":"Register a webhook endpoint","operationId":"create_webhook_endpoint","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointCreate"}}},"required":true},"responses":{"201":{"description":"Endpoint created. The raw signing secret is returned exactly once.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointCreated"}}}},"400":{"description":"URL is unsafe or events[] is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Session cookie missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Active-endpoint cap reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.verify.turingcerts.com/v1/webhooks\" \\\n  -H \"Authorization: Bearer $TV_SESSION_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"url\": \"https://example.com/hooks/turing-verify\", \"events\": [\"verification.completed\",\"verification.failed\"], \"description\": \"prod ATS ingestion\"}'"},{"lang":"python","label":"requests","source":"import os, requests\nr = requests.post(\n  \"https://api.verify.turingcerts.com/v1/webhooks\",\n  headers={\"Authorization\": f\"Bearer {os.environ[\\\"TV_SESSION_TOKEN\\\"]}\"},\n  json={\n    \"url\": \"https://example.com/hooks/turing-verify\",\n    \"events\": [\"verification.completed\", \"verification.failed\"],\n    \"description\": \"prod ATS ingestion\",\n  },\n)\nsecret = r.json()[\"secret\"]  # store securely — shown once!"},{"lang":"javascript","label":"fetch","source":"const r = await fetch('https://api.verify.turingcerts.com/v1/webhooks', {\n  method: 'POST',\n  headers: {\n    'Authorization': `Bearer ${process.env.TV_SESSION_TOKEN}`,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    url: 'https://example.com/hooks/turing-verify',\n    events: ['verification.completed', 'verification.failed'],\n    description: 'prod ATS ingestion',\n  }),\n});\nconst { secret } = await r.json(); // shown once!\n"}]}},"/v1/webhooks/{webhook_id}":{"get":{"tags":["v1","Webhooks"],"summary":"Get webhook endpoint details + recent deliveries","operationId":"get_webhook_endpoint","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"200":{"description":"Endpoint metadata + last 20 deliveries.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointDetail"}}}},"401":{"description":"Session cookie missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Endpoint not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X GET \"https://api.verify.turingcerts.com/v1/webhooks/{webhook_id}\" \\\n  -H \"Authorization: Bearer $TV_API_KEY\""}]},"patch":{"tags":["v1","Webhooks"],"summary":"Update a webhook endpoint","operationId":"update_webhook_endpoint","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointUpdate"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpoint"}}}},"400":{"description":"Invalid URL or events[].","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Session cookie missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Endpoint not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X PATCH \"https://api.verify.turingcerts.com/v1/webhooks/{webhook_id}\" \\\n  -H \"Authorization: Bearer $TV_API_KEY\""}]},"delete":{"tags":["v1","Webhooks"],"summary":"Soft-delete a webhook endpoint","operationId":"delete_webhook_endpoint","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"204":{"description":"Endpoint disabled; row retained for audit."},"401":{"description":"Session cookie missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Endpoint not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X DELETE \"https://api.verify.turingcerts.com/v1/webhooks/{webhook_id}\" \\\n  -H \"Authorization: Bearer $TV_API_KEY\""}]}},"/v1/webhooks/{webhook_id}/rotate-secret":{"post":{"tags":["v1","Webhooks"],"summary":"Rotate a webhook endpoint's signing secret","operationId":"rotate_webhook_secret","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"200":{"description":"New secret issued; shown once.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointCreated"}}}},"401":{"description":"Session cookie missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Endpoint not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.verify.turingcerts.com/v1/webhooks/{webhook_id}/rotate-secret\" \\\n  -H \"Authorization: Bearer $TV_API_KEY\""}]}},"/v1/webhooks/{webhook_id}/test":{"post":{"tags":["v1","Webhooks"],"summary":"Fire a synthetic ping to the endpoint","operationId":"test_webhook_endpoint","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"200":{"description":"Delivery enqueued and dispatched immediately.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDelivery"}}}},"401":{"description":"Session cookie missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Endpoint not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Endpoint is disabled — re-activate before testing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.verify.turingcerts.com/v1/webhooks/{webhook_id}/test\" \\\n  -H \"Authorization: Bearer $TV_API_KEY\""}]}},"/v1/webhooks/{webhook_id}/deliveries/{delivery_id}/replay":{"post":{"tags":["v1","Webhooks"],"summary":"Replay a previous delivery","operationId":"replay_webhook_delivery","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}},{"name":"delivery_id","in":"path","required":true,"schema":{"type":"string","title":"Delivery Id"}}],"responses":{"200":{"description":"A new delivery row is enqueued with the original payload.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDelivery"}}}},"401":{"description":"Session cookie missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Endpoint or delivery not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.verify.turingcerts.com/v1/webhooks/{webhook_id}/deliveries/{delivery_id}/replay\" \\\n  -H \"Authorization: Bearer $TV_API_KEY\""}]}},"/v1/account":{"get":{"tags":["v1","Account"],"summary":"Fetch the caller's account snapshot","description":"Return ``{user_id, email, plan, credits}`` for the caller.\n\nThis is the single source of truth clients should poll on startup\n(and on receipt of ``X-Credits-Warning: approaching-quota``) to\nshow live budget + plan state.","operationId":"get_account","responses":{"200":{"description":"Account snapshot returned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Account"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Token lacks account:read scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.verify.turingcerts.com/v1/account\" \\\n  -H \"Authorization: Bearer $TV_API_KEY\""},{"lang":"python","label":"requests","source":"import requests, os\nr = requests.get(\"https://api.verify.turingcerts.com/v1/account\",\n                 headers={\"Authorization\": f\"Bearer {os.environ[\\\"TV_API_KEY\\\"]}\"})\nprint(r.json()[\"credits\"])"},{"lang":"javascript","label":"fetch","source":"const r = await fetch('https://api.verify.turingcerts.com/v1/account', {\n  headers: { 'Authorization': `Bearer ${process.env.TV_API_KEY}` }\n});\nconst { credits } = await r.json();"},{"lang":"go","label":"net/http","source":"req, _ := http.NewRequest(\"GET\", \"https://api.verify.turingcerts.com/v1/account\", nil)\nreq.Header.Set(\"Authorization\", \"Bearer \"+os.Getenv(\"TV_API_KEY\"))"}]}},"/v1/account/usage":{"get":{"tags":["v1","Account"],"summary":"MTD usage histogram grouped by day/endpoint/token","description":"Aggregate ``api_usage_events`` into a histogram.\n\nAlways scoped to the caller's ``user_id`` — even a token that\nsomehow leaked across accounts can't peek at another user's\nusage.","operationId":"get_account_usage","parameters":[{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Calendar month YYYY-MM. Defaults to the current month.","examples":["2026-04"],"title":"Period"},"description":"Calendar month YYYY-MM. Defaults to the current month."},{"name":"group_by","in":"query","required":false,"schema":{"enum":["day","endpoint","token"],"type":"string","description":"Aggregate by day, endpoint path, or token_id.","default":"day","title":"Group By"},"description":"Aggregate by day, endpoint path, or token_id."}],"responses":{"200":{"description":"Usage buckets for the period.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageResponse"}}}},"400":{"description":"Invalid period format.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Token lacks account:read scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.verify.turingcerts.com/v1/account/usage?period=2026-04&group_by=day\" \\\n  -H \"Authorization: Bearer $TV_API_KEY\""},{"lang":"python","label":"requests","source":"import requests, os\nr = requests.get(\n  \"https://api.verify.turingcerts.com/v1/account/usage\",\n  headers={\"Authorization\": f\"Bearer {os.environ[\\\"TV_API_KEY\\\"]}\"},\n  params={\"period\": \"2026-04\", \"group_by\": \"day\"},\n)"},{"lang":"javascript","label":"fetch","source":"const u = new URL('https://api.verify.turingcerts.com/v1/account/usage');\nu.searchParams.set('period', '2026-04');\nu.searchParams.set('group_by', 'day');\nconst r = await fetch(u, {\n  headers: { 'Authorization': `Bearer ${process.env.TV_API_KEY}` },\n});"},{"lang":"go","label":"net/http","source":"url := \"https://api.verify.turingcerts.com/v1/account/usage?period=2026-04&group_by=day\"\nreq, _ := http.NewRequest(\"GET\", url, nil)\nreq.Header.Set(\"Authorization\", \"Bearer \"+os.Getenv(\"TV_API_KEY\"))"}]}},"/v1/tokens":{"get":{"tags":["v1","Tokens"],"summary":"List my API tokens","description":"List the caller's *active* tokens — revoked rows are hidden.\n\nNever includes the raw secret or the argon2id hash. The masked\ndisplay format lives entirely in ``prefix`` + ``last4``.","operationId":"list_tokens","responses":{"200":{"description":"Active (non-revoked) tokens owned by the caller.","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Token"},"type":"array","title":"Response List Tokens"}}}},"401":{"description":"Session cookie missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X GET \"https://api.verify.turingcerts.com/v1/tokens\" \\\n  -H \"Authorization: Bearer $TV_API_KEY\""}]},"post":{"tags":["v1","Tokens"],"summary":"Create a new API token","description":"Mint a new ``tv_(live|test)_sk_...`` bearer for the caller.\n\nReturns the raw secret **exactly once**. We persist only its\nargon2id hash; losing the secret means rotating.","operationId":"create_token","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenCreate"}}},"required":true},"responses":{"201":{"description":"Token created. The raw secret is in the response body and will not be shown again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenCreated"}}}},"401":{"description":"Session cookie missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Malformed body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.verify.turingcerts.com/v1/tokens\" \\\n  -H \"Authorization: Bearer $TV_API_KEY\""}]}},"/v1/tokens/{token_id}":{"delete":{"tags":["v1","Tokens"],"summary":"Revoke an API token","description":"Soft-revoke a token.\n\nSets ``revoked_at = now()``. Phase 1's bearer middleware treats\n``revoked_at IS NOT NULL`` as unauthenticated — 5-second cache TTL\nper §3.6. Idempotent: re-revoking a revoked token is a no-op 204.","operationId":"delete_token","parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"string","title":"Token Id"}}],"responses":{"204":{"description":"Token is revoked."},"401":{"description":"Session cookie missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Token id does not exist or belongs to another user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X DELETE \"https://api.verify.turingcerts.com/v1/tokens/{token_id}\" \\\n  -H \"Authorization: Bearer $TV_API_KEY\""}]}},"/v1/tokens/{token_id}/rotate":{"post":{"tags":["v1","Tokens"],"summary":"Rotate an API token (keep id, new secret)","description":"Replace a token's secret while keeping the same id.\n\nFull rotation (24h grace window) is Phase 1 / §3.5. For Phase 0 the\nnew hash atomically replaces the old; the previous secret stops\nauthenticating immediately. The token id stays the same so\ndownstream references (webhook configs, audit logs) don't break.","operationId":"rotate_token","parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"string","title":"Token Id"}}],"responses":{"200":{"description":"Token rotated. The new raw secret is in the response body and will not be shown again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenCreated"}}}},"401":{"description":"Session cookie missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Token id does not exist or belongs to another user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Token is already revoked; create a new one instead.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.verify.turingcerts.com/v1/tokens/{token_id}/rotate\" \\\n  -H \"Authorization: Bearer $TV_API_KEY\""}]}},"/v1/mcp/health":{"get":{"tags":["v1","MCP"],"summary":"Session-authed MCP liveness probe for the developer portal","description":"Session-authed mirror of ``/mcp/ping``.\n\nReturns the same shape as ``/mcp/ping`` plus structured capability\ncounts the portal renders on ``/developers/ai``.","operationId":"get_mcp_health","responses":{"200":{"description":"Server is up; capability counts returned.","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Mcp Health"}}}},"401":{"description":"Missing NextAuth session cookie.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X GET \"https://api.verify.turingcerts.com/v1/mcp/health\" \\\n  -H \"Authorization: Bearer $TV_API_KEY\""}]}},"/health":{"get":{"summary":"Health","description":"Health check endpoint.\n\nBy default returns immediately without DB queries (for Railway healthcheck).\nPass ?detail=true for full subsystem status.","operationId":"health_health_get","parameters":[{"name":"detail","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Detail"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AcceptTosRequest":{"properties":{"version":{"type":"string","title":"Version","default":"1.0"}},"type":"object","title":"AcceptTosRequest"},"Account":{"properties":{"user_id":{"type":"string","title":"User Id","description":"Opaque internal user id.","examples":["usr_01HTN8Z9MJB00000000000000"]},"email":{"type":"string","title":"Email","description":"Account owner email.","examples":["alice@example.com"]},"plan":{"$ref":"#/components/schemas/Plan"},"credits":{"$ref":"#/components/schemas/Credits"}},"type":"object","required":["user_id","email","plan","credits"],"title":"Account","description":"Metadata about the authenticated user — response to ``GET /v1/account``."},"AddVerificationRequest":{"properties":{"verification_id":{"type":"string","title":"Verification Id"}},"type":"object","required":["verification_id"],"title":"AddVerificationRequest"},"AnnotationCorrection":{"properties":{"index":{"type":"integer","title":"Index"},"raw_x":{"type":"number","title":"Raw X"},"raw_y":{"type":"number","title":"Raw Y"},"corrected_x":{"type":"number","title":"Corrected X"},"corrected_y":{"type":"number","title":"Corrected Y"},"raw_w":{"type":"number","title":"Raw W","default":0.0},"raw_h":{"type":"number","title":"Raw H","default":0.0},"corrected_w":{"type":"number","title":"Corrected W","default":0.0},"corrected_h":{"type":"number","title":"Corrected H","default":0.0},"label":{"type":"string","title":"Label","default":""}},"type":"object","required":["index","raw_x","raw_y","corrected_x","corrected_y"],"title":"AnnotationCorrection","description":"A single annotation correction from the user."},"BackfillLanguagesRequest":{"properties":{"dry_run":{"type":"boolean","title":"Dry Run","default":false}},"type":"object","title":"BackfillLanguagesRequest"},"Body_create_verification":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"},"document_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Url"},"document_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Base64"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type"}},"type":"object","title":"Body_create_verification"},"Body_upload_avatar_holder_profile_avatar_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_avatar_holder_profile_avatar_post"},"Body_upload_cv_holder_cv_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_cv_holder_cv_upload_post"},"Body_upload_prospects_admin_outreach_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_prospects_admin_outreach_upload_post"},"Body_verify_verify_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"doc_type_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type Hint"},"verification_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verification Mode","default":"standard"}},"type":"object","required":["file"],"title":"Body_verify_verify_post"},"BulkSendRequest":{"properties":{"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"limit":{"type":"integer","title":"Limit","default":50}},"type":"object","title":"BulkSendRequest"},"CalibrateRequest":{"properties":{"verification_id":{"type":"string","title":"Verification Id"},"annotations":{"items":{"$ref":"#/components/schemas/AnnotationCorrection"},"type":"array","title":"Annotations"}},"type":"object","required":["verification_id","annotations"],"title":"CalibrateRequest","description":"Request body for submitting calibration corrections."},"CalibrationFeedbackRequest":{"properties":{"verification_id":{"type":"string","title":"Verification Id","description":"ID of the verification session"},"annotation_index":{"type":"integer","minimum":0.0,"title":"Annotation Index","description":"Index of the annotation in the annotations array"},"corrected_x":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Corrected X","description":"Human-corrected X position (%)"},"corrected_y":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Corrected Y","description":"Human-corrected Y position (%)"},"corrected_w":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Corrected W","description":"Human-corrected width (%)"},"corrected_h":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Corrected H","description":"Human-corrected height (%)"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"Annotation label for reference","default":""}},"type":"object","required":["verification_id","annotation_index","corrected_x","corrected_y","corrected_w","corrected_h"],"title":"CalibrationFeedbackRequest","description":"Request body for calibration feedback submission."},"CheckoutRequest":{"properties":{"plan":{"type":"string","title":"Plan"},"success_url":{"type":"string","title":"Success Url"},"cancel_url":{"type":"string","title":"Cancel Url"},"interval":{"type":"string","title":"Interval","default":"monthly"},"referral_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referral Code"}},"type":"object","required":["plan","success_url","cancel_url"],"title":"CheckoutRequest"},"ClaimAnonymousRequest":{"properties":{"fingerprint_hash":{"type":"string","title":"Fingerprint Hash","default":""},"cookie_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cookie Token"}},"type":"object","title":"ClaimAnonymousRequest","description":"Request body for claiming anonymous verifications after login."},"ClearCacheRequest":{"properties":{"file_hash":{"type":"string","title":"File Hash"}},"type":"object","required":["file_hash"],"title":"ClearCacheRequest"},"CompleteProfileRequest":{"properties":{"name":{"type":"string","title":"Name"},"company":{"type":"string","title":"Company"},"use_case":{"type":"string","title":"Use Case"}},"type":"object","required":["name","company","use_case"],"title":"CompleteProfileRequest"},"CompleteTestRequest":{"properties":{"winner_variant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Winner Variant Id"}},"type":"object","title":"CompleteTestRequest"},"ConfigUpdate":{"properties":{"scan_interval_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scan Interval Seconds"},"posts_per_subreddit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Posts Per Subreddit"},"auto_issuer_request":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Auto Issuer Request"},"subreddits":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Subreddits"}},"type":"object","title":"ConfigUpdate"},"CreateFolderRequest":{"properties":{"name":{"type":"string","title":"Name"},"applicant_name":{"type":"string","title":"Applicant Name","default":""},"applicant_email":{"type":"string","title":"Applicant Email","default":""},"notes":{"type":"string","title":"Notes","default":""}},"type":"object","required":["name"],"title":"CreateFolderRequest"},"CreateLifeEventRequest":{"properties":{"category":{"type":"string","title":"Category"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"event_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Date"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"},"is_public":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Is Public","default":1}},"type":"object","required":["category","title"],"title":"CreateLifeEventRequest"},"CreateProfileRequest":{"properties":{"display_name":{"type":"string","title":"Display Name"},"slug":{"type":"string","title":"Slug"},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Url"}},"type":"object","required":["display_name","slug"],"title":"CreateProfileRequest"},"CreateReferralCodeRequest":{"properties":{"code":{"type":"string","title":"Code"},"referrer_email":{"type":"string","title":"Referrer Email"}},"type":"object","required":["code","referrer_email"],"title":"CreateReferralCodeRequest"},"CreateSocialLinkRequest":{"properties":{"platform":{"type":"string","title":"Platform"},"profile_url":{"type":"string","title":"Profile Url"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"}},"type":"object","required":["platform","profile_url"],"title":"CreateSocialLinkRequest"},"CreateTestRequest":{"properties":{"name":{"type":"string","title":"Name"},"variants":{"items":{"$ref":"#/components/schemas/VariantInput"},"type":"array","title":"Variants"},"language":{"type":"string","title":"Language","default":"en"},"target_type":{"type":"string","enum":["school","hr"],"title":"Target Type","default":"school"}},"type":"object","required":["name","variants"],"title":"CreateTestRequest"},"CreditStatus":{"properties":{"remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remaining","description":"Credits left this billing period; negative when overage is opted in.","examples":[137]},"reset_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reset At","description":"ISO 8601 timestamp when the quota next resets.","examples":["2026-05-01T00:00:00Z"]}},"type":"object","title":"CreditStatus"},"Credits":{"properties":{"included":{"type":"integer","title":"Included","description":"Credits bundled with the plan for this period.","examples":[150]},"used":{"type":"integer","title":"Used","description":"Credits consumed so far this period.","examples":[12]},"remaining":{"type":"integer","title":"Remaining","description":"Credits left this period; goes negative if overage is opted-in.","examples":[138]},"reset_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reset At","description":"ISO 8601 timestamp when the quota next resets (billing anchor).","examples":["2026-05-01T00:00:00Z"]},"overage_opt_in":{"type":"boolean","title":"Overage Opt In","description":"Whether the account continues to be served after quota is exhausted.","examples":[false]}},"type":"object","required":["included","used","remaining","overage_opt_in"],"title":"Credits","description":"Current billing period's credit state."},"DeleteCouponRequest":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"DeleteCouponRequest"},"DisputeRequest":{"properties":{"reason":{"type":"string","maxLength":2000,"minLength":10,"title":"Reason"}},"type":"object","required":["reason"],"title":"DisputeRequest"},"EnableRequest":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":true}},"type":"object","title":"EnableRequest"},"GlobalConfigUpdate":{"properties":{"issuer_email_limit_per_day":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Issuer Email Limit Per Day"}},"type":"object","title":"GlobalConfigUpdate"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Literal 'ok' while the process is alive.","examples":["ok"]},"version":{"type":"string","title":"Version","description":"Short git SHA the process is running. 'unknown' in environments without git.","examples":["abcd1234"]},"timestamp":{"type":"string","title":"Timestamp","description":"Server UTC time at response generation (ISO 8601).","examples":["2026-04-17T09:12:33Z"]}},"type":"object","required":["status","version","timestamp"],"title":"HealthResponse","description":"Liveness-probe response; always safe to call."},"InstagramConfigUpdate":{"properties":{"scan_interval_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scan Interval Seconds"},"auto_issuer_request":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Auto Issuer Request"},"search_queries":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Search Queries"}},"type":"object","title":"InstagramConfigUpdate"},"InstitutionResponse":{"properties":{"action":{"type":"string","enum":["confirm","dispute"],"title":"Action"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["action"],"title":"InstitutionResponse"},"LoginRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"OverageRequest":{"properties":{"success_url":{"type":"string","title":"Success Url"},"cancel_url":{"type":"string","title":"Cancel Url"},"referral_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referral Code"}},"type":"object","required":["success_url","cancel_url"],"title":"OverageRequest"},"Plan":{"properties":{"tier":{"type":"string","enum":["free","personal","pro","business"],"title":"Tier","description":"Plan tier: free/personal/pro/business.","examples":["pro"]},"billing_interval":{"anyOf":[{"type":"string","enum":["monthly","yearly"]},{"type":"null"}],"title":"Billing Interval","description":"Monthly or yearly. Null for free tier.","examples":["monthly"]},"api_access":{"type":"boolean","title":"Api Access","description":"Whether this plan can use tv_live_sk_ tokens against /v1. Pro+ only.","examples":[true]},"rate_limit_burst":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rate Limit Burst","description":"Max requests in the token bucket (burst size). Null when no API access.","examples":[20]},"rate_limit_sustained":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rate Limit Sustained","description":"Sustained requests per minute ceiling. Null when no API access.","examples":[600]}},"type":"object","required":["tier","api_access"],"title":"Plan","description":"The caller's current plan + rate limits."},"PortalRequest":{"properties":{"return_url":{"type":"string","title":"Return Url"}},"type":"object","required":["return_url"],"title":"PortalRequest"},"PreviewApprovalRequest":{"properties":{"verification_id":{"type":"string","title":"Verification Id"}},"type":"object","required":["verification_id"],"title":"PreviewApprovalRequest"},"PurchaseCreditsRequest":{"properties":{"pack":{"type":"string","title":"Pack"},"success_url":{"type":"string","title":"Success Url"},"cancel_url":{"type":"string","title":"Cancel Url"}},"type":"object","required":["pack","success_url","cancel_url"],"title":"PurchaseCreditsRequest"},"RateLimitStatus":{"properties":{"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit","description":"Per-token sustained limit in requests/minute.","examples":[600]},"burst":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Burst","description":"Per-token burst capacity (token-bucket size).","examples":[20]}},"type":"object","title":"RateLimitStatus"},"RedeemCouponRequest":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"RedeemCouponRequest"},"RedeemRequest":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"RedeemRequest"},"RegisterRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"name":{"type":"string","title":"Name","default":""}},"type":"object","required":["email","password"],"title":"RegisterRequest"},"ReorderCredentialsRequest":{"properties":{"ordered_ids":{"items":{"type":"string"},"type":"array","title":"Ordered Ids"}},"type":"object","required":["ordered_ids"],"title":"ReorderCredentialsRequest"},"ResolveDisputeRequest":{"properties":{"status":{"type":"string","pattern":"^(upheld|rejected|withdrawn)$","title":"Status"},"notes":{"type":"string","maxLength":4000,"minLength":1,"title":"Notes"}},"type":"object","required":["status","notes"],"title":"ResolveDisputeRequest"},"SendApprovalRequest":{"properties":{"verification_id":{"type":"string","title":"Verification Id"},"consent_confirmed":{"type":"boolean","title":"Consent Confirmed"},"auto_send":{"type":"boolean","title":"Auto Send","default":false}},"type":"object","required":["verification_id","consent_confirmed"],"title":"SendApprovalRequest"},"SendEmailRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"SendEmailRequest"},"SendMagicLinkRequest":{"properties":{"email":{"type":"string","title":"Email"},"callback_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Callback Url"}},"type":"object","required":["email"],"title":"SendMagicLinkRequest"},"SetQuotaRequest":{"properties":{"email":{"type":"string","title":"Email"},"quota":{"type":"integer","title":"Quota"},"plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan"}},"type":"object","required":["email","quota"],"title":"SetQuotaRequest","description":"Request body for setting a user's verification quota and plan."},"StatusResponse":{"properties":{"ok":{"type":"boolean","title":"Ok","description":"True when the token is accepted.","examples":[true]},"environment":{"type":"string","title":"Environment","description":"'live' or 'test'.","examples":["live"]},"plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan","examples":["pro"]},"rate_limit":{"$ref":"#/components/schemas/RateLimitStatus"},"credits":{"$ref":"#/components/schemas/CreditStatus"}},"type":"object","required":["ok","environment","rate_limit","credits"],"title":"StatusResponse","description":"Per-token status snapshot."},"SubmitReviewRequest":{"properties":{"verification_id":{"type":"string","title":"Verification Id"},"human_verdict":{"type":"string","title":"Human Verdict"},"decision_reason":{"type":"string","title":"Decision Reason"}},"type":"object","required":["verification_id","human_verdict","decision_reason"],"title":"SubmitReviewRequest"},"SyncUserRequest":{"properties":{"sub":{"type":"string","title":"Sub"},"email":{"type":"string","title":"Email"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"picture":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Picture"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"referral_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referral Code"}},"type":"object","required":["sub","email"],"title":"SyncUserRequest","description":"Request body for syncing user data after OAuth login."},"TemplateCreate":{"properties":{"name":{"type":"string","title":"Name"},"subject":{"type":"string","title":"Subject"},"body_markdown":{"type":"string","title":"Body Markdown"},"language":{"type":"string","title":"Language","default":"en"}},"type":"object","required":["name","subject","body_markdown"],"title":"TemplateCreate"},"TemplateUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"body_markdown":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Markdown"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},"type":"object","title":"TemplateUpdate"},"ThreadsConfigUpdate":{"properties":{"scan_interval_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scan Interval Seconds"},"auto_issuer_request":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Auto Issuer Request"},"search_queries":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Search Queries"}},"type":"object","title":"ThreadsConfigUpdate"},"Token":{"properties":{"id":{"type":"string","title":"Id","description":"Opaque token id (tok_...). Stable across rotations.","examples":["tok_01HTN8Z9MJB00000000000000"]},"name":{"type":"string","title":"Name","description":"User-chosen label.","examples":["ci-pipeline"]},"prefix":{"type":"string","title":"Prefix","description":"Human-readable prefix, e.g. tv_live_sk_ or tv_test_sk_.","examples":["tv_live_sk_"]},"last4":{"type":"string","title":"Last4","description":"Last 4 chars of the raw secret, for UI display.","examples":["abcd"]},"environment":{"type":"string","enum":["live","test"],"title":"Environment","description":"'live' or 'test'.","examples":["live"]},"scopes":{"items":{"type":"string","enum":["verifications:write","verifications:read","webhooks:manage","account:read"]},"type":"array","title":"Scopes","description":"Scopes granted to this token.","examples":[["verifications:write","account:read"]]},"created_at":{"type":"string","title":"Created At","description":"ISO 8601 creation timestamp.","examples":["2026-04-17T09:12:33Z"]},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At","description":"ISO 8601 timestamp of the last successful authenticated request; null if never used.","examples":[null]},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At","description":"ISO 8601 soft expiry; null means no expiry.","examples":[null]},"revoked_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revoked At","description":"ISO 8601 revoke timestamp; null for active tokens.","examples":[null]}},"type":"object","required":["id","name","prefix","last4","environment","scopes","created_at"],"title":"Token","description":"A masked token record — NEVER contains the raw secret."},"TokenCreate":{"properties":{"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name","description":"User-chosen label, e.g. 'ci-pipeline'. Shown in the token list.","examples":["ci-pipeline"]},"environment":{"type":"string","enum":["live","test"],"title":"Environment","description":"'live' charges credits and calls real models; 'test' is deterministic and 0-credit.","default":"live","examples":["live"]},"scopes":{"anyOf":[{"items":{"type":"string","enum":["verifications:write","verifications:read","webhooks:manage","account:read"]},"type":"array"},{"type":"null"}],"title":"Scopes","description":"Scopes granted to this token. Defaults to verifications:* + account:read.","examples":[["verifications:write","verifications:read","account:read"]]},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At","description":"Optional soft expiry (ISO 8601). Null means no expiry.","examples":[null]}},"additionalProperties":false,"type":"object","required":["name"],"title":"TokenCreate","description":"Request body for ``POST /v1/tokens``."},"TokenCreated":{"properties":{"id":{"type":"string","title":"Id","description":"Opaque token id (tok_...). Stable across rotations.","examples":["tok_01HTN8Z9MJB00000000000000"]},"name":{"type":"string","title":"Name","description":"User-chosen label.","examples":["ci-pipeline"]},"prefix":{"type":"string","title":"Prefix","description":"Human-readable prefix, e.g. tv_live_sk_ or tv_test_sk_.","examples":["tv_live_sk_"]},"last4":{"type":"string","title":"Last4","description":"Last 4 chars of the raw secret, for UI display.","examples":["abcd"]},"environment":{"type":"string","enum":["live","test"],"title":"Environment","description":"'live' or 'test'.","examples":["live"]},"scopes":{"items":{"type":"string","enum":["verifications:write","verifications:read","webhooks:manage","account:read"]},"type":"array","title":"Scopes","description":"Scopes granted to this token.","examples":[["verifications:write","account:read"]]},"created_at":{"type":"string","title":"Created At","description":"ISO 8601 creation timestamp.","examples":["2026-04-17T09:12:33Z"]},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At","description":"ISO 8601 timestamp of the last successful authenticated request; null if never used.","examples":[null]},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At","description":"ISO 8601 soft expiry; null means no expiry.","examples":[null]},"revoked_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revoked At","description":"ISO 8601 revoke timestamp; null for active tokens.","examples":[null]},"secret":{"type":"string","title":"Secret","description":"Full bearer token. Store it securely — it will not be shown again.","examples":["tv_live_sk_EXAMPLEEXAMPLEEXAMPLEEXAMPL"]}},"type":"object","required":["id","name","prefix","last4","environment","scopes","created_at","secret"],"title":"TokenCreated","description":"One-time response on create/rotate — exposes the raw secret ONCE.\n\nThe raw secret is not persisted server-side (we only keep its argon2id\nhash). Copy it at create time or lose it."},"UpdateCredentialRequest":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"is_pinned":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Is Pinned"},"is_public":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Is Public"},"event_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Date"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"},"custom_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Title"}},"type":"object","title":"UpdateCredentialRequest"},"UpdateFolderRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"applicant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Applicant Name"},"applicant_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Applicant Email"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"UpdateFolderRequest"},"UpdateLifeEventRequest":{"properties":{"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"event_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Date"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"},"is_public":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Is Public"},"display_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Display Order"}},"type":"object","title":"UpdateLifeEventRequest"},"UpdateProfileRequest":{"properties":{"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Url"},"instagram_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instagram Url"},"facebook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Facebook Url"},"twitter_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Twitter Url"},"is_public":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Is Public"},"show_scores":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Show Scores"},"show_annotations":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Show Annotations"},"date_of_birth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date Of Birth"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"}},"type":"object","title":"UpdateProfileRequest"},"UpdateVerificationRequest":{"properties":{"verification_id":{"type":"string","title":"Verification Id"},"updates":{"additionalProperties":true,"type":"object","title":"Updates"}},"type":"object","required":["verification_id","updates"],"title":"UpdateVerificationRequest"},"UsageBucket":{"properties":{"key":{"type":"string","title":"Key","description":"Bucket key. YYYY-MM-DD for day, path for endpoint, token_id for token.","examples":["2026-04-15"]},"requests":{"type":"integer","title":"Requests","description":"Number of /v1 requests counted in this bucket.","examples":[42]},"credits_charged":{"type":"integer","title":"Credits Charged","description":"Sum of credits deducted across this bucket. Test-mode calls count 0.","examples":[42]},"errors":{"type":"integer","title":"Errors","description":"Requests that returned status >= 400.","examples":[1]}},"type":"object","required":["key","requests","credits_charged","errors"],"title":"UsageBucket","description":"One row of the usage histogram."},"UsageResponse":{"properties":{"period_start":{"type":"string","title":"Period Start","examples":["2026-04-01T00:00:00Z"]},"period_end":{"type":"string","title":"Period End","examples":["2026-05-01T00:00:00Z"]},"group_by":{"type":"string","enum":["day","endpoint","token"],"title":"Group By","examples":["day"]},"data":{"items":{"$ref":"#/components/schemas/UsageBucket"},"type":"array","title":"Data"}},"type":"object","required":["period_start","period_end","group_by","data"],"title":"UsageResponse","description":"Envelope for ``GET /v1/account/usage``."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VariantInput":{"properties":{"variant_name":{"type":"string","title":"Variant Name"},"subject":{"type":"string","title":"Subject"},"body_markdown":{"type":"string","title":"Body Markdown"}},"type":"object","required":["variant_name","subject","body_markdown"],"title":"VariantInput"},"Verification":{"properties":{"id":{"type":"string","title":"Id","description":"Opaque verification id.","examples":["ver_01HTN8Z9MJB00000000000000"]},"status":{"type":"string","enum":["queued","processing","completed","failed","cancelled"],"title":"Status","description":"Lifecycle state of this verification.","examples":["queued"]},"verdict":{"anyOf":[{"type":"string","enum":["ACCEPT","REJECT","SUSPECT"]},{"type":"null"}],"title":"Verdict","description":"Final verdict; null while status is queued or processing.","examples":["ACCEPT"]},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence","description":"Model confidence in [0, 1]; null until completed.","examples":[0.94]},"doc_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Type","description":"Detected document type, e.g. 'diploma'.","examples":["diploma"]},"livemode":{"type":"boolean","title":"Livemode","description":"False for tv_test_sk keys, true for tv_live_sk keys.","examples":[true]},"created_at":{"type":"string","title":"Created At","description":"ISO 8601 timestamp when the verification was accepted.","examples":["2026-04-17T09:12:33Z"]},"poll_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Poll Url","description":"Canonical URL for polling this verification's status.","examples":["https://api.verify.turingcerts.com/v1/verifications/ver_01HTN..."]},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Opaque metadata echoed from the request.","examples":[{"application_id":"app_123"}]}},"type":"object","required":["id","status","livemode","created_at"],"title":"Verification","description":"Single verification record (response body)."},"VerifyMagicLinkRequest":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"VerifyMagicLinkRequest"},"WallNotice":{"properties":{"institution":{"type":"string","maxLength":200,"minLength":2,"title":"Institution"},"reason":{"type":"string","maxLength":2000,"minLength":10,"title":"Reason"},"claimant_name":{"type":"string","maxLength":200,"minLength":2,"title":"Claimant Name"},"claimant_email":{"type":"string","maxLength":320,"minLength":3,"title":"Claimant Email"},"claimant_role":{"type":"string","maxLength":200,"minLength":2,"title":"Claimant Role"},"legal_basis":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Legal Basis"}},"type":"object","required":["institution","reason","claimant_name","claimant_email","claimant_role"],"title":"WallNotice"},"WebhookDelivery":{"properties":{"id":{"type":"string","title":"Id","examples":["whd_01HTN8Z9MJB00000000000000"]},"endpoint_id":{"type":"string","title":"Endpoint Id"},"event_type":{"type":"string","enum":["verification.completed","verification.failed","verification.manual_review_required","batch.completed","token.rotated","webhook.ping"],"title":"Event Type"},"event_id":{"type":"string","title":"Event Id","examples":["evt_01HTN8Z9MJB00000000000000"]},"attempt":{"type":"integer","title":"Attempt","description":"1-based attempt counter.","examples":[1]},"status":{"type":"string","enum":["pending","delivered","failed","permanently_failed"],"title":"Status"},"response_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Status","description":"HTTP status from the receiver; null on timeout/network error.","examples":[200]},"response_body_preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Body Preview","description":"First 200 chars of the receiver's response for debugging.","examples":["ok"]},"created_at":{"type":"string","title":"Created At"},"delivered_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivered At"},"next_attempt_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Attempt At"}},"type":"object","required":["id","endpoint_id","event_type","event_id","attempt","status","created_at"],"title":"WebhookDelivery","description":"One delivery row, as surfaced to the developer portal."},"WebhookEndpoint":{"properties":{"id":{"type":"string","title":"Id","examples":["whk_01HTN8Z9MJB00000000000000"]},"url":{"type":"string","title":"Url"},"events":{"items":{"type":"string","enum":["verification.completed","verification.failed","verification.manual_review_required","batch.completed","token.rotated","webhook.ping"]},"type":"array","title":"Events"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"type":"string","enum":["active","disabled"],"title":"Status","examples":["active"]},"active":{"type":"boolean","title":"Active"},"secret_prefix":{"type":"string","title":"Secret Prefix","description":"Starts with 'whsec_'; safe to log.","examples":["whsec_"]},"secret_last4":{"type":"string","title":"Secret Last4","description":"Last 4 chars of the raw secret.","examples":["abcd"]},"created_at":{"type":"string","title":"Created At","examples":["2026-04-17T09:12:33Z"]},"last_success_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Success At"},"last_failure_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Failure At"},"consecutive_failures":{"type":"integer","title":"Consecutive Failures","default":0}},"type":"object","required":["id","url","events","status","active","secret_prefix","secret_last4","created_at"],"title":"WebhookEndpoint","description":"Registered webhook endpoint (response body — secret NEVER included)."},"WebhookEndpointCreate":{"properties":{"url":{"type":"string","title":"Url","description":"HTTPS URL where events will be POSTed. http://localhost is allowed in non-prod.","examples":["https://example.com/hooks/turing-verify"]},"events":{"items":{"type":"string","enum":["verification.completed","verification.failed","verification.manual_review_required","batch.completed","token.rotated","webhook.ping"]},"type":"array","title":"Events","description":"Event types this endpoint subscribes to. Must be a non-empty subset of the supported list.","examples":[["verification.completed","verification.failed"]]},"description":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Description","description":"Optional human-readable label shown in the developer console.","examples":["Prod ATS ingestion"]}},"additionalProperties":false,"type":"object","required":["url","events"],"title":"WebhookEndpointCreate","description":"Request body for ``POST /v1/webhooks``."},"WebhookEndpointCreated":{"properties":{"id":{"type":"string","title":"Id","examples":["whk_01HTN8Z9MJB00000000000000"]},"url":{"type":"string","title":"Url"},"events":{"items":{"type":"string","enum":["verification.completed","verification.failed","verification.manual_review_required","batch.completed","token.rotated","webhook.ping"]},"type":"array","title":"Events"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"type":"string","enum":["active","disabled"],"title":"Status","examples":["active"]},"active":{"type":"boolean","title":"Active"},"secret_prefix":{"type":"string","title":"Secret Prefix","description":"Starts with 'whsec_'; safe to log.","examples":["whsec_"]},"secret_last4":{"type":"string","title":"Secret Last4","description":"Last 4 chars of the raw secret.","examples":["abcd"]},"created_at":{"type":"string","title":"Created At","examples":["2026-04-17T09:12:33Z"]},"last_success_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Success At"},"last_failure_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Failure At"},"consecutive_failures":{"type":"integer","title":"Consecutive Failures","default":0},"secret":{"type":"string","title":"Secret","description":"Signing secret (starts with 'whsec_'). Shown once; store it securely.","examples":["whsec_1a2b3c4dEXAMPLEEXAMPLEEXAMPLE"]}},"type":"object","required":["id","url","events","status","active","secret_prefix","secret_last4","created_at","secret"],"title":"WebhookEndpointCreated","description":"One-time response on create/rotate — exposes the raw signing secret."},"WebhookEndpointDetail":{"properties":{"id":{"type":"string","title":"Id","examples":["whk_01HTN8Z9MJB00000000000000"]},"url":{"type":"string","title":"Url"},"events":{"items":{"type":"string","enum":["verification.completed","verification.failed","verification.manual_review_required","batch.completed","token.rotated","webhook.ping"]},"type":"array","title":"Events"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"type":"string","enum":["active","disabled"],"title":"Status","examples":["active"]},"active":{"type":"boolean","title":"Active"},"secret_prefix":{"type":"string","title":"Secret Prefix","description":"Starts with 'whsec_'; safe to log.","examples":["whsec_"]},"secret_last4":{"type":"string","title":"Secret Last4","description":"Last 4 chars of the raw secret.","examples":["abcd"]},"created_at":{"type":"string","title":"Created At","examples":["2026-04-17T09:12:33Z"]},"last_success_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Success At"},"last_failure_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Failure At"},"consecutive_failures":{"type":"integer","title":"Consecutive Failures","default":0},"recent_deliveries":{"items":{"$ref":"#/components/schemas/WebhookDelivery"},"type":"array","title":"Recent Deliveries"}},"type":"object","required":["id","url","events","status","active","secret_prefix","secret_last4","created_at"],"title":"WebhookEndpointDetail","description":"Endpoint + recent deliveries — returned by ``GET /v1/webhooks/{id}``."},"WebhookEndpointUpdate":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"events":{"anyOf":[{"items":{"type":"string","enum":["verification.completed","verification.failed","verification.manual_review_required","batch.completed","token.rotated","webhook.ping"]},"type":"array"},{"type":"null"}],"title":"Events"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"description":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Description"}},"additionalProperties":false,"type":"object","title":"WebhookEndpointUpdate","description":"Request body for ``PATCH /v1/webhooks/{id}``.\n\nEvery field is optional — we only apply what the caller sets."},"app__routers__coupons__CreateCouponRequest":{"properties":{"code":{"type":"string","title":"Code"},"bonus_quotas":{"type":"integer","title":"Bonus Quotas","default":50},"max_redemptions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Redemptions"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"plan_override":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Override"},"plan_duration_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Plan Duration Days"}},"type":"object","required":["code"],"title":"CreateCouponRequest"},"app__routers__dashboard__CreateCouponRequest":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"type":{"type":"string","title":"Type"},"quota_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quota Value"},"plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan"},"duration_months":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Months"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["type"],"title":"CreateCouponRequest","description":"Request body for creating a coupon code."},"ErrorResponse":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Stable snake_case code — safe to switch() on.","examples":["invalid_api_key","rate_limit_exceeded"]},"message":{"type":"string","description":"Human-readable description. Safe to surface to end users."},"request_id":{"type":"string","description":"Server-generated UUID. Echoed in the X-Request-ID header."},"docs_url":{"type":"string","format":"uri","description":"Link to the errors reference table."},"fields":{"type":"array","description":"Only on 422 — per-field validation failures.","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}}}}}}},"securitySchemes":{"ApiKeyAuth":{"type":"http","scheme":"bearer","bearerFormat":"tv_(live|test)_sk_*","description":"Bearer token of the form ``tv_live_sk_<secret>`` or ``tv_test_sk_<secret>``. Mint one from the developer console. Every /v1/* request other than /v1/health requires this header."}}},"tags":[{"name":"v1","description":"All /v1/* routes share this top-level tag.","externalDocs":{"description":"Full /v1 reference","url":"https://api.verify.turingcerts.com/v1/docs"}},{"name":"Verifications","description":"Submit and inspect document verifications.","externalDocs":{"description":"Verification lifecycle","url":"https://api.verify.turingcerts.com/v1/docs#verifications"}},{"name":"Webhooks","description":"Register HTTPS endpoints to receive events and inspect deliveries.\n\n**Signing.** Every POST carries a ``X-TuringVerify-Signature: t=<unix>,v1=<hex>`` header. ``v1`` is ``hmac-sha256(f\"{t}.{body}\", secret)``. Validate with constant-time compare; reject if ``|now - t| > 300``.\n\n**Retry ladder.** 0s, 30s, 2m, 10m, 30m, 2h, 6h, 12h, 24h (9 attempts over ~45h). Receivers must be idempotent — we dedupe on ``event.id``.\n\n**Launch events.** ``verification.completed``, ``verification.failed``, ``verification.manual_review_required``, ``batch.completed``, ``token.rotated``. Known-institution verdicts include the registrar ``verification_channel`` field.","externalDocs":{"description":"Webhook contract","url":"https://api.verify.turingcerts.com/v1/docs#webhooks"}},{"name":"Account","description":"Plan, quota, and usage for the authenticated user.","externalDocs":{"description":"Plans & quotas","url":"https://api.verify.turingcerts.com/v1/docs#account"}},{"name":"Tokens","description":"Manage API tokens from the developer console (session-auth only). API tokens cannot manage other tokens.","externalDocs":{"description":"Token lifecycle","url":"https://api.verify.turingcerts.com/v1/docs#tokens"}},{"name":"Health","description":"Liveness + per-token status."}],"servers":[{"url":"https://api.verify.turingcerts.com","description":"Production"},{"url":"http://localhost:8000","description":"Local dev"}]}