{"openapi":"3.1.0","info":{"title":"POST /api/v1/firm/capital/prequalify","version":"1.0.0","description":"Pre-qualify a client for a listed offer"},"servers":[{"url":"https://api.ondayzero.com","description":"Production"}],"paths":{"/api/v1/firm/capital/prequalify":{"post":{"tags":["firm-capital"],"summary":"Pre-qualify a client for a listed offer","description":"Records a referral and, when the caller holds write permission on the client, opens the client's application to the program through the same marketplace flow the client would use (idempotent per client and program; the lender's scorecard and decision follow as for any application). Without write permission the client's owner gets a to-do asking them to apply. Any referral compensation must be disclosed to the client and may require state licensing. `404` for a client outside the firm or an offer not open to it.","operationId":"prequalify_firm_client","parameters":[{"name":"firm_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The firm acting; defaults to the caller's staff firm.","title":"Firm Id"},"description":"The firm acting; defaults to the caller's staff firm."},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FirmCapitalPrequalifyRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope_FirmCapitalPrequalifyResponse_"}}}},"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":"prequalify_firm_client_api_v1_firm_capital_prequalify_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."},"FirmCapitalPrequalifyRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"The client's business."},"program_id":{"type":"string","title":"Program Id","description":"The listed program."}},"additionalProperties":false,"type":"object","required":["business_id","program_id"],"title":"FirmCapitalPrequalifyRequest","description":"Put one client forward for one listed program."},"FirmCapitalPrequalifyResponse":{"properties":{"referral":{"$ref":"#/components/schemas/FirmCapitalReferralSummary","description":"The referral recorded."},"application":{"anyOf":[{"$ref":"#/components/schemas/UnderwritingAssessmentResponse"},{"type":"null"}],"description":"The application opened on the client's behalf, when the caller may write."},"created":{"type":"boolean","title":"Created","description":"False when the client's application to this offer was already open."},"message":{"type":"string","title":"Message","description":"What happens next, in plain words."}},"type":"object","required":["referral","created","message"],"title":"FirmCapitalPrequalifyResponse","description":"What Pre-qualify did."},"FirmCapitalReferralSummary":{"properties":{"id":{"type":"string","title":"Id","description":"Referral id."},"kind":{"type":"string","enum":["application","client_task"],"title":"Kind","description":"application opened for the client, or a to-do left for its owner."},"program_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Program Id","description":"The program referred to."},"application_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Application Id","description":"The assessment opened."},"todo_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Todo Id","description":"The owner's to-do."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When the click happened (UTC)."}},"type":"object","required":["id","kind","created_at"],"title":"FirmCapitalReferralSummary","description":"The firm's most recent Pre-qualify click for the client."},"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_FirmCapitalPrequalifyResponse_":{"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/FirmCapitalPrequalifyResponse"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"SuccessEnvelope[FirmCapitalPrequalifyResponse]"},"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":[]}]}