{"openapi":"3.1.0","info":{"title":"Promeo API","version":"2026-09-07","description":"Read, update, and delete owned Projects and posts with scoped API keys."},"servers":[{"url":"https://promeo.ai/api/v1"}],"components":{"securitySchemes":{"bearerToken":{"type":"http","scheme":"bearer","description":"Dashboard API key or verified Firebase ID token."}}},"paths":{"/projects":{"get":{"operationId":"listProjects","summary":"List Projects","security":[{"bearerToken":[]}],"description":"Required API key permission: projects:read.","responses":{"200":{"description":"Successful JSON result"},"400":{"description":"Invalid input"},"401":{"description":"Invalid or expired credential"},"403":{"description":"Missing permission"},"404":{"description":"Owned resource not found"},"409":{"description":"State, consent, or concurrent-write conflict"},"429":{"description":"Quota exceeded","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}}}}}},"/projects/{projectId}":{"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9]{10,40}$","description":"The Project ID returned by list_projects."}}],"patch":{"operationId":"updateProject","summary":"Update Project profile","security":[{"bearerToken":[]}],"description":"Required API key permission: projects:update.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"description":{"type":"string","minLength":1,"maxLength":20000},"audience":{"type":"string","minLength":1,"maxLength":20000},"features":{"type":"string","minLength":1,"maxLength":20000},"voice":{"type":"string","minLength":1,"maxLength":20000}},"required":[],"additionalProperties":false,"minProperties":1}}}},"responses":{"200":{"description":"Successful JSON result"},"400":{"description":"Invalid input"},"401":{"description":"Invalid or expired credential"},"403":{"description":"Missing permission"},"404":{"description":"Owned resource not found"},"409":{"description":"State, consent, or concurrent-write conflict"},"429":{"description":"Quota exceeded","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}}}}},"delete":{"operationId":"deleteProject","summary":"Delete Project and stored content","security":[{"bearerToken":[]}],"description":"Required API key permission: projects:delete.","responses":{"200":{"description":"Successful JSON result"},"400":{"description":"Invalid input"},"401":{"description":"Invalid or expired credential"},"403":{"description":"Missing permission"},"404":{"description":"Owned resource not found"},"409":{"description":"State, consent, or concurrent-write conflict"},"429":{"description":"Quota exceeded","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}}}}}},"/projects/{projectId}/posts":{"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9]{10,40}$","description":"The Project ID returned by list_projects."}}],"get":{"operationId":"listProjectPosts","summary":"List recent Project posts","security":[{"bearerToken":[]}],"description":"Required API key permission: posts:read.","responses":{"200":{"description":"Successful JSON result"},"400":{"description":"Invalid input"},"401":{"description":"Invalid or expired credential"},"403":{"description":"Missing permission"},"404":{"description":"Owned resource not found"},"409":{"description":"State, consent, or concurrent-write conflict"},"429":{"description":"Quota exceeded","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}}}}}},"/projects/{projectId}/posts/{postId}":{"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9]{10,40}$","description":"The Project ID returned by list_projects."}},{"name":"postId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-zA-Z0-9_-]+$"}}],"patch":{"operationId":"updatePost","summary":"Update a draft or scheduled post","security":[{"bearerToken":[]}],"description":"Required API key permission: posts:update.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","maxLength":90},"description":{"type":"string","maxLength":4000},"tags":{"type":"array","maxItems":10,"items":{"type":"string","description":"At most 32 user-perceived characters."}},"scheduledAt":{"type":"string","description":"ISO 8601 time. Empty clears a draft's proposed time; it never schedules a draft."},"timezone":{"type":"string","maxLength":100},"approved":{"const":true,"description":"Explicit approval of this exact edit."},"musicUsageConfirmed":{"type":"boolean","description":"Must be true for posts with a TikTok destination."},"brandedContentPolicyConfirmed":{"type":"boolean","description":"Explicit TikTok branded-content confirmation when applicable."}},"required":["approved"],"additionalProperties":false,"anyOf":[{"required":["title"]},{"required":["description"]},{"required":["tags"]},{"required":["scheduledAt"]},{"required":["timezone"]}]}}}},"responses":{"200":{"description":"Successful JSON result"},"400":{"description":"Invalid input"},"401":{"description":"Invalid or expired credential"},"403":{"description":"Missing permission"},"404":{"description":"Owned resource not found"},"409":{"description":"State, consent, or concurrent-write conflict"},"429":{"description":"Quota exceeded","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}}}}},"delete":{"operationId":"deletePost","summary":"Delete the Promeo post record and media","security":[{"bearerToken":[]}],"description":"Required API key permission: posts:delete.","responses":{"200":{"description":"Successful JSON result"},"400":{"description":"Invalid input"},"401":{"description":"Invalid or expired credential"},"403":{"description":"Missing permission"},"404":{"description":"Owned resource not found"},"409":{"description":"State, consent, or concurrent-write conflict"},"429":{"description":"Quota exceeded","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying"}}}}}}}}