{"openapi":"3.1.0","jsonSchemaDialect":"https://json-schema.org/draft/2020-12/schema","info":{"title":"Propel API","version":"0.1.4","summary":"Read-only access to projects, budgets and the records ledger.","contact":{"name":"Propel","url":"https://www.propel-industrial.com"},"termsOfService":"https://www.propel-industrial.com/privacy-policy","x-logo":{"url":"/icon.png","altText":"Propel"},"description":"Read-only (v0). Guide: /docs/guide (also /docs/guide.md and /llms.txt as plain text). Every field is labelled with the field group (`x-field-group`) the caller needs; fields you may not see are omitted. Unknown or empty query parameters are rejected with 400. Data endpoints are read-only (405 for other methods); POST /v0/feedback is the one write."},"servers":[{"url":"https://sandbox.api.propel-industrial.com"}],"security":[{"bearer":[]}],"tags":[{"name":"Projects"},{"name":"Budgets"},{"name":"Records","description":"The ledger. v0 returns cost / actual records from invoices, ordered by id."},{"name":"Contractors"},{"name":"Contracts","description":"Supplier contracts, amendments and what they commit (0.1.3)."},{"name":"Feedback","description":"Send feedback about the API."}],"paths":{"/v0/projects":{"get":{"tags":["Projects"],"operationId":"listProjects","summary":"Projects you can access (always one page)","parameters":[],"responses":{"200":{"description":"Projects","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectListResponse"}}}},"400":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v0/projects/{projectId}":{"get":{"tags":["Projects"],"operationId":"getProject","summary":"One project","parameters":[{"name":"projectId","in":"path","required":true,"description":"Project id","schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectResponse"}}}},"400":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v0/projects/{projectId}/budget":{"get":{"tags":["Budgets"],"operationId":"getProjectBudget","summary":"Budget structure with approved, invoiced and paid amounts per node (rolled up)","parameters":[{"name":"projectId","in":"path","required":true,"description":"Project id","schema":{"type":"string","minLength":1}},{"name":"level","in":"query","required":false,"description":"Deepest level to return (budget = top lines only)","schema":{"type":"string","enum":["budget","subBudget","costItem"]}},{"name":"asOf","in":"query","required":false,"description":"The approved month-end forecast of that month, exactly as approved (404 if none)","schema":{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])$"}}],"responses":{"200":{"description":"Budget","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectBudgetResponse"}}}},"400":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v0/records":{"get":{"tags":["Records"],"operationId":"listRecords","summary":"Records across the projects you can access","parameters":[{"name":"limit","in":"query","required":false,"description":"Page size (1–200). Use 200 when walking a full list.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Opaque cursor from page.nextCursor","schema":{"type":"string","minLength":1}},{"name":"projectId","in":"query","required":false,"description":"Only records of this project (404 if you can't access it)","schema":{"type":"string","minLength":1}},{"name":"status","in":"query","required":false,"description":"One or more of setup, approvalPending, paymentPending, paid, rejected (comma-separated)","schema":{"type":"string","examples":["paid","paymentPending,paid"]}},{"name":"invoiceNumber","in":"query","required":false,"description":"Exact invoice number","schema":{"type":"string","minLength":1}},{"name":"contractorId","in":"query","required":false,"description":"Only records of this counterparty","schema":{"type":"string","minLength":1}},{"name":"recognitionDateFrom","in":"query","required":false,"description":"Invoice date on or after","schema":{"type":"string","format":"date"}},{"name":"recognitionDateTo","in":"query","required":false,"description":"Invoice date on or before","schema":{"type":"string","format":"date"}},{"name":"budgetNodeId","in":"query","required":false,"description":"Records on exactly this node (needs the budget field group)","schema":{"type":"string","minLength":1}},{"name":"includeDescendants","in":"query","required":false,"description":"With budgetNodeId: also records on all nodes below it","schema":{"type":"boolean"}},{"name":"channel","in":"query","required":false,"description":"Only records that came in this way, e.g. email","schema":{"type":"string","enum":["email","app","chat","api","manual"]}}],"responses":{"200":{"description":"Records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordListResponse"}}}},"400":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v0/records/{recordId}":{"get":{"tags":["Records"],"operationId":"getRecord","summary":"One record","parameters":[{"name":"recordId","in":"path","required":true,"description":"Record id","schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordResponse"}}}},"400":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v0/feedback":{"post":{"tags":["Feedback"],"operationId":"sendFeedback","summary":"Tell us what's wrong, missing or unclear — it reaches the Propel team immediately","description":"Open to every key and user. At most 20 per key or user per day. Agents: use this when a filter or field you need is missing, a response surprised you, or the docs were unclear.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackInput"}}}},"responses":{"201":{"description":"Received","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackResponse"}}}},"400":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v0/contracts":{"get":{"tags":["Contracts"],"operationId":"listContracts","summary":"Contracts of the projects you can access, with committed, invoiced and open amounts","parameters":[{"name":"limit","in":"query","required":false,"description":"Page size (1–200). Use 200 when walking a full list.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Opaque cursor from page.nextCursor","schema":{"type":"string","minLength":1}},{"name":"projectId","in":"query","required":false,"description":"Only contracts of this project (404 if you can't access it)","schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Contracts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContractListResponse"}}}},"400":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v0/contracts/{contractId}":{"get":{"tags":["Contracts"],"operationId":"getContract","summary":"One contract","parameters":[{"name":"contractId","in":"path","required":true,"description":"Contract id","schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Contract","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContractResponse"}}}},"400":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v0/projects/{projectId}/facilities":{"get":{"tags":["Projects"],"operationId":"listFacilities","summary":"Loan facilities of a project (financial field group)","parameters":[{"name":"projectId","in":"path","required":true,"description":"Project id","schema":{"type":"string","minLength":1}},{"name":"limit","in":"query","required":false,"description":"Page size (1–200). Use 200 when walking a full list.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Opaque cursor from page.nextCursor","schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Facilities","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacilityListResponse"}}}},"400":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v0/facilities/{facilityId}/schedule":{"get":{"tags":["Projects"],"operationId":"getFacilitySchedule","summary":"Interest periods: rate, interest, commitment fee, balance","parameters":[{"name":"facilityId","in":"path","required":true,"description":"Facility id","schema":{"type":"string","minLength":1}},{"name":"to","in":"query","required":false,"description":"Last date (default: maturity)","schema":{"type":"string","format":"date"}},{"name":"includePlanned","in":"query","required":false,"description":"Include planned drawdowns","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Schedule","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacilityScheduleResponse"}}}},"400":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v0/facilities/{facilityId}/drawdowns":{"get":{"tags":["Projects"],"operationId":"listFacilityDrawdowns","summary":"Drawdowns and repayments (planned, requested, funded)","parameters":[{"name":"facilityId","in":"path","required":true,"description":"Facility id","schema":{"type":"string","minLength":1}},{"name":"limit","in":"query","required":false,"description":"Page size (1–200). Use 200 when walking a full list.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Opaque cursor from page.nextCursor","schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Drawdowns","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacilityDrawdownListResponse"}}}},"400":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v0/projects/{projectId}/units":{"get":{"tags":["Projects"],"operationId":"listUnits","summary":"The project's lettable units (guests: units and sizes only)","parameters":[{"name":"projectId","in":"path","required":true,"description":"Project id","schema":{"type":"string","minLength":1}},{"name":"limit","in":"query","required":false,"description":"Page size (1–200). Use 200 when walking a full list.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Opaque cursor from page.nextCursor","schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Units","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnitListResponse"}}}},"400":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v0/projects/{projectId}/rent-roll":{"get":{"tags":["Projects"],"operationId":"getRentRoll","summary":"Rent roll at a month: passing rent, vacancy, WAULT","parameters":[{"name":"projectId","in":"path","required":true,"description":"Project id","schema":{"type":"string","minLength":1}},{"name":"asOf","in":"query","required":false,"description":"Month YYYY-MM (default: current month)","schema":{"type":"string"}}],"responses":{"200":{"description":"Rent roll","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RentRollResponse"}}}},"400":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v0/projects/{projectId}/cashflow":{"get":{"tags":["Budgets"],"operationId":"getCashflow","summary":"Cash out per budget line and month: actuals, then the phased rest","parameters":[{"name":"projectId","in":"path","required":true,"description":"Project id","schema":{"type":"string","minLength":1}},{"name":"from","in":"query","required":false,"description":"First month YYYY-MM","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"Last month YYYY-MM","schema":{"type":"string"}},{"name":"level","in":"query","required":false,"description":"Deepest level","schema":{"type":"string","enum":["budget","subBudget","costItem"]}}],"responses":{"200":{"description":"Cash flow","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CashflowResponse"}}}},"400":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v0/projects/{projectId}/forecast/snapshots":{"get":{"tags":["Budgets"],"operationId":"listForecastSnapshots","summary":"Month-end forecast snapshots of a project (newest first)","parameters":[{"name":"projectId","in":"path","required":true,"description":"Project id","schema":{"type":"string","minLength":1}},{"name":"limit","in":"query","required":false,"description":"Page size (1–200). Use 200 when walking a full list.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Opaque cursor from page.nextCursor","schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Snapshots","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForecastSnapshotListResponse"}}}},"400":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v0/projects/{projectId}/forecast/snapshots/{month}":{"get":{"tags":["Budgets"],"operationId":"getForecastSnapshot","summary":"The approved snapshot of a month, with the changes since the previous one","parameters":[{"name":"projectId","in":"path","required":true,"description":"Project id","schema":{"type":"string","minLength":1}},{"name":"month","in":"path","required":true,"description":"YYYY-MM","schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Snapshot","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForecastSnapshotResponse"}}}},"400":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v0/contractors":{"get":{"tags":["Contractors"],"operationId":"listContractors","summary":"Contractors linked to projects you can access (no bank data)","parameters":[{"name":"limit","in":"query","required":false,"description":"Page size (1–200). Use 200 when walking a full list.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Opaque cursor from page.nextCursor","schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Contractors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContractorListResponse"}}}},"400":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error (problem+json)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Amount":{"$id":"#/components/schemas/Amount","type":"object","properties":{"value":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The amount as an integer in the currency's smallest unit (cents for EUR): 123456 = 1,234.56 EUR. Never a decimal."},"currency":{"type":"string","minLength":3,"maxLength":3,"description":"ISO-4217 currency code, e.g. EUR"}},"required":["value","currency"]},"Project":{"$id":"#/components/schemas/Project","type":"object","properties":{"id":{"type":"string","x-field-group":"core"},"name":{"type":"string","x-field-group":"core"},"workspaceId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Workspace the project belongs to, e.g. projects-de","x-field-group":"core"},"budgetStructureId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Budget structure (template) assigned to the project","x-field-group":"budget"},"inboundEmail":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Send invoices (PDF attachments) to this address; each PDF becomes a record in status setup. See the guide, 'Sending invoices'.","x-field-group":"documents"}},"required":["id","name","workspaceId"]},"AccountingCode":{"$id":"#/components/schemas/AccountingCode","type":"object","properties":{"system":{"type":"string","enum":["yardi","datev","sap","bmd","other"],"x-extensible-enum":true},"code":{"type":"string","description":"The code in that accounting system — a string (leading zeros and dashes are kept)"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"taxKey":{"description":"Tax key where the system uses one (e.g. DATEV BU-Schlüssel)","anyOf":[{"type":"string"},{"type":"null"}]},"inherited":{"description":"True when the code comes from a parent budget line","type":"boolean"}},"required":["system","code"]},"BudgetNode":{"$id":"#/components/schemas/BudgetNode","type":"object","properties":{"nodeId":{"type":"string","description":"Stable, never-recycled id — store this, not the name or code. Shared by every project on the same structure.","x-field-group":"budget"},"level":{"type":"string","enum":["budget","subBudget","costItem"],"x-field-group":"budget","x-extensible-enum":true},"code":{"type":"string","description":"Propel budget code, flexible per company. Default pattern \"N\" / \"BB-NNNN\" / \"BB-NNNN-II\". Not the Yardi code.","x-field-group":"budget"},"name":{"type":"string","x-field-group":"budget"},"description":{"type":"string","x-field-group":"budget"},"parentId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"nodeId of the parent; always present in the same response (null for budgets)","x-field-group":"budget"},"projectSpecific":{"type":"boolean","description":"True when the node exists only in this project","x-field-group":"budget"},"budget":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"description":"Approved budget (initial + addenda ± transfers). Includes all descendants — total the top level only.","x-field-group":"amounts"},"invoiced":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"description":"Net amount of all non-rejected invoices (setup included). Includes all descendants.","x-field-group":"amounts"},"paid":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"description":"Net amount of paid invoices. Includes all descendants.","x-field-group":"amounts"},"accountingCodes":{"type":"array","items":{"$ref":"#/components/schemas/AccountingCode"},"description":"Effective accounting codes of this line, one per system (0.1.2). Needs the accounting field group.","x-field-group":"accounting"},"invoicedByStatus":{"anyOf":[{"type":"object","properties":{"setup":{"$ref":"#/components/schemas/Amount"},"approvalPending":{"$ref":"#/components/schemas/Amount"},"paymentPending":{"$ref":"#/components/schemas/Amount"},"paid":{"$ref":"#/components/schemas/Amount"}},"required":["setup","approvalPending","paymentPending","paid"]},{"type":"null"}],"description":"`invoiced` split by record status (net). setup + approvalPending + paymentPending + paid = invoiced. The payment queue is paymentPending. (0.1.1)","x-field-group":"amounts"},"invoicedGross":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"description":"Gross amount of all non-rejected invoices. Includes all descendants. (0.1.1)","x-field-group":"amounts"},"paidGross":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"description":"Gross amount of paid invoices — what actually left the bank. Includes all descendants. (0.1.1)","x-field-group":"amounts"},"committed":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"description":"Net amount contracted on this line: contract allocations + approved amendments booked here (signed and completed contracts). Includes all descendants. (0.1.3)","x-field-group":"amounts"},"openCommitment":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"description":"Committed but not yet invoiced, never negative. Includes all descendants. (0.1.3)","x-field-group":"amounts"},"overInvoiced":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"description":"Invoiced beyond what the contracts commit — reported beside openCommitment, never netted against another contract. (0.1.3)","x-field-group":"amounts"},"pendingChanges":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"description":"Amendment increases awaiting approval plus expected claims entered on the line (× their probability); not part of committed. (0.1.3)","x-field-group":"amounts"},"uncommitted":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"description":"Still to be contracted: the entered value, or by default the rest of the budget, max(0, budget − committed). Includes all descendants. (0.1.3)","x-field-group":"amounts"},"uncommittedDefaulted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"True when nobody entered an uncommitted value on this line or below it (the default applies). (0.1.3)","x-field-group":"amounts"},"eac":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"description":"Estimate at completion = committed + pendingChanges + uncommitted. An untouched line equals its budget. Includes all descendants. (0.1.3)","x-field-group":"amounts"},"variance":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"description":"budget − eac; negative = overrun. Includes all descendants. (0.1.3)","x-field-group":"amounts"},"costToComplete":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"description":"eac − invoiced; negative = more invoiced than the estimate. Includes all descendants. (0.1.3)","x-field-group":"amounts"}},"required":[]},"ProjectBudget":{"$id":"#/components/schemas/ProjectBudget","type":"object","properties":{"projectId":{"type":"string","x-field-group":"core"},"currency":{"type":"string","minLength":3,"maxLength":3,"x-field-group":"core"},"structureId":{"anyOf":[{"type":"string"},{"type":"null"}],"x-field-group":"budget"},"nodes":{"type":"array","items":{"$ref":"#/components/schemas/BudgetNode"},"x-field-group":"budget"},"unallocated":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"description":"Net amount (project currency) of non-rejected invoices without a budget node. Needs both the amounts and budget field groups.","x-field-group":"amounts"},"unallocatedBudget":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"description":"Approved budget (project currency) on budget rows without a valid budget node. Needs both the amounts and budget field groups.","x-field-group":"amounts"},"excluded":{"type":"array","items":{"type":"object","properties":{"currency":{"type":"string","minLength":3,"maxLength":3},"value":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["currency","value","count"]},"description":"Amounts in other currencies than the project currency, NOT included in any total above (per currency). Empty when everything is in the project currency.","x-field-group":"amounts"},"excludedCommitted":{"type":"array","items":{"type":"object","properties":{"currency":{"type":"string","minLength":3,"maxLength":3},"value":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["currency","value","count"]},"description":"Committed amounts of contracts in other currencies than the project currency, NOT included in `committed` (per currency; count = contracts). Needs both the amounts and budget field groups. (0.1.3)","x-field-group":"amounts"}},"required":["projectId","currency"]},"Intake":{"$id":"#/components/schemas/Intake","type":"object","properties":{"channel":{"type":"string","enum":["email","app","chat","api","manual"],"description":"How the record came in: email (sent to the project address), app (uploaded in the Propel app), chat (the Propel assistant), api, manual (entered or imported)","x-extensible-enum":true},"status":{"anyOf":[{"type":"string","enum":["queued","processing","completed","failed"],"x-extensible-enum":true},{"type":"null"}],"description":"Document processing (reading the PDF): queued → processing → completed, or failed. null when there was nothing to process."},"receivedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"When the record was received/created (ISO-8601, UTC)"}},"required":["channel","status","receivedAt"]},"Record":{"$id":"#/components/schemas/Record","type":"object","properties":{"id":{"type":"string","x-field-group":"core"},"projectId":{"type":"string","x-field-group":"core"},"systemKind":{"type":"string","enum":["cost","income","financing","tax"],"x-field-group":"core","x-extensible-enum":true},"direction":{"type":"string","enum":["in","out"],"x-field-group":"core","x-extensible-enum":true},"basis":{"type":"string","enum":["actual","forecast"],"x-field-group":"core","x-extensible-enum":true},"source":{"type":"string","enum":["invoice","accrual","rentRoll","loan","contract","manual","bankMatched"],"description":"invoice = a supplier invoice; accrual = an accrual entry (an expected cost booked before the invoice exists, usually without a document)","x-field-group":"core","x-extensible-enum":true},"status":{"type":"string","enum":["setup","approvalPending","paymentPending","paid","rejected"],"description":"Lifecycle. All approval steps collapse to approvalPending; workflowStep tells them apart.","x-field-group":"core","x-extensible-enum":true},"workflowStep":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The project's own step name, e.g. 'Developer Approval'","x-field-group":"core"},"counterparty":{"type":"object","properties":{"contractorId":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["contractorId","name"],"description":"name is null while an invoice is still being set up from a scan","x-field-group":"core"},"invoiceNumber":{"anyOf":[{"type":"string"},{"type":"null"}],"x-field-group":"core"},"recognitionDate":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Calendar date YYYY-MM-DD (Europe/Vienna)"},{"type":"null"}],"description":"Invoice date (accrual)","x-field-group":"core"},"dueDate":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Calendar date YYYY-MM-DD (Europe/Vienna)"},{"type":"null"}],"x-field-group":"payment"},"cashDate":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Calendar date YYYY-MM-DD (Europe/Vienna)"},{"type":"null"}],"description":"Payment date, when paid","x-field-group":"payment"},"net":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"x-field-group":"amounts"},"tax":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"x-field-group":"amounts"},"gross":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"x-field-group":"amounts"},"allocations":{"type":"array","items":{"type":"object","properties":{"budgetNode":{"type":"object","properties":{"nodeId":{"anyOf":[{"type":"string"},{"type":"null"}]},"code":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"budgetName":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["nodeId","code","name","budgetName"],"x-field-group":"budget"},"net":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"x-field-group":"amounts"}},"required":[]},"description":"Where the record's amount is booked in the budget. Today always one entry (the whole net amount); an invoice split across budget lines will carry several entries summing to `net`.","x-field-group":"budget"},"budgetNode":{"anyOf":[{"type":"object","properties":{"nodeId":{"anyOf":[{"type":"string"},{"type":"null"}]},"code":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"budgetName":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["nodeId","code","name","budgetName"]},{"type":"null"}],"description":"Shortcut for a record booked on ONE budget line (= allocations[0].budgetNode); null when the record is split across several.","x-field-group":"budget"},"accountingCodes":{"type":"array","items":{"$ref":"#/components/schemas/AccountingCode"},"description":"Accounting codes of the record: as certified at approval when stored, else derived from its budget line (0.1.2).","x-field-group":"accounting"},"documents":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"kind":{"type":"string","enum":["original","approved","other"],"description":"original = the document as received; approved = a copy stamped during approval; other. A label from the document, not the workflow state — use status. (0.1.1)","x-extensible-enum":true}},"required":["name","kind"]},"description":"PDFs on the record (names only; files are not served by the API)","x-field-group":"documents"},"intake":{"$ref":"#/components/schemas/Intake","x-field-group":"core"}},"required":["id","projectId","systemKind","direction","basis","source","status","workflowStep","counterparty","invoiceNumber","recognitionDate","intake"]},"Contractor":{"$id":"#/components/schemas/Contractor","type":"object","properties":{"id":{"type":"string","x-field-group":"core"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"x-field-group":"core"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"x-field-group":"core"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"x-field-group":"core"},"taxId":{"anyOf":[{"type":"string"},{"type":"null"}],"x-field-group":"tax"},"registrationNumber":{"anyOf":[{"type":"string"},{"type":"null"}],"x-field-group":"tax"}},"required":["id","name","city","country"]},"Contract":{"$id":"#/components/schemas/Contract","type":"object","properties":{"id":{"type":"string","x-field-group":"core"},"projectId":{"type":"string","x-field-group":"core"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"x-field-group":"core"},"status":{"anyOf":[{"type":"string","enum":["setup","signed","completed","cancelled"],"x-extensible-enum":true},{"type":"null"}],"description":"signed and completed contracts count as committed; setup and cancelled don't. Needs the amounts field group.","x-field-group":"amounts"},"startDate":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Calendar date YYYY-MM-DD (Europe/Vienna)"},{"type":"null"}],"x-field-group":"core"},"endDate":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Calendar date YYYY-MM-DD (Europe/Vienna)"},{"type":"null"}],"x-field-group":"core"},"counterparty":{"anyOf":[{"type":"object","properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name"]},{"type":"null"}],"description":"The contractor. Needs the amounts field group.","x-field-group":"amounts"},"committed":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"description":"Base amount + approved amendments (net), in the contract's currency. Null while the contract has no budget-line allocation.","x-field-group":"amounts"},"invoiced":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"description":"Net amount of the non-rejected invoices linked to this contract","x-field-group":"amounts"},"paid":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"description":"Net amount of the paid invoices linked to this contract","x-field-group":"amounts"},"openCommitment":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"description":"committed − invoiced, never negative","x-field-group":"amounts"},"overInvoiced":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"description":"invoiced − committed when positive","x-field-group":"amounts"},"pendingChanges":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"description":"Amendment increases awaiting approval","x-field-group":"amounts"},"reclassRecordIds":{"type":"array","items":{"type":"string"},"description":"Linked records coded to a budget line outside this contract's lines — they count on the contract's lines pro rata and should be re-coded. (0.1.3)","x-field-group":"amounts"},"locked":{"type":"boolean","description":"True after the first approved amendment or linked invoice: the base amount and budget lines can then only change through amendments","x-field-group":"amounts"},"allocations":{"type":"array","items":{"type":"object","properties":{"budgetNodeId":{"type":"string"},"amount":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}]}},"required":["budgetNodeId","amount"]},"description":"Budget lines of the base contract; amounts need the amounts field group too. Empty while not allocated.","x-field-group":"budget"},"amendments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"budgetNodeId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"null without the budget field group"},"amount":{"$ref":"#/components/schemas/Amount"},"status":{"type":"string","enum":["draft","pending","approved","rejected"],"x-extensible-enum":true},"date":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Calendar date YYYY-MM-DD (Europe/Vienna)"},{"type":"null"}]},"title":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","budgetNodeId","amount","status","date","title"]},"description":"Change orders (Nachträge), oldest first; drafts are not listed","x-field-group":"amounts"}},"required":["id","projectId","name","startDate","endDate"]},"ForecastSnapshot":{"$id":"#/components/schemas/ForecastSnapshot","type":"object","properties":{"month":{"type":"string","description":"YYYY-MM","x-field-group":"amounts"},"version":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"1, or higher for a correction or a resubmission","x-field-group":"amounts"},"status":{"type":"string","enum":["submitted","approved","rejected"],"x-field-group":"amounts","x-extensible-enum":true},"official":{"type":"boolean","description":"True for the one approved version that counts for the month","x-field-group":"amounts"},"currency":{"type":"string","minLength":3,"maxLength":3,"x-field-group":"amounts"},"submittedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-8601, UTC","x-field-group":"amounts"},"decidedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-8601, UTC","x-field-group":"amounts"},"totals":{"anyOf":[{"type":"object","properties":{"budget":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"committed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"pendingChanges":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"uncommitted":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"eac":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"variance":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"invoiced":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"paid":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"costToComplete":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["budget","committed","pendingChanges","uncommitted","eac","variance","invoiced","paid","costToComplete"]},{"type":"null"}],"description":"Project totals in minor units of `currency`","x-field-group":"amounts"},"changesSincePrevious":{"type":"array","items":{"type":"object","properties":{"budgetNodeId":{"type":"string"},"eacBefore":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"eacAfter":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"eacDelta":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"explained":{"type":"boolean"}},"required":["budgetNodeId","eacBefore","eacAfter","eacDelta","explained"]},"description":"EAC change per line against the previous approved month (needs amounts; the reasons themselves stay in the app)","x-field-group":"amounts"}},"required":[]},"CashflowNode":{"$id":"#/components/schemas/CashflowNode","type":"object","properties":{"nodeId":{"type":"string","x-field-group":"budget"},"level":{"type":"string","enum":["budget","subBudget","costItem"],"x-field-group":"budget","x-extensible-enum":true},"code":{"type":"string","x-field-group":"budget"},"name":{"type":"string","x-field-group":"budget"},"parentId":{"anyOf":[{"type":"string"},{"type":"null"}],"x-field-group":"budget"},"months":{"type":"array","items":{"type":"object","properties":{"month":{"type":"string"},"actual":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"forecast":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["month","actual","forecast"]},"description":"Per month in minor units: actual = paid (by payment month, past months only); forecast = phased funding to complete (from the current month on). Includes all descendants.","x-field-group":"amounts"},"undated":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Funding to complete that couldn't be phased because the line has no dates (set the project periods or the line's dates)","x-field-group":"amounts"},"gap":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Custom months that don't add up to the amount to phase (non-zero blocks a snapshot)","x-field-group":"amounts"},"flags":{"type":"array","items":{"type":"string"},"description":"e.g. overdue, undated, customGap, overInvoicedVsEac, recurringMissing","x-field-group":"amounts"}},"required":[]},"Cashflow":{"$id":"#/components/schemas/Cashflow","type":"object","properties":{"projectId":{"type":"string","x-field-group":"core"},"currency":{"type":"string","minLength":3,"maxLength":3,"x-field-group":"core"},"asOf":{"type":"string","description":"First forecast month (YYYY-MM)","x-field-group":"core"},"nodes":{"type":"array","items":{"$ref":"#/components/schemas/CashflowNode"},"x-field-group":"budget"}},"required":["projectId","currency","asOf"]},"Unit":{"$id":"#/components/schemas/Unit","type":"object","properties":{"unitId":{"type":"string","x-field-group":"core"},"siteId":{"anyOf":[{"type":"string"},{"type":"null"}],"x-field-group":"core"},"siteName":{"anyOf":[{"type":"string"},{"type":"null"}],"x-field-group":"core"},"buildingId":{"anyOf":[{"type":"string"},{"type":"null"}],"x-field-group":"core"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"x-field-group":"core"},"type":{"type":"string","x-field-group":"core"},"floor":{"anyOf":[{"type":"string"},{"type":"null"}],"x-field-group":"core"},"areaM2":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Area in m² (null for parking)","x-field-group":"core"},"spaces":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Parking spaces (null otherwise)","x-field-group":"core"},"askingRate":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"description":"Asking rent per m² or per space per month","x-field-group":"amounts"}},"required":["unitId","siteId","siteName","buildingId","label","type","floor","areaM2","spaces"]},"RentRollLease":{"$id":"#/components/schemas/RentRollLease","type":"object","properties":{"leaseId":{"type":"string","x-field-group":"amounts"},"category":{"type":"string","enum":["main","other"],"description":"main = the scheme's tenants; other = current-use agreements (masts, parking, land use)","x-field-group":"amounts","x-extensible-enum":true},"counterparty":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The renting company","x-field-group":"amounts"},"status":{"type":"string","enum":["draft","signed","active","ended"],"x-field-group":"amounts","x-extensible-enum":true},"unitIds":{"type":"array","items":{"type":"string"},"x-field-group":"amounts"},"start":{"type":"string","x-field-group":"amounts"},"end":{"type":"string","x-field-group":"amounts"},"effectiveEnd":{"type":"string","description":"end, or the exercised break","x-field-group":"amounts"},"firstBreak":{"anyOf":[{"type":"string"},{"type":"null"}],"x-field-group":"amounts"},"passingRentAnnual":{"type":"object","properties":{"value":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The amount as an integer in the currency's smallest unit (cents for EUR): 123456 = 1,234.56 EUR. Never a decimal."},"currency":{"type":"string","minLength":3,"maxLength":3,"description":"ISO-4217 currency code, e.g. EUR"}},"required":["value","currency"],"description":"12 × the rent payable in the asOf month (0 in a rent-free month), after steps and indexation","$ref":"#/components/schemas/Amount","x-field-group":"amounts"},"indexation":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"e.g. \"fixed 2.5 %\", \"VPI 2020, threshold 3 %\"","x-field-group":"amounts"}},"required":[]},"RentRoll":{"$id":"#/components/schemas/RentRoll","type":"object","properties":{"projectId":{"type":"string","x-field-group":"amounts"},"asOf":{"type":"string","x-field-group":"amounts"},"currency":{"type":"string","minLength":3,"maxLength":3,"x-field-group":"amounts"},"passingRentAnnual":{"type":"object","properties":{"value":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The amount as an integer in the currency's smallest unit (cents for EUR): 123456 = 1,234.56 EUR. Never a decimal."},"currency":{"type":"string","minLength":3,"maxLength":3,"description":"ISO-4217 currency code, e.g. EUR"}},"required":["value","currency"],"description":"All leases in force, current-use agreements included","$ref":"#/components/schemas/Amount","x-field-group":"amounts"},"passingRentOtherAnnual":{"type":"object","properties":{"value":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The amount as an integer in the currency's smallest unit (cents for EUR): 123456 = 1,234.56 EUR. Never a decimal."},"currency":{"type":"string","minLength":3,"maxLength":3,"description":"ISO-4217 currency code, e.g. EUR"}},"required":["value","currency"],"description":"Of which current-use agreements (masts, parking, land use)","$ref":"#/components/schemas/Amount","x-field-group":"amounts"},"forwardRent12m":{"type":"object","properties":{"value":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The amount as an integer in the currency's smallest unit (cents for EUR): 123456 = 1,234.56 EUR. Never a decimal."},"currency":{"type":"string","minLength":3,"maxLength":3,"description":"ISO-4217 currency code, e.g. EUR"}},"required":["value","currency"],"description":"Lease rent over the next 12 months (signed + active leases)","$ref":"#/components/schemas/Amount","x-field-group":"amounts"},"letAreaM2":{"type":"number","x-field-group":"amounts"},"totalAreaM2":{"type":"number","x-field-group":"amounts"},"vacancyPct":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"By area of the scheme; parking and current-use areas counted separately","x-field-group":"amounts"},"waultToExpiryYears":{"type":"number","x-field-group":"amounts"},"waultToBreakYears":{"type":"number","x-field-group":"amounts"},"leases":{"type":"array","items":{"$ref":"#/components/schemas/RentRollLease"},"x-field-group":"amounts"}},"required":[]},"Facility":{"$id":"#/components/schemas/Facility","type":"object","properties":{"facilityId":{"type":"string","x-field-group":"financial"},"projectIds":{"type":"array","items":{"type":"string"},"x-field-group":"financial"},"lender":{"type":"string","x-field-group":"financial"},"type":{"type":"string","enum":["construction","investment","bridge","shareholder"],"x-field-group":"financial","x-extensible-enum":true},"currency":{"type":"string","minLength":3,"maxLength":3,"x-field-group":"financial"},"commitment":{"$ref":"#/components/schemas/Amount","x-field-group":"amounts"},"drawn":{"type":"object","properties":{"value":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The amount as an integer in the currency's smallest unit (cents for EUR): 123456 = 1,234.56 EUR. Never a decimal."},"currency":{"type":"string","minLength":3,"maxLength":3,"description":"ISO-4217 currency code, e.g. EUR"}},"required":["value","currency"],"description":"Funded drawdowns − repayments","$ref":"#/components/schemas/Amount","x-field-group":"amounts"},"available":{"type":"object","properties":{"value":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The amount as an integer in the currency's smallest unit (cents for EUR): 123456 = 1,234.56 EUR. Never a decimal."},"currency":{"type":"string","minLength":3,"maxLength":3,"description":"ISO-4217 currency code, e.g. EUR"}},"required":["value","currency"],"description":"What can still be drawn: commitment − draws so far (− the balance instead, for revolving facilities) − requested draws","$ref":"#/components/schemas/Amount","x-field-group":"amounts"},"requested":{"type":"object","properties":{"value":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The amount as an integer in the currency's smallest unit (cents for EUR): 123456 = 1,234.56 EUR. Never a decimal."},"currency":{"type":"string","minLength":3,"maxLength":3,"description":"ISO-4217 currency code, e.g. EUR"}},"required":["value","currency"],"description":"Requested, not yet funded","$ref":"#/components/schemas/Amount","x-field-group":"amounts"},"availability":{"type":"object","properties":{"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Calendar date YYYY-MM-DD (Europe/Vienna)"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Calendar date YYYY-MM-DD (Europe/Vienna)"}},"required":["from","to"],"x-field-group":"financial"},"maturity":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Calendar date YYYY-MM-DD (Europe/Vienna)","x-field-group":"financial"},"pricing":{"type":"object","properties":{"referenceRate":{"type":"string"},"marginBp":{"type":"number"},"floorBp":{"anyOf":[{"type":"number"},{"type":"null"}]},"floorOn":{"description":"allIn = the floor applies to reference + margin","type":"string","enum":["reference","allIn"],"x-extensible-enum":true},"fixedRateBp":{"type":"number"},"marginSteps":{"description":"Margin changes over time; the base margin applies before the first step","type":"array","items":{"type":"object","properties":{"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Calendar date YYYY-MM-DD (Europe/Vienna)"},"marginBp":{"type":"number"}},"required":["from","marginBp"]}}},"required":["referenceRate","marginBp","floorBp"],"description":"Basis points, up to 3 decimals","x-field-group":"financial"},"interestTreatment":{"type":"string","enum":["paid","capitalised"],"description":"capitalised = past capitalisations are recorded as interest drawdowns; future interest is not capitalised automatically","x-field-group":"financial","x-extensible-enum":true},"nextIpd":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Calendar date YYYY-MM-DD (Europe/Vienna)"},{"type":"null"}],"x-field-group":"financial"},"ltcBp":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"x-field-group":"financial"}},"required":[]},"FacilityPeriod":{"$id":"#/components/schemas/FacilityPeriod","type":"object","properties":{"start":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Calendar date YYYY-MM-DD (Europe/Vienna)","x-field-group":"financial"},"end":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Calendar date YYYY-MM-DD (Europe/Vienna)","x-field-group":"financial"},"referenceBp":{"anyOf":[{"type":"number"},{"type":"null"}],"x-field-group":"financial"},"marginBp":{"anyOf":[{"type":"number"},{"type":"null"}],"x-field-group":"financial"},"rateBp":{"anyOf":[{"type":"number"},{"type":"null"}],"x-field-group":"financial"},"interest":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"x-field-group":"amounts"},"commitmentFee":{"anyOf":[{"$ref":"#/components/schemas/Amount"},{"type":"null"}],"x-field-group":"amounts"},"balanceAtStart":{"$ref":"#/components/schemas/Amount","x-field-group":"amounts"},"projected":{"type":"boolean","description":"No fixing for this period yet — the last known one is used","x-field-group":"financial"}},"required":[]},"FacilityDrawdown":{"$id":"#/components/schemas/FacilityDrawdown","type":"object","properties":{"drawdownId":{"type":"string","x-field-group":"financial"},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Calendar date YYYY-MM-DD (Europe/Vienna)","x-field-group":"financial"},"amount":{"$ref":"#/components/schemas/Amount","x-field-group":"amounts"},"status":{"type":"string","enum":["planned","requested","funded"],"x-field-group":"financial","x-extensible-enum":true},"kind":{"type":"string","enum":["draw","repayment","interest"],"x-field-group":"financial","x-extensible-enum":true}},"required":[]},"Page":{"$id":"#/components/schemas/Page","type":"object","properties":{"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque. Pass as ?cursor= for the next page; null = last page. Follow it until null."},"limit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The page size used"},"total":{"description":"Number of records matching the filters across all pages. Only with ?count=true. (0.1.1)","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["nextCursor","limit"]},"ProjectListResponse":{"$id":"#/components/schemas/ProjectListResponse","type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Project"}},"page":{"$ref":"#/components/schemas/Page"}},"required":["data","page"]},"ProjectResponse":{"$id":"#/components/schemas/ProjectResponse","type":"object","properties":{"data":{"$ref":"#/components/schemas/Project"}},"required":["data"]},"ProjectBudgetResponse":{"$id":"#/components/schemas/ProjectBudgetResponse","type":"object","properties":{"data":{"$ref":"#/components/schemas/ProjectBudget"}},"required":["data"]},"RecordListResponse":{"$id":"#/components/schemas/RecordListResponse","type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Record"}},"page":{"$ref":"#/components/schemas/Page"}},"required":["data","page"]},"RecordResponse":{"$id":"#/components/schemas/RecordResponse","type":"object","properties":{"data":{"$ref":"#/components/schemas/Record"}},"required":["data"]},"ContractorListResponse":{"$id":"#/components/schemas/ContractorListResponse","type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Contractor"}},"page":{"$ref":"#/components/schemas/Page"}},"required":["data","page"]},"ContractListResponse":{"$id":"#/components/schemas/ContractListResponse","type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Contract"}},"page":{"$ref":"#/components/schemas/Page"}},"required":["data","page"]},"ContractResponse":{"$id":"#/components/schemas/ContractResponse","type":"object","properties":{"data":{"$ref":"#/components/schemas/Contract"}},"required":["data"]},"ForecastSnapshotListResponse":{"$id":"#/components/schemas/ForecastSnapshotListResponse","type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ForecastSnapshot"}},"page":{"$ref":"#/components/schemas/Page"}},"required":["data","page"]},"ForecastSnapshotResponse":{"$id":"#/components/schemas/ForecastSnapshotResponse","type":"object","properties":{"data":{"$ref":"#/components/schemas/ForecastSnapshot"}},"required":["data"]},"CashflowResponse":{"$id":"#/components/schemas/CashflowResponse","type":"object","properties":{"data":{"$ref":"#/components/schemas/Cashflow"}},"required":["data"]},"UnitListResponse":{"$id":"#/components/schemas/UnitListResponse","type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Unit"}},"page":{"$ref":"#/components/schemas/Page"}},"required":["data","page"]},"RentRollResponse":{"$id":"#/components/schemas/RentRollResponse","type":"object","properties":{"data":{"$ref":"#/components/schemas/RentRoll"}},"required":["data"]},"FacilityListResponse":{"$id":"#/components/schemas/FacilityListResponse","type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Facility"}},"page":{"$ref":"#/components/schemas/Page"}},"required":["data","page"]},"FacilityScheduleResponse":{"$id":"#/components/schemas/FacilityScheduleResponse","type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/FacilityPeriod"}}},"required":["data"]},"FacilityDrawdownListResponse":{"$id":"#/components/schemas/FacilityDrawdownListResponse","type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/FacilityDrawdown"}},"page":{"$ref":"#/components/schemas/Page"}},"required":["data","page"]},"Error":{"$id":"#/components/schemas/Error","type":"object","properties":{"type":{"type":"string","description":"Machine-readable error type, a stable relative URI, e.g. \"/problems/not-found\" (GET it for an explanation). Branch your code on this."},"title":{"type":"string","description":"Short human-readable summary, e.g. \"Not found\". Stable per type."},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The HTTP status code, repeated in the body"},"detail":{"description":"Explanation for this occurrence, e.g. which parameter was wrong. Don't parse it.","type":"string"},"requestId":{"type":"string","description":"Id of this request (also the x-request-id header). Quote it when reporting a problem."}},"required":["type","title","status","requestId"]},"FeedbackInput":{"$id":"#/components/schemas/FeedbackInput","type":"object","properties":{"category":{"type":"string","enum":["bug","missing","confusing","idea","praise"],"description":"bug = something is wrong · missing = a field/filter/endpoint you needed · confusing = docs or behaviour unclear · idea · praise"},"message":{"type":"string","minLength":1,"maxLength":2000,"description":"What happened or what you need, in plain words (max 2,000 characters). Never include keys or secrets."},"endpoint":{"description":"The call it is about, e.g. \"GET /v0/records?status=paid\"","type":"string","maxLength":200},"requestId":{"description":"The requestId of a call that went wrong (from the error body or the x-request-id header)","type":"string","maxLength":100},"agent":{"type":"object","properties":{"name":{"description":"Name of the agent or integration","type":"string","maxLength":100},"model":{"description":"Model, if an AI agent","type":"string","maxLength":100}},"additionalProperties":false}},"required":["category","message"],"additionalProperties":false},"FeedbackReceipt":{"$id":"#/components/schemas/FeedbackReceipt","type":"object","properties":{"id":{"type":"string"},"receivedAt":{"type":"string","description":"ISO-8601, UTC"}},"required":["id","receivedAt"]},"FeedbackResponse":{"$id":"#/components/schemas/FeedbackResponse","type":"object","properties":{"data":{"$ref":"#/components/schemas/FeedbackReceipt"}},"required":["data"]}},"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"A Propel session token (signed-in user) or an API key `pk_<env>_<prefix>_<secret>`."}}}}