{"openapi":"3.1.0","info":{"title":"FastPPM API","description":"Open integration access to FastPPM projects, milestones, risks, and documents.\n\n**Access model:** reads are public. Selected writes are implemented but disabled unless the deployment configures `FASTSME_API_TOKEN`; write clients then send it as a bearer token.","contact":{"name":"FastSME","url":"https://fastsme.com/"},"license":{"name":"MIT"},"version":"1.0.0"},"servers":[{"url":"https://ppm.fastsme.com/api","description":"Production"}],"paths":{"/":{"get":{"tags":["System"],"summary":"Api Index","operationId":"api_index__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Api Index  Get"}}}}}}},"/v1/health":{"get":{"tags":["System"],"summary":"Api Health","operationId":"api_health_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/v1/projects":{"get":{"tags":["Projects"],"summary":"List projects","description":"Portfolio initiatives, programmes, and workstreams.","operationId":"list_projects","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Case-insensitive text search","title":"Q"},"description":"Case-insensitive text search"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectsCollection"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Projects"],"summary":"Create Project","description":"Create or update a project through FastPPM's storage contract.","operationId":"create_project_v1_projects_post","security":[{"FastSME API token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{item_id}":{"get":{"tags":["Projects"],"summary":"Get one projects record","operationId":"get_projects","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectsResource"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not Found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/milestones":{"get":{"tags":["Milestones"],"summary":"List milestones","description":"Initiative milestones, progress, and dependencies.","operationId":"list_milestones","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Case-insensitive text search","title":"Q"},"description":"Case-insensitive text search"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MilestonesCollection"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/milestones/{item_id}":{"get":{"tags":["Milestones"],"summary":"Get one milestones record","operationId":"get_milestones","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MilestonesResource"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not Found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/risks":{"get":{"tags":["Risks"],"summary":"List risks","description":"Portfolio risks, mitigations, probability, and impact.","operationId":"list_risks","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Case-insensitive text search","title":"Q"},"description":"Case-insensitive text search"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RisksCollection"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/risks/{item_id}":{"get":{"tags":["Risks"],"summary":"Get one risks record","operationId":"get_risks","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RisksResource"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not Found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/documents":{"get":{"tags":["Documents"],"summary":"List documents","description":"Portfolio source documents and extraction state.","operationId":"list_documents","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Case-insensitive text search","title":"Q"},"description":"Case-insensitive text search"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentsCollection"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/documents/{item_id}":{"get":{"tags":["Documents"],"summary":"Get one documents record","operationId":"get_documents","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentsResource"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Not Found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"DocumentsCollection":{"properties":{"data":{"items":{"$ref":"#/components/schemas/DocumentsResource"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","meta"],"title":"DocumentsCollection"},"DocumentsResource":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"},"file_name":{"type":"string","title":"File Name"},"file_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Type"},"file_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Path"},"byte_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Byte Size"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"raw_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Text"},"structured_json":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Structured Json"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"n_initiatives":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"N Initiatives"},"n_milestones":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"N Milestones"},"n_risks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"N Risks"},"n_value_drivers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"N Value Drivers"},"n_inconsistencies":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"N Inconsistencies"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"uploaded_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uploaded By"},"uploaded_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uploaded At"},"merged_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merged At"}},"type":"object","required":["file_name"],"title":"DocumentsResource"},"ErrorDetail":{"properties":{"code":{"type":"string","title":"Code"},"message":{"type":"string","title":"Message"},"details":{"additionalProperties":true,"type":"object","title":"Details"}},"type":"object","required":["code","message"],"title":"ErrorDetail","description":"Machine-readable API error."},"ErrorEnvelope":{"properties":{"error":{"$ref":"#/components/schemas/ErrorDetail"}},"type":"object","required":["error"],"title":"ErrorEnvelope","description":"Consistent error response envelope."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"type":"string","title":"Status"},"product":{"type":"string","title":"Product"},"version":{"type":"string","title":"Version"},"writes_enabled":{"type":"boolean","title":"Writes Enabled"}},"type":"object","required":["status","product","version","writes_enabled"],"title":"HealthResponse","description":"API health response."},"MilestonesCollection":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MilestonesResource"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","meta"],"title":"MilestonesCollection"},"MilestonesResource":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"},"initiative_id":{"type":"integer","title":"Initiative Id"},"title":{"type":"string","title":"Title"},"planned_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Planned Date"},"actual_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actual Date"},"baseline_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Baseline Date"},"progress":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Progress"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"owner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner"},"dependencies":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dependencies"}},"type":"object","required":["initiative_id","title"],"title":"MilestonesResource"},"PaginationMeta":{"properties":{"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["total","limit","offset"],"title":"PaginationMeta","description":"Offset pagination metadata."},"ProjectCreate":{"properties":{"ref":{"type":"string","maxLength":80,"minLength":1,"title":"Ref"},"name":{"type":"string","maxLength":250,"minLength":1,"title":"Name"},"description":{"type":"string","title":"Description","default":""},"type":{"type":"string","title":"Type","default":"workstream"},"owner":{"type":"string","title":"Owner","default":""},"status":{"type":"string","title":"Status","default":"not_started"},"value_target":{"type":"number","title":"Value Target","default":0}},"type":"object","required":["ref","name"],"title":"ProjectCreate"},"ProjectsCollection":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ProjectsResource"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","meta"],"title":"ProjectsCollection"},"ProjectsResource":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"},"ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ref"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"workstream":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workstream"},"owner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"rag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rag"},"progress":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Progress"},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"},"baseline_start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Baseline Start"},"baseline_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Baseline End"},"value_target":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value Target"},"value_realized":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value Realized"},"value_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value Category"},"parent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Id"},"source_document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Document Id"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["name"],"title":"ProjectsResource"},"RisksCollection":{"properties":{"data":{"items":{"$ref":"#/components/schemas/RisksResource"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","meta"],"title":"RisksCollection"},"RisksResource":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"},"initiative_id":{"type":"integer","title":"Initiative Id"},"description":{"type":"string","title":"Description"},"probability":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Probability"},"impact":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Impact"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"mitigation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mitigation"},"owner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner"}},"type":"object","required":["initiative_id","description"],"title":"RisksResource"},"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"}},"securitySchemes":{"FastSME API token":{"type":"http","description":"Selected writes require `Authorization: Bearer <token>`. Reads are public. Set FASTSME_API_TOKEN to enable writes.","scheme":"bearer"}}}}