{"openapi":"3.1.0","jsonSchemaDialect":"https://json-schema.org/draft/2020-12/schema","info":{"title":"Propel API","version":"0.1.0","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://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":"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"]}}],"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/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"]},"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"}},"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"}},"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","rentRoll","loan","contract","manual","bankMatched"],"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"},"documents":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]},"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"]},"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"}},"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"]},"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>`."}}}}