{"openapi":"3.1.0","info":{"title":"Propal Public API","version":"1.0.0","description":"Public REST API for Propal — proposals, leads, catalog, templates, themes, media, metrics, and organization. An MCP (Model Context Protocol) endpoint is also available at `POST /v1/mcp` for AI agents — it requires the `mcp:use` scope and exposes the same resources as tools, plus prefab section templates to compose proposals."},"servers":[{"url":"https://api.propal.io","description":"Production"}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"API key in format: pp_live_xxxxxxxxxxxxxxxxxxxxxxxx"}},"schemas":{},"parameters":{}},"paths":{"/v1/proposals":{"get":{"tags":["Proposals"],"summary":"List proposals","description":"Returns a paginated list of proposals for the authenticated organization.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","default":"25"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"after","in":"query"},{"schema":{"type":"string","enum":["pending","approved","denied","revision_request"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","format":"uuid"},"required":false,"name":"lead_id","in":"query"}],"responses":{"200":{"description":"Paginated proposal list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"proposal_id":{"type":"string","nullable":true,"format":"uuid"},"title":{"type":"string","nullable":true},"slug":{"type":"string","nullable":true},"deal_status":{"type":"string","nullable":true},"page_status":{"type":"string","nullable":true},"payment_status":{"type":"string","nullable":true},"language":{"type":"string","nullable":true},"created_at":{"type":"string","nullable":true},"sent_at":{"type":"string","nullable":true},"published_at":{"type":"string","nullable":true},"lead_id":{"type":"string","nullable":true},"lead_name":{"type":"string","nullable":true},"lead_email":{"type":"string","nullable":true},"is_deleted":{"type":"boolean","nullable":true},"is_archived":{"type":"boolean","nullable":true}},"required":["proposal_id","title","slug","deal_status","page_status","payment_status","language","created_at","sent_at","published_at","lead_id","lead_name","lead_email","is_deleted","is_archived"]}},"pagination":{"type":"object","properties":{"has_more":{"type":"boolean"},"next_cursor":{"type":"string","nullable":true},"total_count":{"type":"number"}},"required":["has_more","next_cursor","total_count"]}},"required":["data","pagination"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}},"post":{"tags":["Proposals"],"summary":"Create a proposal from a template","security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"template_id":{"type":"string","format":"uuid"},"title":{"type":"string","minLength":1},"slug":{"type":"string","minLength":1},"lead_id":{"type":"string","format":"uuid"},"language":{"type":"string","enum":["fr","en"]},"theme_id":{"type":"string","format":"uuid"},"password":{"type":"string"},"settings":{"type":"object","properties":{"allow_client_to_sign":{"type":"boolean"},"allow_client_to_deny":{"type":"boolean"},"allow_payment":{"type":"boolean"},"allow_client_to_download_pdf":{"type":"boolean"}}},"products":{"type":"array","items":{"type":"object","properties":{"bundle_id":{"type":"string","format":"uuid"},"payment":{"type":"object","additionalProperties":{"nullable":true}}}}},"proposal_product_id":{"type":"string","format":"uuid","description":"UUID of an existing proposal_products row (NOT a bundle id) to attach to the new proposal."}},"required":["title","slug"]}}}},"responses":{"201":{"description":"Created proposal","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"}},"required":["id"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/proposals/{id}":{"get":{"tags":["Proposals"],"summary":"Get a proposal","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Proposal UUID"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Proposal object","content":{"application/json":{"schema":{"type":"object","properties":{"proposal_id":{"type":"string","nullable":true,"format":"uuid"},"title":{"type":"string","nullable":true},"slug":{"type":"string","nullable":true},"deal_status":{"type":"string","nullable":true},"page_status":{"type":"string","nullable":true},"payment_status":{"type":"string","nullable":true},"language":{"type":"string","nullable":true},"created_at":{"type":"string","nullable":true},"sent_at":{"type":"string","nullable":true},"published_at":{"type":"string","nullable":true},"lead_id":{"type":"string","nullable":true},"lead_name":{"type":"string","nullable":true},"lead_email":{"type":"string","nullable":true},"is_deleted":{"type":"boolean","nullable":true},"is_archived":{"type":"boolean","nullable":true}},"required":["proposal_id","title","slug","deal_status","page_status","payment_status","language","created_at","sent_at","published_at","lead_id","lead_name","lead_email","is_deleted","is_archived"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}},"patch":{"tags":["Proposals"],"summary":"Update proposal metadata","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Proposal UUID"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"slug":{"type":"string"},"lead_id":{"type":"string","nullable":true,"format":"uuid"},"language":{"type":"string","enum":["fr","en"]},"theme_id":{"type":"string","nullable":true,"format":"uuid"},"password":{"type":"string","nullable":true},"proposal_product_id":{"type":"string","nullable":true,"format":"uuid","description":"UUID of an existing proposal_products row to attach. Pass null to detach."},"allow_payment":{"type":"boolean"},"allow_client_to_sign":{"type":"boolean"},"allow_client_to_download_pdf":{"type":"boolean"},"allow_client_to_deny":{"type":"boolean"}}}}}},"responses":{"204":{"description":"Proposal updated"},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}},"delete":{"tags":["Proposals"],"summary":"Delete a proposal","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Proposal UUID"},"required":true,"name":"id","in":"path"}],"responses":{"204":{"description":"Proposal deleted"},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/proposals/{id}/publish":{"post":{"tags":["Proposals"],"summary":"Publish a proposal","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Proposal UUID"},"required":true,"name":"id","in":"path"}],"responses":{"204":{"description":"Proposal published"},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/proposals/{id}/unpublish":{"post":{"tags":["Proposals"],"summary":"Unpublish a proposal","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Proposal UUID"},"required":true,"name":"id","in":"path"}],"responses":{"204":{"description":"Proposal unpublished"},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/proposals/{id}/duplicate":{"post":{"tags":["Proposals"],"summary":"Duplicate a proposal","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Proposal UUID"},"required":true,"name":"id","in":"path"}],"responses":{"201":{"description":"Duplicated proposal","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"}},"required":["id"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/proposals/{id}/signature":{"get":{"tags":["Proposals"],"summary":"Get signature status","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Proposal UUID"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Signature status","content":{"application/json":{"schema":{"type":"object","nullable":true,"additionalProperties":{"nullable":true}}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/proposals/{id}/product":{"put":{"tags":["Proposals"],"summary":"Attach a proposal product","description":"Attaches an existing proposal_products row (NOT a bundle) to the proposal. Idempotent — replaces any existing attachment.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Proposal UUID"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"proposal_product_id":{"type":"string","format":"uuid"}},"required":["proposal_product_id"]}}}},"responses":{"204":{"description":"Proposal product attached"},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}},"delete":{"tags":["Proposals"],"summary":"Detach the proposal product","description":"Removes the currently attached proposal product from the proposal. Idempotent.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Proposal UUID"},"required":true,"name":"id","in":"path"}],"responses":{"204":{"description":"Proposal product detached"},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/proposals/{id}/views":{"get":{"tags":["Proposals"],"summary":"List proposal views","description":"Returns a paginated list of viewing sessions (1 row = 1 session, updated via heartbeat) and aggregate metrics for a proposal. Personal data (IP, full geo object) is not exposed.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Proposal UUID"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","default":"25"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"after","in":"query"}],"responses":{"200":{"description":"Proposal views with summary","content":{"application/json":{"schema":{"type":"object","properties":{"summary":{"type":"object","properties":{"total_views":{"type":"number"},"first_viewed_at":{"type":"string","nullable":true},"last_viewed_at":{"type":"string","nullable":true},"average_scroll_depth":{"type":"number"},"total_active_duration_seconds":{"type":"number"}},"required":["total_views","first_viewed_at","last_viewed_at","average_scroll_depth","total_active_duration_seconds"]},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"started_at":{"type":"string","nullable":true},"ended_at":{"type":"string","nullable":true},"duration_seconds":{"type":"number","nullable":true},"scroll_depth":{"type":"number","nullable":true},"was_afk":{"type":"boolean"},"country":{"type":"string","nullable":true},"created_at":{"type":"string"}},"required":["id","started_at","ended_at","duration_seconds","scroll_depth","was_afk","country","created_at"]}},"pagination":{"type":"object","properties":{"has_more":{"type":"boolean"},"next_cursor":{"type":"string","nullable":true},"total_count":{"type":"number"}},"required":["has_more","next_cursor","total_count"]}},"required":["summary","data","pagination"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/proposals/{id}/revision-requests":{"get":{"tags":["Proposals"],"summary":"List revision requests","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Proposal UUID"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Revision requests","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":{"nullable":true}}}},"required":["data"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/leads":{"get":{"tags":["Leads"],"summary":"List leads","description":"Returns a paginated list of leads for the authenticated organization.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","default":"25"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"after","in":"query"},{"schema":{"type":"string","enum":["active","archived","draft"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string"},"required":false,"name":"search","in":"query"}],"responses":{"200":{"description":"Paginated lead list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"email":{"type":"string","nullable":true},"company":{"type":"string","nullable":true},"phone":{"type":"string","nullable":true},"website":{"type":"string","nullable":true},"address":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"state":{"type":"string","nullable":true},"zip":{"type":"string","nullable":true},"country":{"type":"string","nullable":true},"siret":{"type":"string","nullable":true},"tva":{"type":"string","nullable":true},"language":{"type":"string","nullable":true},"status":{"type":"string"},"created_at":{"type":"string"},"updated_at":{"type":"string","nullable":true}},"required":["id","name","email","company","phone","website","address","city","state","zip","country","siret","tva","language","status","created_at","updated_at"]}},"pagination":{"type":"object","properties":{"has_more":{"type":"boolean"},"next_cursor":{"type":"string","nullable":true},"total_count":{"type":"number"}},"required":["has_more","next_cursor","total_count"]}},"required":["data","pagination"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}},"post":{"tags":["Leads"],"summary":"Create a lead","security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"string","enum":[""]}]},"company":{"type":"string"},"phone":{"type":"string"},"address":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"zip":{"type":"string"},"country":{"type":"string"},"siret":{"type":"string"},"tva":{"type":"string"}},"required":["name"]}}}},"responses":{"201":{"description":"Created lead","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"email":{"type":"string","nullable":true},"company":{"type":"string","nullable":true},"phone":{"type":"string","nullable":true},"website":{"type":"string","nullable":true},"address":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"state":{"type":"string","nullable":true},"zip":{"type":"string","nullable":true},"country":{"type":"string","nullable":true},"siret":{"type":"string","nullable":true},"tva":{"type":"string","nullable":true},"language":{"type":"string","nullable":true},"status":{"type":"string"},"created_at":{"type":"string"},"updated_at":{"type":"string","nullable":true}},"required":["id","name","email","company","phone","website","address","city","state","zip","country","siret","tva","language","status","created_at","updated_at"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/leads/{id}":{"get":{"tags":["Leads"],"summary":"Get a lead","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Lead UUID"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Lead object","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"email":{"type":"string","nullable":true},"company":{"type":"string","nullable":true},"phone":{"type":"string","nullable":true},"website":{"type":"string","nullable":true},"address":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"state":{"type":"string","nullable":true},"zip":{"type":"string","nullable":true},"country":{"type":"string","nullable":true},"siret":{"type":"string","nullable":true},"tva":{"type":"string","nullable":true},"language":{"type":"string","nullable":true},"status":{"type":"string"},"created_at":{"type":"string"},"updated_at":{"type":"string","nullable":true}},"required":["id","name","email","company","phone","website","address","city","state","zip","country","siret","tva","language","status","created_at","updated_at"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}},"patch":{"tags":["Leads"],"summary":"Update a lead","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Lead UUID"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"string","enum":[""]}]},"company":{"type":"string"},"phone":{"type":"string"},"address":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"zip":{"type":"string"},"country":{"type":"string"},"siret":{"type":"string"},"tva":{"type":"string"}}}}}},"responses":{"200":{"description":"Updated lead","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"email":{"type":"string","nullable":true},"company":{"type":"string","nullable":true},"phone":{"type":"string","nullable":true},"website":{"type":"string","nullable":true},"address":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"state":{"type":"string","nullable":true},"zip":{"type":"string","nullable":true},"country":{"type":"string","nullable":true},"siret":{"type":"string","nullable":true},"tva":{"type":"string","nullable":true},"language":{"type":"string","nullable":true},"status":{"type":"string"},"created_at":{"type":"string"},"updated_at":{"type":"string","nullable":true}},"required":["id","name","email","company","phone","website","address","city","state","zip","country","siret","tva","language","status","created_at","updated_at"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}},"delete":{"tags":["Leads"],"summary":"Delete a lead","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Lead UUID"},"required":true,"name":"id","in":"path"}],"responses":{"204":{"description":"Lead deleted"},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/leads/{id}/proposals":{"get":{"tags":["Leads"],"summary":"List proposals for a lead","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Lead UUID"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Proposals list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":{"nullable":true}}}},"required":["data"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/themes":{"get":{"tags":["Themes"],"summary":"List themes","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","default":"25"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"after","in":"query"}],"responses":{"200":{"description":"Paginated theme list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"font":{"type":"string"},"body_theme":{"type":"string"},"color_accent":{"type":"string"},"colors":{"type":"object","additionalProperties":{"nullable":true}},"section_styles":{"nullable":true},"radius":{"type":"number"},"button_radius":{"type":"number"},"is_default":{"type":"boolean"},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","name","font","body_theme","color_accent","colors","radius","button_radius","is_default","created_at","updated_at"]}},"pagination":{"type":"object","properties":{"has_more":{"type":"boolean"},"next_cursor":{"type":"string","nullable":true},"total_count":{"type":"number"}},"required":["has_more","next_cursor","total_count"]}},"required":["data","pagination"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}},"post":{"tags":["Themes"],"summary":"Create a theme","security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"font":{"type":"string","enum":["inter","helvetica","satoshi","poppins","outfit","plus_jakarta"]},"title_font":{"type":"string","enum":["inter","helvetica","satoshi","poppins","outfit","plus_jakarta"]},"body_font":{"type":"string","enum":["inter","helvetica","satoshi","poppins","outfit","plus_jakarta"]},"body_theme":{"type":"string","enum":["white","gray","outlined","black"]},"color_accent":{"type":"string","enum":["blue","green","purple","red","orange","black"]},"colors":{"type":"object","properties":{"bg":{"type":"string","description":"Page background color (hex/css)."},"headingColor":{"type":"string","description":"Page heading color."},"textColor":{"type":"string","description":"Page body text color."},"cardBg":{"type":"string","description":"Card background on the page."},"cardHeadingColor":{"type":"string","description":"Card heading color on the page."},"cardTextColor":{"type":"string","description":"Card body text color on the page."},"cardBorderColor":{"type":"string","description":"Card border color on the page."},"accentRaw":{"type":"string","description":"Raw accent (legacy + accent v2 source)."},"accentColor":{"type":"string","description":"Legacy accent foreground color."},"accentBg":{"type":"string","description":"Legacy accent background color."},"accentContrast":{"type":"string","description":"Contrast color for accent surfaces."},"accentSolidBg":{"type":"string","description":"Accent v2 solid bg."},"accentSolidText":{"type":"string","description":"Accent v2 solid text."},"accentSubtleBg":{"type":"string","description":"Accent v2 subtle bg."},"accentSubtleText":{"type":"string","description":"Accent v2 subtle text."},"badgeBg":{"type":"string"},"badgeText":{"type":"string"},"badgeBorder":{"type":"string"}},"required":["bg","headingColor","textColor","cardBg","cardHeadingColor","cardTextColor","cardBorderColor","accentColor","accentBg","accentContrast"]},"section_styles":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":32,"pattern":"^[a-zA-Z][a-zA-Z0-9_-]*$","description":"Optional human-readable slot name (e.g. \"soft\", \"deep\"). Sections can then reference this slot via DSL `section_style: \"<id>\"` instead of the positional index. Survives reordering. Reserved: \"default\" and digit-only strings."},"bg":{"type":"string"},"headingColor":{"type":"string"},"textColor":{"type":"string"},"borderColor":{"type":"string"},"cardBg":{"type":"string"},"cardHeadingColor":{"type":"string"},"cardTextColor":{"type":"string"},"cardBorderColor":{"type":"string"},"badgeBg":{"type":"string"},"badgeText":{"type":"string"},"badgeBorder":{"type":"string"}},"required":["bg","headingColor","textColor","borderColor","cardBg","cardHeadingColor","cardTextColor","cardBorderColor"]}},"radius":{"type":"number","minimum":0,"maximum":2,"description":"Border radius in rem, between 0 and 2 in 0.1 steps."},"button_radius":{"type":"number","minimum":0,"maximum":2,"description":"Border radius in rem, between 0 and 2 in 0.1 steps."},"is_default":{"type":"boolean"}},"required":["name"]}}}},"responses":{"201":{"description":"Created theme","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"font":{"type":"string"},"body_theme":{"type":"string"},"color_accent":{"type":"string"},"colors":{"type":"object","additionalProperties":{"nullable":true}},"section_styles":{"nullable":true},"radius":{"type":"number"},"button_radius":{"type":"number"},"is_default":{"type":"boolean"},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","name","font","body_theme","color_accent","colors","radius","button_radius","is_default","created_at","updated_at"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/themes/{id}":{"get":{"tags":["Themes"],"summary":"Get a theme","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Theme UUID"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Theme object","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"font":{"type":"string"},"body_theme":{"type":"string"},"color_accent":{"type":"string"},"colors":{"type":"object","additionalProperties":{"nullable":true}},"section_styles":{"nullable":true},"radius":{"type":"number"},"button_radius":{"type":"number"},"is_default":{"type":"boolean"},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","name","font","body_theme","color_accent","colors","radius","button_radius","is_default","created_at","updated_at"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}},"patch":{"tags":["Themes"],"summary":"Update a theme","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Theme UUID"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"font":{"type":"string","enum":["inter","helvetica","satoshi","poppins","outfit","plus_jakarta"]},"title_font":{"type":"string","enum":["inter","helvetica","satoshi","poppins","outfit","plus_jakarta"]},"body_font":{"type":"string","enum":["inter","helvetica","satoshi","poppins","outfit","plus_jakarta"]},"body_theme":{"type":"string","enum":["white","gray","outlined","black"]},"color_accent":{"type":"string","enum":["blue","green","purple","red","orange","black"]},"colors":{"type":"object","properties":{"bg":{"type":"string","description":"Page background color (hex/css)."},"headingColor":{"type":"string","description":"Page heading color."},"textColor":{"type":"string","description":"Page body text color."},"cardBg":{"type":"string","description":"Card background on the page."},"cardHeadingColor":{"type":"string","description":"Card heading color on the page."},"cardTextColor":{"type":"string","description":"Card body text color on the page."},"cardBorderColor":{"type":"string","description":"Card border color on the page."},"accentRaw":{"type":"string","description":"Raw accent (legacy + accent v2 source)."},"accentColor":{"type":"string","description":"Legacy accent foreground color."},"accentBg":{"type":"string","description":"Legacy accent background color."},"accentContrast":{"type":"string","description":"Contrast color for accent surfaces."},"accentSolidBg":{"type":"string","description":"Accent v2 solid bg."},"accentSolidText":{"type":"string","description":"Accent v2 solid text."},"accentSubtleBg":{"type":"string","description":"Accent v2 subtle bg."},"accentSubtleText":{"type":"string","description":"Accent v2 subtle text."},"badgeBg":{"type":"string"},"badgeText":{"type":"string"},"badgeBorder":{"type":"string"}},"required":["bg","headingColor","textColor","cardBg","cardHeadingColor","cardTextColor","cardBorderColor","accentColor","accentBg","accentContrast"]},"section_styles":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":32,"pattern":"^[a-zA-Z][a-zA-Z0-9_-]*$","description":"Optional human-readable slot name (e.g. \"soft\", \"deep\"). Sections can then reference this slot via DSL `section_style: \"<id>\"` instead of the positional index. Survives reordering. Reserved: \"default\" and digit-only strings."},"bg":{"type":"string"},"headingColor":{"type":"string"},"textColor":{"type":"string"},"borderColor":{"type":"string"},"cardBg":{"type":"string"},"cardHeadingColor":{"type":"string"},"cardTextColor":{"type":"string"},"cardBorderColor":{"type":"string"},"badgeBg":{"type":"string"},"badgeText":{"type":"string"},"badgeBorder":{"type":"string"}},"required":["bg","headingColor","textColor","borderColor","cardBg","cardHeadingColor","cardTextColor","cardBorderColor"]}},"radius":{"type":"number","minimum":0,"maximum":2,"description":"Border radius in rem, between 0 and 2 in 0.1 steps."},"button_radius":{"type":"number","minimum":0,"maximum":2,"description":"Border radius in rem, between 0 and 2 in 0.1 steps."},"is_default":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Updated theme","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"font":{"type":"string"},"body_theme":{"type":"string"},"color_accent":{"type":"string"},"colors":{"type":"object","additionalProperties":{"nullable":true}},"section_styles":{"nullable":true},"radius":{"type":"number"},"button_radius":{"type":"number"},"is_default":{"type":"boolean"},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","name","font","body_theme","color_accent","colors","radius","button_radius","is_default","created_at","updated_at"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}},"delete":{"tags":["Themes"],"summary":"Delete a theme","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Theme UUID"},"required":true,"name":"id","in":"path"}],"responses":{"204":{"description":"Theme deleted"},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/catalog/items":{"get":{"tags":["Catalog"],"summary":"List catalog items","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","default":"25"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"after","in":"query"}],"responses":{"200":{"description":"Catalog items","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"vat_percentage":{"type":"number","nullable":true},"organization_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"}},"required":["id","name","description","vat_percentage","organization_id","created_at"]}},"pagination":{"type":"object","properties":{"has_more":{"type":"boolean"},"next_cursor":{"type":"string","nullable":true},"total_count":{"type":"number"}},"required":["has_more","next_cursor","total_count"]}},"required":["data","pagination"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}},"post":{"tags":["Catalog"],"summary":"Create a catalog item","security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"description":{"type":"string"},"vat_percentage":{"type":"number","minimum":0,"maximum":100}},"required":["name"]}}}},"responses":{"201":{"description":"Created item","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"vat_percentage":{"type":"number","nullable":true},"organization_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"}},"required":["id","name","description","vat_percentage","organization_id","created_at"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/catalog/items/{id}":{"get":{"tags":["Catalog"],"summary":"Get a catalog item","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Catalog item","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"vat_percentage":{"type":"number","nullable":true},"organization_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"}},"required":["id","name","description","vat_percentage","organization_id","created_at"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}},"patch":{"tags":["Catalog"],"summary":"Update a catalog item","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"description":{"type":"string"},"vat_percentage":{"type":"number","minimum":0,"maximum":100}}}}}},"responses":{"200":{"description":"Updated item","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"vat_percentage":{"type":"number","nullable":true},"organization_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"}},"required":["id","name","description","vat_percentage","organization_id","created_at"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}},"delete":{"tags":["Catalog"],"summary":"Delete a catalog item","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"responses":{"204":{"description":"Item deleted"},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/catalog/bundles":{"get":{"tags":["Catalog"],"summary":"List bundles","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","default":"25"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"after","in":"query"}],"responses":{"200":{"description":"Bundles","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"organization_id":{"type":"string","format":"uuid"},"tax":{"type":"number","nullable":true},"discount":{"type":"number","nullable":true},"created_at":{"type":"string"}},"required":["id","name","description","organization_id","tax","discount","created_at"]}},"pagination":{"type":"object","properties":{"has_more":{"type":"boolean"},"next_cursor":{"type":"string","nullable":true},"total_count":{"type":"number"}},"required":["has_more","next_cursor","total_count"]}},"required":["data","pagination"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/catalog/bundles/{id}":{"get":{"tags":["Catalog"],"summary":"Get a bundle with items","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Bundle with items","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"organization_id":{"type":"string","format":"uuid"},"tax":{"type":"number","nullable":true},"discount":{"type":"number","nullable":true},"created_at":{"type":"string"},"items":{"type":"array","items":{"type":"object","additionalProperties":{"nullable":true}}}},"required":["id","name","description","organization_id","tax","discount","created_at","items"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}},"delete":{"tags":["Catalog"],"summary":"Delete a bundle","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"responses":{"204":{"description":"Bundle deleted"},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/templates":{"get":{"tags":["Templates"],"summary":"List templates","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","default":"25"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"after","in":"query"},{"schema":{"type":"string"},"required":false,"name":"category","in":"query"}],"responses":{"200":{"description":"Template list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"image":{"type":"string","nullable":true},"color":{"type":"string","nullable":true},"organization_id":{"type":"string","nullable":true,"format":"uuid"},"created_at":{"type":"string"}},"required":["id","title","category","image","color","organization_id","created_at"]}},"pagination":{"type":"object","properties":{"has_more":{"type":"boolean"},"next_cursor":{"type":"string","nullable":true},"total_count":{"type":"number"}},"required":["has_more","next_cursor","total_count"]}},"required":["data","pagination"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}},"post":{"tags":["Templates"],"summary":"Create a template from a proposal","security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"proposal_id":{"type":"string","format":"uuid"},"name":{"type":"string"}},"required":["proposal_id"]}}}},"responses":{"201":{"description":"Created template","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"image":{"type":"string","nullable":true},"color":{"type":"string","nullable":true},"organization_id":{"type":"string","nullable":true,"format":"uuid"},"created_at":{"type":"string"}},"required":["id","title","category","image","color","organization_id","created_at"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/templates/{id}":{"get":{"tags":["Templates"],"summary":"Get a template","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Template UUID"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Template","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"image":{"type":"string","nullable":true},"color":{"type":"string","nullable":true},"organization_id":{"type":"string","nullable":true,"format":"uuid"},"created_at":{"type":"string"}},"required":["id","title","category","image","color","organization_id","created_at"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}},"delete":{"tags":["Templates"],"summary":"Delete a template","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Template UUID"},"required":true,"name":"id","in":"path"}],"responses":{"204":{"description":"Template deleted"},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/media/files":{"get":{"tags":["Media"],"summary":"List media files","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","default":"25"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"after","in":"query"},{"schema":{"type":"string","format":"uuid"},"required":false,"name":"folder_id","in":"query"}],"responses":{"200":{"description":"File list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"size":{"type":"number","nullable":true},"organization_id":{"type":"string","format":"uuid"},"folder_id":{"type":"string","nullable":true,"format":"uuid"},"created_at":{"type":"string"}},"required":["id","name","type","size","organization_id","folder_id","created_at"]}},"pagination":{"type":"object","properties":{"has_more":{"type":"boolean"},"next_cursor":{"type":"string","nullable":true},"total_count":{"type":"number"}},"required":["has_more","next_cursor","total_count"]}},"required":["data","pagination"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}},"post":{"tags":["Media"],"summary":"Create a file upload URL","description":"Returns a signed upload URL. Upload the file directly to the URL using a PUT request with the file binary as body. The file record is created in Propal immediately — the upload URL is valid for 1 hour.","security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"File name with extension","example":"hero-image.png"},"content_type":{"type":"string","minLength":1,"description":"MIME type","example":"image/png"},"folder_id":{"type":"string","format":"uuid","description":"Optional folder to upload into"}},"required":["name","content_type"]}}}},"responses":{"201":{"description":"File record created with signed upload URL","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"size":{"type":"number","nullable":true},"organization_id":{"type":"string","format":"uuid"},"folder_id":{"type":"string","nullable":true,"format":"uuid"},"created_at":{"type":"string"},"uploadUrl":{"type":"string","description":"Signed URL — PUT your file binary here within 1 hour"}},"required":["id","name","type","size","organization_id","folder_id","created_at","uploadUrl"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/media/files/{id}":{"get":{"tags":["Media"],"summary":"Get a file with signed URL","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"File with signed URL","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"size":{"type":"number","nullable":true},"organization_id":{"type":"string","format":"uuid"},"folder_id":{"type":"string","nullable":true,"format":"uuid"},"created_at":{"type":"string"},"signedUrl":{"type":"string"}},"required":["id","name","type","size","organization_id","folder_id","created_at","signedUrl"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}},"delete":{"tags":["Media"],"summary":"Delete a file","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"responses":{"204":{"description":"File deleted"},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/media/folders":{"get":{"tags":["Media"],"summary":"List media folders","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Folder list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"organization_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"}},"required":["id","title","organization_id","created_at"]}}},"required":["data"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}},"post":{"tags":["Media"],"summary":"Create a folder","security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1}},"required":["title"]}}}},"responses":{"201":{"description":"Created folder","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"organization_id":{"type":"string","format":"uuid"},"created_at":{"type":"string"}},"required":["id","title","organization_id","created_at"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/media/folders/{id}":{"delete":{"tags":["Media"],"summary":"Delete a folder","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"responses":{"204":{"description":"Folder deleted"},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/metrics/overview":{"get":{"tags":["Metrics"],"summary":"Overview metrics","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Overview","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"nullable":true}}}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/metrics/pipeline":{"get":{"tags":["Metrics"],"summary":"Pipeline metrics","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Pipeline","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"nullable":true}}}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/metrics/conversion":{"get":{"tags":["Metrics"],"summary":"Conversion metrics","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Conversion","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"nullable":true}}}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/metrics/sales":{"get":{"tags":["Metrics"],"summary":"Sales metrics","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","enum":["daily","weekly","hourly"],"default":"daily"},"required":false,"name":"period","in":"query"}],"responses":{"200":{"description":"Sales","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"nullable":true}}}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/metrics/team-performance":{"get":{"tags":["Metrics"],"summary":"Team performance","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Team performance","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"nullable":true}}}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/metrics/proposal-timing":{"get":{"tags":["Metrics"],"summary":"Proposal timing","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Timing","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"nullable":true}}}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/metrics/rejection-reasons":{"get":{"tags":["Metrics"],"summary":"Rejection reasons","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Rejections","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"nullable":true}}}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/organization":{"get":{"tags":["Organization"],"summary":"Get organization details","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Organization","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"slug":{"type":"string"},"image_url":{"type":"string","nullable":true},"created_at":{"type":"string"}},"required":["id","name","slug","image_url","created_at"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}},"/v1/organization/members":{"get":{"tags":["Organization"],"summary":"List organization members","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Members","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"user_id":{"type":"string","format":"uuid"},"role":{"type":"string"},"created_at":{"type":"string"}},"required":["user_id","role","created_at"]}}},"required":["data"]}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — API key missing required scope"},"404":{"description":"Resource not found"},"429":{"description":"Rate limit exceeded"}}}}}}