{"openapi":"3.1.0","info":{"title":"POST /api/v1/credit/sandbox/scenarios/appendix-b","version":"1.0.0","description":"Stage the Appendix B book"},"servers":[{"url":"https://api.ondayzero.com","description":"Production"}],"paths":{"/api/v1/credit/sandbox/scenarios/appendix-b":{"post":{"tags":["credit"],"summary":"Stage the Appendix B book","description":"Sandbox only. Seeds one line with the FRD Appendix B book: five March settlements, March's close, a $30,000 payment on 15 April, and closes through `as_of`. Built through the same services as a partner-export seed. Idempotent per `external_line_id`.","operationId":"seed_appendix_b","parameters":[{"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/AppendixBScenarioRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope_AppendixBScenarioResponse_"}}}},"400":{"description":"Bad Request - Invalid input","content":{"application/json":{"example":{"error":"validation_error","message":"Validation failed: due_date: Input should be a valid date","errors":{"due_date":"Input should be a valid date"},"code":"GEN_002","request_id":"3f0e7c2a-9b4d-4e1a-8c6f-2d5b7a1e9c30"},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Missing or expired token, an MCP OAuth token used against the REST API, or no access to this business","content":{"application/json":{"example":{"error":"unauthorized","message":"Authentication required","code":"AUTH_001","request_id":"3f0e7c2a-9b4d-4e1a-8c6f-2d5b7a1e9c30"},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden - Insufficient permissions","content":{"application/json":{"example":{"error":"forbidden","message":"You don't have permission to access this resource","code":"AUTH_002","request_id":"3f0e7c2a-9b4d-4e1a-8c6f-2d5b7a1e9c30"},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found - Resource does not exist","content":{"application/json":{"example":{"error":"not_found","message":"Resource not found","code":"NOT_FOUND_001","request_id":"3f0e7c2a-9b4d-4e1a-8c6f-2d5b7a1e9c30"},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"validation_error","message":"Validation failed: amount: Input should be a valid integer","errors":{"amount":"Input should be a valid integer"},"code":"GEN_002","request_id":"3f0e7c2a-9b4d-4e1a-8c6f-2d5b7a1e9c30"}}}}},"x-fastapi-operation-id":"seed_appendix_b_api_v1_credit_sandbox_scenarios_appendix_b_post"}}},"components":{"schemas":{"AppendixBScenarioRequest":{"properties":{"program_id":{"type":"string","title":"Program Id"},"external_line_id":{"type":"string","maxLength":100,"minLength":1,"title":"External Line Id","description":"Your id for the seeded line. Seeding the same id again adds nothing.","default":"sandbox-appendix-b"},"as_of":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"As Of","description":"Close month-ends and accrue through this date. Defaults to 2026-05-01; must be on or after the 15 April payment."}},"additionalProperties":false,"type":"object","required":["program_id"],"title":"AppendixBScenarioRequest"},"AppendixBScenarioResponse":{"properties":{"credit_line_id":{"type":"string","title":"Credit Line Id"},"external_line_id":{"type":"string","title":"External Line Id"},"as_of":{"type":"string","format":"date","title":"As Of"},"settlements_accepted":{"type":"integer","title":"Settlements Accepted"},"settlements_duplicate":{"type":"integer","title":"Settlements Duplicate"},"payments_recorded":{"type":"integer","title":"Payments Recorded"},"statements":{"items":{"$ref":"#/components/schemas/StatementListItem"},"type":"array","title":"Statements","description":"Newest first. April's amount due is 1,558,197 cents."}},"type":"object","required":["credit_line_id","external_line_id","as_of","settlements_accepted","settlements_duplicate","payments_recorded"],"title":"AppendixBScenarioResponse"},"CycleStatusEnum":{"type":"string","enum":["open","closed","issued","paid","late","written_off"],"title":"CycleStatusEnum","description":"Cycle state per FRD §10.5.\n\n* ``open`` — collecting settlements; no draw exists yet. Merchant sees\n  activity but nothing is owed (this interval is the float).\n* ``closed`` — draw created; interest and fees computed. Statement pending.\n* ``issued`` — statement generated and available; amount due and due date shown.\n* ``paid`` — outstanding reduced to zero, *including* accrued interest.\n* ``late`` — past due date with an amount outstanding.\n* ``written_off`` — charged off per collections policy."},"StatementListItem":{"properties":{"cycle_id":{"type":"string","title":"Cycle Id"},"period_start":{"type":"string","format":"date","title":"Period Start"},"period_end":{"type":"string","format":"date","title":"Period End"},"issued_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Issued On"},"due_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Due Date"},"status":{"$ref":"#/components/schemas/CycleStatusEnum"},"period_status":{"anyOf":[{"type":"string","enum":["open","paid"]},{"type":"null"}],"title":"Period Status"},"amount_due_cents":{"type":"integer","title":"Amount Due Cents","description":"Statement balance for the period."},"paid_cents":{"type":"integer","title":"Paid Cents","default":0},"outstanding_cents":{"type":"integer","title":"Outstanding Cents","default":0},"on_hold_cents":{"type":"integer","title":"On Hold Cents","description":"The part of outstanding_cents on loans on hold.","default":0},"download_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Url","description":"Rendered statement (PDF) for this period."},"spreadsheet_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Spreadsheet Url","description":"Transaction-level rows for reconciliation (CSV)."},"reconstructed":{"type":"boolean","title":"Reconstructed","description":"The period closed before statements were snapshotted; its issued figures were rebuilt from the records.","default":false}},"type":"object","required":["cycle_id","period_start","period_end","status","amount_due_cents"],"title":"StatementListItem","description":"One row of the Statements tab (§8)."},"SuccessEnvelope_AppendixBScenarioResponse_":{"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/AppendixBScenarioResponse"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"SuccessEnvelope[AppendixBScenarioResponse]"},"ErrorResponse":{"title":"ErrorResponse","type":"object","description":"Envelope returned by every non-2xx response. Branch on `code` (stable) rather than `message` (human-readable, may change).","required":["error","message","code"],"properties":{"error":{"type":"string","description":"Error category: `validation_error`, `unauthorized`, `forbidden`, `not_found`, `conflict`, `rate_limited`, `server_error`, or `service_unavailable`."},"message":{"type":"string","description":"Human-readable explanation, safe to show to end users."},"code":{"type":"string","description":"Stable machine-readable code in `CATEGORY_NNN` form (e.g. `NOT_FOUND_006`, `AUTH_010`, `GEN_002`)."},"request_id":{"type":"string","description":"Correlation id for support requests. Echoes the `x-request-id` request header when one was supplied."},"errors":{"type":"object","additionalProperties":{"type":"string"},"description":"Field-level validation messages keyed by field name. Present on 400/422 validation failures only."}}}},"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Token","description":"API token authentication. Format: `Bearer dz_...`"}}},"security":[{"BearerAuth":[]}]}