{"openapi":"3.1.0","info":{"title":"PATCH /api/v1/dashboards/models/drafts/{draft_id}","version":"1.0.0","description":"Edit a proposed model before building it"},"servers":[{"url":"https://api.ondayzero.com","description":"Production"}],"paths":{"/api/v1/dashboards/models/drafts/{draft_id}":{"patch":{"tags":["dashboards"],"summary":"Edit a proposed model before building it","description":"Change the period axis or an assumption value on a draft and get the re-planned model back — re-resolved against the chart of accounts and re-evaluated, so the effect of the edit is visible before anything is built.\n\nThis exists so the common edits — *quarterly not monthly*, *the fee is 55 basis points* — do not have to go back through the language model, which would re-emit every row and is free to drift a formula nobody asked about. Structural changes still belong in chat.\n\n`assumptions` is merged into the draft; sending one key does not delete the others. The edit keeps the same `draft_id` and renews its expiry. An edit that would make the model invalid — dropping an assumption a row still references, or an axis wider than the column cap — is rejected here with the reason, not at build time.","operationId":"revise_model_draft_api_v1_dashboards_models_drafts__draft_id__patch","parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"string","title":"Draft Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-business-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Business-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviseDraftRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope_ModelPlanResponse_"}}}},"400":{"description":"Bad Request - Invalid input","content":{"application/json":{"example":{"detail":"Invalid request parameters"}}}},"401":{"description":"Unauthorized - Authentication required","content":{"application/json":{"example":{"detail":"Not authenticated"}}}},"403":{"description":"Forbidden - Insufficient permissions","content":{"application/json":{"example":{"detail":"Not enough permissions"}}}},"404":{"description":"Not Found - Resource does not exist","content":{"application/json":{"example":{"detail":"Resource not found"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ModelPlanResponse":{"properties":{"draft_id":{"type":"string","title":"Draft Id"},"plan":{"additionalProperties":true,"type":"object","title":"Plan"},"headline":{"type":"string","title":"Headline","default":""}},"additionalProperties":false,"type":"object","required":["draft_id"],"title":"ModelPlanResponse","description":"A proposed, unbuilt model returned for review.\n\n``plan`` is the open-shaped payload from\n``app.dashboards.model_specs.plan.build_plan`` — period axis, per-sheet\nsummaries, assumptions and open questions. It is deliberately not modelled\nfield-by-field here: the plan card renders whatever the planner produces,\nand pinning the shape twice would guarantee drift."},"ReviseDraftRequest":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Title"},"assumptions":{"additionalProperties":{"type":"number"},"type":"object","title":"Assumptions"},"grain":{"anyOf":[{"type":"string","enum":["month","quarter","year"]},{"type":"null"}],"title":"Grain"},"start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start"},"end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End"}},"additionalProperties":false,"type":"object","title":"ReviseDraftRequest","description":"Body for ``PATCH /dashboards/models/drafts/{draft_id}``.\n\nThe edits a form can make safely: the period axis and the assumption\nvalues. Both are small, both are exactly checkable, and between them they\ncover most of what a reviewer changes before approving a model — without a\nlanguage-model round trip that would re-emit every row and is free to drift\na formula nobody asked about.\n\nStructural edits stay in chat. ``assumptions`` is merged into the draft, so\nsending one key does not delete the others."},"SuccessEnvelope_ModelPlanResponse_":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"data":{"anyOf":[{"$ref":"#/components/schemas/ModelPlanResponse"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"SuccessEnvelope[ModelPlanResponse]"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Token","description":"API token authentication. Format: `Bearer dz_...`"}}},"security":[{"BearerAuth":[]}]}