{"openapi":"3.1.0","info":{"title":"Runway Founder API","version":"1.0.0","description":"Read and update your own startup's financials in Runway, or read the startups in your accelerator, incubator or investment portfolio. Every request is scoped to the company on the token's account, so there is no company parameter anywhere and a token can never reach another startup. The same capabilities are available to AI assistants over MCP at /api/mcp.","contact":{"name":"Runway","url":"https://runway.lvl1accelerator.com/developers"}},"servers":[{"url":"https://runway.lvl1accelerator.com/api/v1"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"A Runway token, created in Settings, AI assistants. Read-only unless you granted write access when creating it."}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"Stable machine-readable code, safe to branch on."},"message":{"type":"string","description":"Human-readable explanation."}},"required":["code","message"]}}},"Snapshot":{"type":"object","properties":{"hasData":{"type":"boolean"},"month":{"type":["string","null"],"description":"YYYY-MM of the latest metrics row."},"revenue":{"type":"number","description":"Monthly revenue, gateway plus direct bank revenue."},"grossBurn":{"type":"number","description":"Monthly operating burn before revenue."},"netBurn":{"type":"number","description":"Gross burn minus revenue, never below zero."},"cashInBank":{"type":"number","description":"Latest known cash balance."},"runwayMonths":{"type":"number","description":"Cash divided by net burn, capped at 60."},"runwayIsCapped":{"type":"boolean","description":"True when runway hit the 60-month cap, so the real figure is higher or the company is cash-flow positive."},"activeCustomers":{"type":"number"},"teamSize":{"type":"number"},"company":{"type":"object","properties":{"name":{"type":"string"},"currency":{"type":"string","description":"ISO code. Amounts in every response are in this currency."},"revenueLabel":{"type":"string","description":"MRR or Revenue, depending on the revenue model."}}}}}}},"paths":{"/me":{"get":{"summary":"Who this token belongs to","description":"Call this first: it proves the token works and reports whether it may write.","operationId":"getMe","responses":{"200":{"description":"Account, company and token scope."},"401":{"description":"Missing or invalid token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/metrics/latest":{"get":{"summary":"Current runway, cash, burn and revenue","operationId":"getLatestMetrics","responses":{"200":{"description":"Snapshot.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Snapshot"}}}}}}},"/metrics":{"get":{"summary":"Month-by-month history","operationId":"listMetrics","parameters":[{"name":"months","in":"query","schema":{"type":"integer","minimum":1,"maximum":36,"default":12}}],"responses":{"200":{"description":"Oldest first, so it plots directly."}}},"post":{"summary":"Set one metric for the current month","description":"Refused with 409 when a connected integration already syncs that metric, because the next sync would overwrite a hand-entered value. Send override to set it anyway.","operationId":"updateMetric","security":[{"bearerAuth":["runway:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["metric","value"],"properties":{"metric":{"type":"string","enum":["mrr","burnRate","cashInBank","teamSize","activeCustomers"],"description":"mrr is monthly revenue."},"value":{"type":"number","minimum":0},"override":{"type":"boolean","default":false}}}}}},"responses":{"200":{"description":"Written, with a fresh snapshot so you can see the effect on runway."},"403":{"description":"Read-only token, or the account lacks the metrics permission."},"409":{"description":"An integration owns this metric. Retry with override."}}}},"/burn":{"get":{"summary":"Burn by category and the largest expenses","operationId":"getBurn","parameters":[{"name":"month","in":"query","schema":{"type":"string","pattern":"^\\d{4}-\\d{2}$"},"description":"Defaults to the current month."}],"responses":{"200":{"description":"Categories sorted by amount."}}}},"/expenses":{"get":{"summary":"Expenses for a month","operationId":"listExpenses","parameters":[{"name":"month","in":"query","schema":{"type":"string","pattern":"^\\d{4}-\\d{2}$"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}}],"responses":{"200":{"description":"Newest first."}}},"post":{"summary":"Log an expense in plain words","description":"Send the expense the way you would say it, including the amount. Runway parses and categorises it with the same engine the WhatsApp bot uses, so you do not need to know the category names.","operationId":"logExpense","security":[{"bearerAuth":["runway:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","minLength":3,"maxLength":280,"example":"AWS bill 42000"}}}}}},"responses":{"200":{"description":"Logged and categorised."},"400":{"description":"No amount found in the text, so nothing was written."}}}},"/goals":{"get":{"summary":"Targets and progress","operationId":"getGoals","responses":{"200":{"description":"Null for any target not set."}}},"put":{"summary":"Set a target in plain words","operationId":"setGoal","security":[{"bearerAuth":["runway:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","minLength":3,"maxLength":200,"example":"set MRR goal 10L"}}}}}},"responses":{"200":{"description":"Target saved, with the updated goals."},"400":{"description":"Could not tell which metric or target you meant, so nothing was saved."}}}},"/scenario":{"post":{"summary":"Recompute runway under a hypothetical","description":"Saves nothing. A read token is enough.","operationId":"runScenario","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"burnChangePct":{"type":"number","minimum":-100,"maximum":500,"description":"-20 cuts burn by a fifth."},"extraMonthlyBurn":{"type":"number","description":"Added to monthly burn, e.g. new hires."},"extraMonthlyRevenue":{"type":"number","description":"Added to monthly revenue."},"cashRaised":{"type":"number","description":"One-off cash added to the bank."}}}}}},"responses":{"200":{"description":"Before, after and the delta in months."},"409":{"description":"No metrics yet, so there is nothing to model."}}}},"/readiness":{"get":{"summary":"Is the profile complete enough for investors","operationId":"getReadiness","responses":{"200":{"description":"Ready flag plus exactly what is missing."}}}},"/integrations":{"get":{"summary":"Connected data sources and sync health","operationId":"getIntegrations","responses":{"200":{"description":"One entry per connected provider."}}}},"/investor-updates":{"get":{"summary":"Investor updates written in Runway","operationId":"listInvestorUpdates","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":24,"default":6}},{"name":"includeContent","in":"query","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Newest first."}}}},"/portfolio":{"get":{"summary":"Programme or portfolio overview","description":"For an accelerator, incubator or investor account. Counts, combined revenue and net burn, median runway, which startups are at risk and which have no numbers yet. Aggregates cover only startups sharing exact figures; the response says how many.","operationId":"getPortfolioOverview","responses":{"200":{"description":"Overview."},"404":{"description":"This token belongs to a founder account. Use the founder endpoints."}}}},"/portfolio/companies":{"get":{"summary":"Startups that have shared with you","description":"Sorted worst runway first, with startups that have no numbers last. Each entry carries a fidelity: \"exact\" reports real figures, \"bucketed\" reports ranges only. Startups that have not shared, or revoked, are absent rather than listed empty.","operationId":"listPortfolioCompanies","responses":{"200":{"description":"The visible portfolio."}}}},"/portfolio/cohorts":{"get":{"summary":"Cohorts or batches","description":"Accelerators and incubators only. Each cohort with its startups, how many report numbers and how many are at risk.","operationId":"listCohorts","responses":{"200":{"description":"Cohorts."},"404":{"description":"Not a programme account."}}}},"/portfolio/company":{"get":{"summary":"One startup in detail","operationId":"getPortfolioCompany","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string"},"description":"The startup name, or part of it."},{"name":"months","in":"query","schema":{"type":"integer","minimum":1,"maximum":24,"default":6}}],"responses":{"200":{"description":"Detail plus history. A startup sharing ranges only comes back without history."},"404":{"description":"No such startup has shared data with you."}}}},"/notifications":{"get":{"summary":"Recent Runway alerts","operationId":"listNotifications","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":50,"default":10}},{"name":"unreadOnly","in":"query","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Newest first."}}}}},"x-runway":{"scopes":{"runway:read":"Read every endpoint. Granted to every token.","runway:write":"Also POST /metrics, POST /expenses and PUT /goals."},"rateLimits":{"read":"120 requests per minute per token","write":"30 requests per minute per token"},"mcp":{"url":"https://runway.lvl1accelerator.com/api/mcp","description":"The same capabilities over the Model Context Protocol, for AI assistants."}}}