{"openapi":"3.1.0","info":{"title":"POST /api/v1/credit/lines/{credit_line_id}/loans/import","version":"1.0.0","description":"Import existing loans onto a line"},"servers":[{"url":"https://api.ondayzero.com","description":"Production"}],"paths":{"/api/v1/credit/lines/{credit_line_id}/loans/import":{"post":{"tags":["credit"],"summary":"Import existing loans onto a line","description":"Launch with live cards and open loans (D-29): loads loans that already exist on the partner's previous system with their paid buckets and interest to date, keyed by the original issuer transaction id so attribution survives the migration (D-33). Idempotent on that id; one bad row is rejected without sinking the batch. Daily accrual resumes from the day after `accrued_through`.","operationId":"import_loans","parameters":[{"name":"credit_line_id","in":"path","required":true,"schema":{"type":"string","title":"Credit Line 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/LoanImportRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope_LoanImportResponse_"}}}},"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/invalid token 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":"import_loans_api_v1_credit_lines__credit_line_id__loans_import_post"}}},"components":{"schemas":{"LoanImportItem":{"properties":{"external_settlement_id":{"type":"string","maxLength":128,"title":"External Settlement Id","description":"Original issuer transaction id. The idempotency key."},"originated_on":{"type":"string","format":"date","title":"Originated On"},"principal_cents":{"type":"integer","exclusiveMinimum":0.0,"title":"Principal Cents"},"disbursement_fee_cents":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Disbursement Fee Cents","description":"Defaults to the line's fee rate on the principal."},"term_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Term Days","description":"Defaults to the line's term."},"due_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Due Date","description":"Defaults to originated_on + term."},"rate_bps":{"anyOf":[{"type":"integer","maximum":10000.0,"minimum":0.0},{"type":"null"}],"title":"Rate Bps"},"merchant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchant Name"},"card_last_four":{"anyOf":[{"type":"string","maxLength":4},{"type":"null"}],"title":"Card Last Four"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"principal_paid_cents":{"type":"integer","minimum":0.0,"title":"Principal Paid Cents","default":0},"fee_paid_cents":{"type":"integer","minimum":0.0,"title":"Fee Paid Cents","default":0},"interest_paid_cents":{"type":"integer","minimum":0.0,"title":"Interest Paid Cents","default":0},"credit_applied_cents":{"type":"integer","minimum":0.0,"title":"Credit Applied Cents","default":0},"interest_accrued_cents":{"type":"integer","minimum":0.0,"title":"Interest Accrued Cents","description":"Interest accrued to date on the old system.","default":0},"accrued_through":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Accrued Through","description":"Date the accrued figure is good through. Accrual resumes after it."},"written_off":{"type":"boolean","title":"Written Off","default":false},"written_off_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Written Off On"},"source_system":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Source System"}},"additionalProperties":false,"type":"object","required":["external_settlement_id","originated_on","principal_cents"],"title":"LoanImportItem","description":"One loan that already exists on the partner's previous system (D-29, D-33)."},"LoanImportRequest":{"properties":{"as_of":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"As Of","description":"Status is assessed as at this date."},"loans":{"items":{"$ref":"#/components/schemas/LoanImportItem"},"type":"array","maxItems":1000,"minItems":1,"title":"Loans"}},"additionalProperties":false,"type":"object","required":["loans"],"title":"LoanImportRequest","description":"Bulk-load existing loans onto a line at launch."},"LoanImportResponse":{"properties":{"credit_line_id":{"type":"string","title":"Credit Line Id"},"accepted":{"type":"integer","title":"Accepted"},"duplicates":{"type":"integer","title":"Duplicates"},"rejected":{"type":"integer","title":"Rejected"},"results":{"items":{"$ref":"#/components/schemas/LoanImportResult"},"type":"array","title":"Results"}},"type":"object","required":["credit_line_id","accepted","duplicates","rejected"],"title":"LoanImportResponse"},"LoanImportResult":{"properties":{"external_settlement_id":{"type":"string","title":"External Settlement Id"},"status":{"type":"string","enum":["accepted","duplicate","rejected"],"title":"Status"},"loan_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Loan Id"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["external_settlement_id","status"],"title":"LoanImportResult"},"SuccessEnvelope_LoanImportResponse_":{"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/LoanImportResponse"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"SuccessEnvelope[LoanImportResponse]"},"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":[]}]}