{"openapi":"3.1.0","info":{"title":"PortfolioSharing API","version":"1.0.0","description":"Manage your own portfolios, transactions and cash. Create a personal API key in the app. Keep it private; it is shown only once. Write keys also grant read access. Values and valuations are estimates; the API does not place trades."},"servers":[{"url":"https://api.portfoliosharing.com"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Personal API key created in the PortfolioSharing app."}}},"paths":{"/v1/portfolios":{"get":{"summary":"List your portfolios","parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Invalid or missing key","content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"Read-only key","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"type":"object"}}}},"422":{"description":"Exchange rate unavailable","content":{"application/json":{"schema":{"type":"object"}}}}}},"post":{"summary":"Create a portfolio","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":100},"currency":{"type":"string","pattern":"^[A-Z]{3}$","example":"USD"}},"required":["name","currency"]}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Invalid or missing key","content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"Read-only key","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"type":"object"}}}},"422":{"description":"Exchange rate unavailable","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/portfolios/{portfolioId}":{"get":{"summary":"Get a portfolio","parameters":[{"name":"portfolioId","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Invalid or missing key","content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"Read-only key","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"type":"object"}}}},"422":{"description":"Exchange rate unavailable","content":{"application/json":{"schema":{"type":"object"}}}}}},"patch":{"summary":"Rename a portfolio","parameters":[{"name":"portfolioId","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Invalid or missing key","content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"Read-only key","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"type":"object"}}}},"422":{"description":"Exchange rate unavailable","content":{"application/json":{"schema":{"type":"object"}}}}}},"delete":{"summary":"Delete a portfolio and its records","parameters":[{"name":"portfolioId","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Invalid or missing key","content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"Read-only key","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"type":"object"}}}},"422":{"description":"Exchange rate unavailable","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/portfolios/{portfolioId}/transactions":{"get":{"summary":"List transactions","parameters":[{"name":"portfolioId","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Invalid or missing key","content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"Read-only key","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"type":"object"}}}},"422":{"description":"Exchange rate unavailable","content":{"application/json":{"schema":{"type":"object"}}}}}},"post":{"summary":"Record a transaction","parameters":[{"name":"portfolioId","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"symbol":{"type":"string","example":"AAPL"},"type":{"type":"string","enum":["BUY","SELL"]},"quantity":{"type":"number","exclusiveMinimum":0},"price":{"type":"number","minimum":0},"fees":{"type":"number","minimum":0,"default":0},"traded_on":{"type":"string","format":"date"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","example":"USD"},"fx_rate_override":{"type":"number","exclusiveMinimum":0,"description":"Reporting-currency units per transaction-currency unit. Otherwise a historical provider rate is used."}},"required":["symbol","type","quantity","price","traded_on"]}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Invalid or missing key","content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"Read-only key","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"type":"object"}}}},"422":{"description":"Exchange rate unavailable","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/portfolios/{portfolioId}/transactions/{transactionId}":{"put":{"summary":"Replace a transaction","parameters":[{"name":"portfolioId","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"transactionId","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"symbol":{"type":"string","example":"AAPL"},"type":{"type":"string","enum":["BUY","SELL"]},"quantity":{"type":"number","exclusiveMinimum":0},"price":{"type":"number","minimum":0},"fees":{"type":"number","minimum":0,"default":0},"traded_on":{"type":"string","format":"date"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","example":"USD"},"fx_rate_override":{"type":"number","exclusiveMinimum":0,"description":"Reporting-currency units per transaction-currency unit. Otherwise a historical provider rate is used."}},"required":["symbol","type","quantity","price","traded_on"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Invalid or missing key","content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"Read-only key","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"type":"object"}}}},"422":{"description":"Exchange rate unavailable","content":{"application/json":{"schema":{"type":"object"}}}}}},"delete":{"summary":"Delete a transaction","parameters":[{"name":"portfolioId","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"transactionId","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Invalid or missing key","content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"Read-only key","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"type":"object"}}}},"422":{"description":"Exchange rate unavailable","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/portfolios/{portfolioId}/cash":{"get":{"summary":"Get cash balances and ledger","parameters":[{"name":"portfolioId","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Invalid or missing key","content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"Read-only key","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"type":"object"}}}},"422":{"description":"Exchange rate unavailable","content":{"application/json":{"schema":{"type":"object"}}}}}},"post":{"summary":"Record cash movement","parameters":[{"name":"portfolioId","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["DEPOSIT","WITHDRAWAL","TRANSFER"]},"currency":{"type":"string","pattern":"^[A-Z]{3}$","example":"USD"},"amount":{"type":"string","example":"100.00"},"occurred_on":{"type":"string","format":"date"},"note":{"type":"string"},"to_currency":{"type":"string","pattern":"^[A-Z]{3}$","example":"USD"},"to_amount":{"type":"string","description":"Actual amount received; required for TRANSFER."}},"required":["type","currency","amount","occurred_on"]}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Invalid or missing key","content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"Read-only key","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"type":"object"}}}},"422":{"description":"Exchange rate unavailable","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/portfolios/{portfolioId}/cash/{cashId}":{"delete":{"summary":"Delete a cash movement; deleting either side of a transfer removes both","parameters":[{"name":"portfolioId","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"cashId","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Invalid or missing key","content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"Read-only key","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"type":"object"}}}},"422":{"description":"Exchange rate unavailable","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/portfolios/{portfolioId}/valuation":{"get":{"summary":"Get an estimated valuation","parameters":[{"name":"portfolioId","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Invalid or missing key","content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"Read-only key","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"type":"object"}}}},"422":{"description":"Exchange rate unavailable","content":{"application/json":{"schema":{"type":"object"}}}}}}}}}