{"openapi":"3.1.0","info":{"title":"POST /api/v1/capital/offers/{program_id}/apply","version":"1.0.0","description":"Apply to a capital offer"},"servers":[{"url":"https://api.ondayzero.com","description":"Production"}],"paths":{"/api/v1/capital/offers/{program_id}/apply":{"post":{"tags":["capital"],"summary":"Apply to a capital offer","description":"Starts the application flow for the offer: an underwriting assessment is requested on the lender's program with this business as the subject, exactly as the partner Apply wizard does, and returned pending with `next_step` (connect a bank, wait for the assessment, wait for the decision). Idempotent: a second call returns the application the first opened, `created: false`. `requested_limit_cents` defaults to the program's minimum and `requested_term_days` to its first term. `404` for an offer not open to this business, `409` when it already holds a line under the program or the program has no active scorecard.","operationId":"apply_to_capital_offer","parameters":[{"name":"program_id","in":"path","required":true,"schema":{"type":"string","title":"Program 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":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/CapitalApplyRequest"},{"type":"null"}],"title":"Payload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope_CapitalApplyResponse_"}}}},"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"}}}},"409":{"description":"Conflict - Resource already exists or is in an incompatible state","content":{"application/json":{"example":{"error":"conflict","message":"Resource already exists","code":"CONFLICT_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":"apply_to_capital_offer_api_v1_capital_offers__program_id__apply_post"}}},"components":{"schemas":{"AdverseActionReason":{"properties":{"criterion_key":{"type":"string","title":"Criterion Key"},"criterion_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Criterion Id"},"label":{"type":"string","title":"Label"},"measured":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Measured"},"threshold":{"anyOf":[{"type":"number"},{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Threshold"},"comparator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comparator"},"direction":{"type":"string","title":"Direction","description":"below, above, not_equal, equal, or outside: where the figure fell."},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"required":{"type":"boolean","title":"Required","default":false},"weight":{"type":"integer","title":"Weight","default":0},"contribution_bps":{"type":"integer","title":"Contribution Bps","description":"The criterion's weight over the points available.","default":0}},"type":"object","required":["criterion_key","label","direction"],"title":"AdverseActionReason","description":"A failed scorecard criterion, as a reason a lender could give."},"AssessmentAutoApproval":{"properties":{"status":{"type":"string","enum":["pending","line_opened","existing_line","held","not_eligible","failed"],"title":"Status","description":"pending (not completed yet), line_opened, existing_line (a line for this merchant was already open; it was linked, not changed), held (everything else allows a line; required manual checks are still pending, and the line opens when the last is attested), not_eligible (see `reasons`; no line was opened) or failed (the line could not be opened; see `detail`)."},"reasons":{"items":{"type":"string"},"type":"array","title":"Reasons","description":"Why no line was opened: line_already_linked, requested_limit_missing, criteria_failed, required_failed, required_unmeasured, no_criteria_passed, requested_limit_below_program_minimum, sized_limit_below_program_minimum, limit_sizing_unmeasured, manual_checks_pending, manual_check_failed, manual_check_exception, assessment_failed, line_open_refused (criteria_unmeasured on assessments completed before 2026-11-06). On a live business nothing may fail, every required criterion must be measured and something must pass; on a sandbox, nothing may fail."},"source":{"anyOf":[{"type":"string","enum":["request","program_default","sandbox_implicit"]},{"type":"null"}],"title":"Source","description":"What asked for automatic approval: `request` (`auto_approve` sent on the request), `program_default` (the request omitted it and the program's `auto_approve_default` is true) or `sandbox_implicit` (a partner application on a sandbox)."},"sandbox":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sandbox","description":"Whether the sandbox rule applied (nothing failed) rather than the live one."},"limit_rescored":{"anyOf":[{"$ref":"#/components/schemas/LimitRescored"},{"type":"null"}],"description":"Set when the application failed only rules that read the limit at the limit applied for and was scored again at the sized limit, which it passed. Null otherwise."},"credit_line_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credit Line Id","description":"The line opened or linked. Null when none was."},"credit_limit_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credit Limit Cents","description":"The limit the line opened with: the lower of the requested and the sized limit, held to the program's maximum."},"sized_limit_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sized Limit Cents","description":"The limit the scorecard's `limit_sizing` supports (see the assessment's `limit_sizing`). Null without sizing."},"limit_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Limit Source","description":"What set `credit_limit_cents`: requested, sized or program_max."},"rate_bps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rate Bps","description":"The rate the line opened at, in basis points."},"rate_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rate Source","description":"grade (the scorecard's `rate_by_grade`), program_default (`default_rate_bps`), platform_default (1800) or existing_line."},"grade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grade","description":"The assessment's grade the rate was read for."},"requested_limit_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Requested Limit Cents","description":"The limit the application asked for, in cents."},"term_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Term Days","description":"The term the line opened with: the requested one, else the program's first term."},"requested_term_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Requested Term Days","description":"The term the application asked for."},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail","description":"Why opening the line was refused, when it failed."},"decided_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Decided At","description":"When DayZero decided whether to open the line."}},"type":"object","required":["status"],"title":"AssessmentAutoApproval","description":"What DayZero did with a completed assessment requested with `auto_approve`."},"AssessmentPricing":{"properties":{"rate_bps":{"type":"integer","title":"Rate Bps","description":"The line's rate in basis points."},"rate_source":{"type":"string","title":"Rate Source","description":"request (the approval named it), grade (the scorecard's `rate_by_grade`), program_default, platform_default (1800), or existing_line (a line for the merchant was already open; its rate stands)."},"grade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grade","description":"The assessment's grade when the rate was read."}},"type":"object","required":["rate_bps","rate_source"],"title":"AssessmentPricing","description":"The rate a line opened from an assessment took."},"AssessmentStatusEnum":{"type":"string","enum":["pending","completed","failed"],"title":"AssessmentStatusEnum","description":"Underwriting assessment lifecycle.\n\nPlaid backfill, categorisation, and trailing-ratio history can take up\nto three days (FRD §9.3), so an assessment is explicitly asynchronous."},"CapitalApplyRequest":{"properties":{"requested_limit_cents":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Requested Limit Cents","description":"The limit applied for, inside the program's range. Defaults to the program's minimum."},"requested_term_days":{"anyOf":[{"type":"integer","maximum":3650.0,"minimum":1.0},{"type":"null"}],"title":"Requested Term Days","description":"One of the program's terms. Defaults to its first option."}},"additionalProperties":false,"type":"object","title":"CapitalApplyRequest","description":"Start an application to a listed program."},"CapitalApplyResponse":{"properties":{"application":{"$ref":"#/components/schemas/UnderwritingAssessmentResponse"},"created":{"type":"boolean","title":"Created","description":"False when an earlier call already opened this application."},"next_step":{"$ref":"#/components/schemas/CapitalNextStep"}},"type":"object","required":["application","created","next_step"],"title":"CapitalApplyResponse"},"CapitalNextStep":{"properties":{"kind":{"type":"string","enum":["connect_bank","await_assessment","await_decision","line_open","declined"],"title":"Kind"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"An in-app path to follow for this step, when there is one."},"message":{"type":"string","title":"Message"}},"type":"object","required":["kind","message"],"title":"CapitalNextStep","description":"What the applicant does now."},"LimitRescored":{"properties":{"requested_cents":{"type":"integer","title":"Requested Cents","description":"The limit applied for, in cents, at which limit rules failed."},"sized_cents":{"type":"integer","title":"Sized Cents","description":"The limit the measures support (`limit_sizing.sized_limit_cents`), at which the recorded result was scored."},"reason":{"type":"string","const":"rescored_at_sized_limit","title":"Reason","description":"`rescored_at_sized_limit`: at the limit applied for only rules written against the limit failed; at the sized limit nothing did."}},"type":"object","required":["requested_cents","sized_cents","reason"],"title":"LimitRescored","description":"An application scored again at the sized limit, and why."},"LimitSizingCapResult":{"properties":{"measure":{"type":"string","title":"Measure","description":"The measure key."},"multiple":{"type":"number","title":"Multiple","description":"The cap is the measure times this."},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value","description":"The measured figure (whole currency units). Null: unmeasured, cap skipped."},"cap_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cap Cents","description":"The cap in cents. Null when unmeasured."}},"type":"object","required":["measure","multiple"],"title":"LimitSizingCapResult","description":"One cap of the scorecard's limit sizing, as measured."},"LimitSizingResult":{"properties":{"sized_limit_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sized Limit Cents","description":"The sized limit in cents. Null when no basis measure was measured."},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"`sizing_basis_unmeasured` when no basis measure had a value."},"basis_measure":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Basis Measure","description":"The basis measure used: the first one measured."},"basis_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Basis Value","description":"Its measured figure, whole currency units."},"basis_multiplier":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Basis Multiplier","description":"What annualised it (4 for a 3-month figure)."},"annual_basis":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Annual Basis","description":"basis_value × basis_multiplier."},"percent_of_annual_bps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Percent Of Annual Bps","description":"Share of the annual basis lent, in basis points."},"basis_limit_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Basis Limit Cents","description":"The limit before the caps, in cents."},"caps":{"items":{"$ref":"#/components/schemas/LimitSizingCapResult"},"type":"array","title":"Caps","description":"Each cap, measured or skipped."},"binding":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Binding","description":"The measure that set the sized limit: the basis or a cap."},"round_down_to_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Round Down To Cents","description":"The step the sized limit was rounded down to."}},"type":"object","title":"LimitSizingResult","description":"The limit the merchant's measures support, and how it was reached."},"ManualCheckResult":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label"},"status":{"type":"string","title":"Status","description":"pending, attested (reviewed and satisfied), exception (reviewed, exception noted), failed (reviewed and not satisfied) or not_applicable.","default":"pending"},"applicable":{"type":"boolean","title":"Applicable","description":"False when the check's condition excludes this application.","default":true},"evidence_required":{"type":"boolean","title":"Evidence Required","default":false},"required":{"type":"boolean","title":"Required","description":"Pending, it holds automatic approval (`auto_approval.status: held`); failed or with an exception, no line opens automatically.","default":false},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"attested_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attested By"},"attested_by_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attested By User Id"},"at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"At","description":"When it was attested."},"attachment_s3_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attachment S3 Key"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes","description":"Guidance from the scorecard, not the reviewer."},"policy_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Policy Reference"}},"type":"object","required":["id","label"],"title":"ManualCheckResult","description":"A manual check on an assessment: what was reviewed, by whom, and when.\n\nManual checks cover the policy items no data can measure. A person\nattests to them; they never move the score. A `required` one holds a\nlive `auto_approve` assessment until it is attested."},"SuccessEnvelope_CapitalApplyResponse_":{"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/CapitalApplyResponse"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"SuccessEnvelope[CapitalApplyResponse]"},"UnderwritingAssessmentResponse":{"properties":{"id":{"type":"string","title":"Id"},"credit_line_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credit Line Id"},"external_application_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Application Id"},"status":{"$ref":"#/components/schemas/AssessmentStatusEnum"},"requested_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Requested At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"criteria":{"items":{"$ref":"#/components/schemas/UnderwritingCriterionResult"},"type":"array","title":"Criteria"},"financials":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Financials"},"failure_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Reason"},"score_bps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Score Bps","description":"Weighted points earned over points available across measured criteria, in basis points (D-38). Null until completed."},"passed_count":{"type":"integer","title":"Passed Count","default":0},"failed_count":{"type":"integer","title":"Failed Count","default":0},"unmeasured_count":{"type":"integer","title":"Unmeasured Count","default":0},"not_applicable_count":{"type":"integer","title":"Not Applicable Count","description":"Criteria whose `applies_when` excluded this application.","default":0},"required_failed":{"items":{"type":"string"},"type":"array","title":"Required Failed"},"unmeasured_keys":{"items":{"type":"string"},"type":"array","title":"Unmeasured Keys","description":"Measure keys of the applicable criteria that came back unmeasured (`passed: null`), once each. Empty until completed."},"required_unmeasured":{"items":{"type":"string"},"type":"array","title":"Required Unmeasured","description":"Measure keys of required criteria that came back unmeasured. The score leaves them out, so read this beside `score_bps`."},"segment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Segment"},"scorecard_version_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scorecard Version Id","description":"The exact scorecard version the assessment ran against. Null for an ad-hoc `criteria_override`."},"scorecard_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scorecard Id"},"scorecard_version_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scorecard Version Number"},"scorecard_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scorecard Source","description":"version, override (criteria_override), or program (pre-versioning)."},"program_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Program Id","description":"The program the application is under: the line's, or the one the request named. Null on an ad-hoc assessment with neither, and on assessments requested before it was recorded."},"subject_business_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject Business Id","description":"The business whose data was measured, when not the operator."},"requested_limit_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Requested Limit Cents"},"requested_term_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Requested Term Days"},"manual_checks":{"items":{"$ref":"#/components/schemas/ManualCheckResult"},"type":"array","title":"Manual Checks","description":"Reviewed by a person; reported beside the score, never in it."},"grade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grade","description":"From the scorecard's grade bands. Null when it has none."},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes","description":"Reviewer notes."},"adverse_action_reasons":{"items":{"$ref":"#/components/schemas/AdverseActionReason"},"type":"array","title":"Adverse Action Reasons","description":"The criteria that were measured and failed, required ones first, then by weight. Empty when nothing failed. Figures only: no notice is sent."},"waiting_on":{"items":{"type":"string"},"type":"array","title":"Waiting On","description":"While pending: the merchant data the nightly sweep is still waiting for before it measures (`bank_connection`, `bank_backfill`, `bank_reconnect` when a bank connection needs the merchant to log in again or a bank feed fails for a reason you must fix (also `credit.bank_connection.reconnect_required`), `bank_data_stale` when a bank source has stopped updating, `categorisation`, `shopify_sync` until a Shopify import or pull has finished in full, `shopify_data_stale` when the store has not been pulled in three days, `shopify_disputes` when the scorecard has a chargeback rule and no finished sync has pulled the year of disputes yet, and `meta_ads_sync` when the scorecard has an ad-spend rule and a connected Meta Ads account has not finished its first sync). On a completed assessment: what was still missing when it completed (at the program's `underwriting_wait_days` deadline, or on an operator's run). Empty when nothing was missing or no check ran."},"ready_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ready At","description":"When the merchant's data was first found complete, at the request or a nightly check. Null while waiting, or when the assessment completed without it."},"wait_deadline":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Wait Deadline","description":"When the sweep stops waiting and completes the assessment with whatever data exists: `requested_at` plus the program's `underwriting_wait_days`. Set when the assessment is requested."},"decision":{"anyOf":[{"$ref":"#/components/schemas/UnderwritingDecision"},{"type":"null"}],"description":"The lender's decision, once recorded: null until then. Recorded with `POST /credit/underwriting/assessments/{id}/decision`, or by DayZero when `auto_approve` opened the line (`decided_via: auto`). `auto_approval` says what the automatic path did."},"auto_approval":{"anyOf":[{"$ref":"#/components/schemas/AssessmentAutoApproval"},{"type":"null"}],"description":"Set when the assessment was requested with `auto_approve` (or by a sandbox merchant flow): whether a line was opened, and if not, why."},"limit_sizing":{"anyOf":[{"$ref":"#/components/schemas/LimitSizingResult"},{"type":"null"}],"description":"The limit the measures support, when the scorecard sizes limits (`scoring.limit_sizing`): basis, caps and every input. Null otherwise, and while pending."},"limit_rescored":{"anyOf":[{"$ref":"#/components/schemas/LimitRescored"},{"type":"null"}],"description":"Set when, at the limit applied for, only rules written against the limit failed and the sized limit was lower: the assessment was scored again at the sized limit and the recorded result (`criteria`, counts, `score_bps`, `grade`) is that one. The first evaluation is kept on the record. Null otherwise."},"pricing":{"anyOf":[{"$ref":"#/components/schemas/AssessmentPricing"},{"type":"null"}],"description":"The rate a line opened from this assessment took, and where it came from. Null until a line is opened from it."}},"type":"object","required":["id","status"],"title":"UnderwritingAssessmentResponse","description":"Assessment evidence — criteria, values, thresholds, and sources."},"UnderwritingCriterionResult":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"The criterion's id on the scorecard. Null on older assessments."},"key":{"type":"string","title":"Key"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"threshold":{"anyOf":[{"type":"number"},{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Threshold","description":"The figure the value was compared against, resolved for this application: a scalar, or [low, high] for the `between` comparator. Null when it could not be resolved (for example the rule is a multiple of a requested limit that was not supplied)."},"comparator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comparator"},"passed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Passed","description":"Null means the figure could not be measured yet — distinct from a failure, and calling for a different action."},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"weight":{"type":"integer","title":"Weight","default":1},"required":{"type":"boolean","title":"Required","description":"Whether the rule is required for this application.","default":false},"applicable":{"type":"boolean","title":"Applicable","description":"False when the rule's `applies_when` excludes this application; such a rule is not scored.","default":true},"unmeasured_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unmeasured Reason","description":"Why `passed` is null: requested_limit_missing, no_measurer, insufficient_history, no_shopify_connection, not_applicable, … Null when the criterion was measured."},"threshold_basis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Threshold Basis","description":"`absolute`, or `requested_limit` for a multiple of the limit."},"threshold_value":{"anyOf":[{"type":"number"},{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Threshold Value","description":"The threshold as written on the scorecard, before resolution."},"required_when":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Required When","description":"The scorecard's `required` condition."},"applies_when":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Applies When","description":"The scorecard's `applies_when` condition."},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"policy_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Policy Reference"},"evidence":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Evidence"},"annualized":{"type":"boolean","title":"Annualized","description":"True when `value` is the measure's annualised figure, read from less history than its window because the criterion sets `allow_annualized` (the evidence's `annualized_from_days` says how much). False for a figure read over the whole window.","default":false}},"type":"object","required":["key"],"title":"UnderwritingCriterionResult","description":"One criterion, its value, its threshold, and where the figure came from.\n\nWe supply the assessment, not the verdict: thresholds and the lending\ndecision remain the partner's (§9.3)."},"UnderwritingDecision":{"properties":{"status":{"type":"string","enum":["approved","declined"],"title":"Status","description":"`approved` or `declined`."},"decline_reasons":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Decline Reasons","description":"Principal reasons explicitly selected by the final decision maker, frozen at decision time."},"merchant_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchant Message","description":"The message for the merchant, exactly as the lender wrote it."},"approved_limit_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Approved Limit Cents","description":"The approved limit in cents. Null when declined."},"approved_term_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Approved Term Days","description":"The approved term in days. Null when declined."},"credit_line_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credit Line Id","description":"The line opened (or linked) by the approval. Null when declined, or approved without opening the line."},"decided_at":{"type":"string","format":"date-time","title":"Decided At","description":"When the decision was recorded."},"decided_via":{"type":"string","enum":["console","api_token","auto"],"title":"Decided Via","description":"`console` (an operator), `api_token` (the partner's tooling) or `auto` (`auto_approve` opened the line)."},"decided_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decided By","description":"Who decided. Console view only; null for an API token."},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note","description":"The internal note. Console view only; null for an API token."}},"type":"object","required":["status","decided_at","decided_via"],"title":"UnderwritingDecision","description":"The lender's recorded decision on a completed assessment."},"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":[]}]}