{"openapi":"3.0.3","info":{"title":"Spartisco","version":"1.0.0","description":"Allowlist per una chiave di casa. Header Authorization: Bearer. Soldi in centesimi interi. Il cookie di sessione non autentica queste route."},"servers":[{"url":"https://app.spartisco.casa/api/v1"}],"components":{"securitySchemes":{"bearerKey":{"type":"http","scheme":"bearer"}}},"paths":{"/spaces/{id}":{"get":{"summary":"GET /spaces/:id","security":[{"bearerKey":[]}],"responses":{"200":{"description":"Ok"},"201":{"description":"Bozza creata"},"401":{"description":"Chiave assente, non valida, scaduta o revocata"},"403":{"description":"Scope mancante, piano Demo o sola lettura"},"404":{"description":"Risorsa assente o path fuori allowlist"},"409":{"description":"Periodo pareggiato o alloggio senza occupazione"},"422":{"description":"Body non valido"},"429":{"description":"Troppe chiamate"}}}},"/spaces/{id}/units":{"get":{"summary":"GET /spaces/:id/units","security":[{"bearerKey":[]}],"responses":{"200":{"description":"Ok"},"201":{"description":"Bozza creata"},"401":{"description":"Chiave assente, non valida, scaduta o revocata"},"403":{"description":"Scope mancante, piano Demo o sola lettura"},"404":{"description":"Risorsa assente o path fuori allowlist"},"409":{"description":"Periodo pareggiato o alloggio senza occupazione"},"422":{"description":"Body non valido"},"429":{"description":"Troppe chiamate"}}}},"/spaces/{id}/people":{"get":{"summary":"GET /spaces/:id/people","security":[{"bearerKey":[]}],"responses":{"200":{"description":"Ok"},"201":{"description":"Bozza creata"},"401":{"description":"Chiave assente, non valida, scaduta o revocata"},"403":{"description":"Scope mancante, piano Demo o sola lettura"},"404":{"description":"Risorsa assente o path fuori allowlist"},"409":{"description":"Periodo pareggiato o alloggio senza occupazione"},"422":{"description":"Body non valido"},"429":{"description":"Troppe chiamate"}}}},"/spaces/{id}/periods":{"get":{"summary":"GET /spaces/:id/periods","security":[{"bearerKey":[]}],"responses":{"200":{"description":"Ok"},"201":{"description":"Bozza creata"},"401":{"description":"Chiave assente, non valida, scaduta o revocata"},"403":{"description":"Scope mancante, piano Demo o sola lettura"},"404":{"description":"Risorsa assente o path fuori allowlist"},"409":{"description":"Periodo pareggiato o alloggio senza occupazione"},"422":{"description":"Body non valido"},"429":{"description":"Troppe chiamate"}}}},"/spaces/{id}/periods/{pid}":{"get":{"summary":"GET /spaces/:id/periods/:pid","security":[{"bearerKey":[]}],"responses":{"200":{"description":"Ok"},"201":{"description":"Bozza creata"},"401":{"description":"Chiave assente, non valida, scaduta o revocata"},"403":{"description":"Scope mancante, piano Demo o sola lettura"},"404":{"description":"Risorsa assente o path fuori allowlist"},"409":{"description":"Periodo pareggiato o alloggio senza occupazione"},"422":{"description":"Body non valido"},"429":{"description":"Troppe chiamate"}}}},"/spaces/{id}/expenses":{"get":{"summary":"GET /spaces/:id/expenses","security":[{"bearerKey":[]}],"responses":{"200":{"description":"Spese confermate, oppure bozze agente se review_state=draft.","content":{"application/json":{"schema":{"type":"object","required":["expenses"],"properties":{"expenses":{"type":"array","items":{"type":"object","required":["id","review_state","created_via","voce","title","amount_cents","currency","period_id","payer"],"properties":{"id":{"type":"string"},"review_state":{"type":"string","enum":["draft","confirmed"],"description":"Bozza visibile. draft non entra nei totali."},"created_via":{"type":"string","enum":["app","agent"]},"voce":{"type":"string","nullable":true,"description":"Voce della spesa, oppure null."},"title":{"type":"string","description":"Voce · competenza. Senza voce è il nome già in archivio."},"amount_cents":{"type":"integer"},"currency":{"type":"string","enum":["EUR"]},"period_id":{"type":"string"},"competence_from":{"type":"string","nullable":true},"competence_to":{"type":"string","nullable":true},"note":{"type":"string","nullable":true},"payer":{"type":"string","nullable":true,"description":"Id persona, oppure null se la bozza non ha pagatore."}}}}}}}}},"201":{"description":"Bozza creata"},"401":{"description":"Chiave assente, non valida, scaduta o revocata"},"403":{"description":"Scope mancante, piano Demo o sola lettura"},"404":{"description":"Risorsa assente o path fuori allowlist"},"409":{"description":"Periodo pareggiato o alloggio senza occupazione"},"422":{"description":"Body non valido"},"429":{"description":"Troppe chiamate"}}},"post":{"summary":"POST /spaces/:id/expenses","security":[{"bearerKey":[]}],"responses":{"200":{"description":"Ok"},"201":{"description":"Bozza (review_state draft, created_via agent). payer è l’id persona o null.","content":{"application/json":{"schema":{"type":"object","required":["id","review_state","created_via","voce","title","amount_cents","currency","period_id","payer"],"properties":{"id":{"type":"string"},"review_state":{"type":"string","enum":["draft","confirmed"],"description":"Bozza visibile. draft non entra nei totali."},"created_via":{"type":"string","enum":["app","agent"]},"voce":{"type":"string","nullable":true,"description":"Voce della spesa, oppure null."},"title":{"type":"string","description":"Voce · competenza. Senza voce è il nome già in archivio."},"amount_cents":{"type":"integer"},"currency":{"type":"string","enum":["EUR"]},"period_id":{"type":"string"},"competence_from":{"type":"string","nullable":true},"competence_to":{"type":"string","nullable":true},"note":{"type":"string","nullable":true},"payer":{"type":"string","nullable":true,"description":"Id persona, oppure null se la bozza non ha pagatore."}}}}}},"401":{"description":"Chiave assente, non valida, scaduta o revocata"},"403":{"description":"Scope mancante, piano Demo o sola lettura"},"404":{"description":"Risorsa assente o path fuori allowlist"},"409":{"description":"Periodo pareggiato o alloggio senza occupazione"},"422":{"description":"Body non valido"},"429":{"description":"Troppe chiamate"}},"parameters":[{"in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string"},"description":"Stessa chiave entro 24 ore restituisce la stessa bozza (201)."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["amount_cents","period_id"],"additionalProperties":false,"properties":{"voce":{"type":"string","description":"Voce già esistente. tag e name non sono accettati (422, campo sconosciuto). Una voce sconosciuta è 422 unknown_voce."},"amount_cents":{"type":"integer","minimum":1,"description":"Importo in centesimi. 12850 = 128,50 €"},"period_id":{"type":"string","description":"Id del periodo (GET /periods)"},"payer":{"type":"string","description":"Solo l’id persona (GET /people). Un oggetto è invalid_body. Facoltativo: se manca, payer in risposta è null."},"competence_from":{"type":"string","description":"Data YYYY-MM-DD, facoltativa"},"competence_to":{"type":"string","description":"Data YYYY-MM-DD, facoltativa"},"note":{"type":"string","description":"Nota, facoltativa"}}},"example":{"voce":"Luce agosto","amount_cents":12850,"period_id":"01PERIODO","payer":"01PERSONA","competence_from":"2026-08-01","competence_to":"2026-08-31","note":"bolletta luce"}}}}}},"/spaces/{id}/expenses/{eid}":{"get":{"summary":"GET /spaces/:id/expenses/:eid","security":[{"bearerKey":[]}],"responses":{"200":{"description":"Spesa con split_line. payer è l’id persona o null.","content":{"application/json":{"schema":{"allOf":[{"type":"object","required":["id","review_state","created_via","voce","title","amount_cents","currency","period_id","payer"],"properties":{"id":{"type":"string"},"review_state":{"type":"string","enum":["draft","confirmed"],"description":"Bozza visibile. draft non entra nei totali."},"created_via":{"type":"string","enum":["app","agent"]},"voce":{"type":"string","nullable":true,"description":"Voce della spesa, oppure null."},"title":{"type":"string","description":"Voce · competenza. Senza voce è il nome già in archivio."},"amount_cents":{"type":"integer"},"currency":{"type":"string","enum":["EUR"]},"period_id":{"type":"string"},"competence_from":{"type":"string","nullable":true},"competence_to":{"type":"string","nullable":true},"note":{"type":"string","nullable":true},"payer":{"type":"string","nullable":true,"description":"Id persona, oppure null se la bozza non ha pagatore."}}},{"type":"object","properties":{"split_line":{"type":"array","items":{"type":"object","required":["person_id","amount_cents","source"],"properties":{"person_id":{"type":"string"},"unit_id":{"type":"string","nullable":true},"amount_cents":{"type":"integer"},"source":{"type":"string"}}}}}}]}}}},"201":{"description":"Bozza creata"},"401":{"description":"Chiave assente, non valida, scaduta o revocata"},"403":{"description":"Scope mancante, piano Demo o sola lettura"},"404":{"description":"Risorsa assente o path fuori allowlist"},"409":{"description":"Periodo pareggiato o alloggio senza occupazione"},"422":{"description":"Body non valido"},"429":{"description":"Troppe chiamate"}}}},"/spaces/{id}/balances":{"get":{"summary":"GET /spaces/:id/balances","security":[{"bearerKey":[]}],"responses":{"200":{"description":"Ok"},"201":{"description":"Bozza creata"},"401":{"description":"Chiave assente, non valida, scaduta o revocata"},"403":{"description":"Scope mancante, piano Demo o sola lettura"},"404":{"description":"Risorsa assente o path fuori allowlist"},"409":{"description":"Periodo pareggiato o alloggio senza occupazione"},"422":{"description":"Body non valido"},"429":{"description":"Troppe chiamate"}}}},"/spaces/{id}/occupancy":{"get":{"summary":"GET /spaces/:id/occupancy","security":[{"bearerKey":[]}],"responses":{"200":{"description":"Ok"},"201":{"description":"Bozza creata"},"401":{"description":"Chiave assente, non valida, scaduta o revocata"},"403":{"description":"Scope mancante, piano Demo o sola lettura"},"404":{"description":"Risorsa assente o path fuori allowlist"},"409":{"description":"Periodo pareggiato o alloggio senza occupazione"},"422":{"description":"Body non valido"},"429":{"description":"Troppe chiamate"}}},"put":{"summary":"PUT /spaces/:id/occupancy","security":[{"bearerKey":[]}],"responses":{"200":{"description":"Ok"},"201":{"description":"Bozza creata"},"401":{"description":"Chiave assente, non valida, scaduta o revocata"},"403":{"description":"Scope mancante, piano Demo o sola lettura"},"404":{"description":"Risorsa assente o path fuori allowlist"},"409":{"description":"Periodo pareggiato o alloggio senza occupazione"},"422":{"description":"Body non valido"},"429":{"description":"Troppe chiamate"}}}},"/spaces/{id}/readings":{"get":{"summary":"GET /spaces/:id/readings","security":[{"bearerKey":[]}],"responses":{"200":{"description":"Ok"},"201":{"description":"Bozza creata"},"401":{"description":"Chiave assente, non valida, scaduta o revocata"},"403":{"description":"Scope mancante, piano Demo o sola lettura"},"404":{"description":"Risorsa assente o path fuori allowlist"},"409":{"description":"Periodo pareggiato o alloggio senza occupazione"},"422":{"description":"Body non valido"},"429":{"description":"Troppe chiamate"}}}},"/spaces/{id}/reports":{"get":{"summary":"GET /spaces/:id/reports","security":[{"bearerKey":[]}],"responses":{"200":{"description":"Ok"},"201":{"description":"Bozza creata"},"401":{"description":"Chiave assente, non valida, scaduta o revocata"},"403":{"description":"Scope mancante, piano Demo o sola lettura"},"404":{"description":"Risorsa assente o path fuori allowlist"},"409":{"description":"Periodo pareggiato o alloggio senza occupazione"},"422":{"description":"Body non valido"},"429":{"description":"Troppe chiamate"}}}},"/spaces/{id}/reports/{rid}":{"get":{"summary":"GET /spaces/:id/reports/:rid","security":[{"bearerKey":[]}],"responses":{"200":{"description":"Ok"},"201":{"description":"Bozza creata"},"401":{"description":"Chiave assente, non valida, scaduta o revocata"},"403":{"description":"Scope mancante, piano Demo o sola lettura"},"404":{"description":"Risorsa assente o path fuori allowlist"},"409":{"description":"Periodo pareggiato o alloggio senza occupazione"},"422":{"description":"Body non valido"},"429":{"description":"Troppe chiamate"}}}}}}