FlexPoint Docs
EngineeringAPI Reference

GET /api/programs

Cross-lender program catalog with high-level metadata and matrix child counts.

Endpoint

GET /api/programs
Authorization: Bearer <FLEXRATE_INTERNAL_TOKEN>

Query parameters

ParamTypeRequiredDescription
lenderstringnoFilter to a single lender slug (non-qm, flexpoint).

Returns programs from the most recent rate sheet of each lender. When lender is supplied it must exist in the lenders table (422 otherwise).


Response

{
  "data": [
    {
      "slug": "full_doc",
      "name": "Full Doc",
      "sheet_title": "Full Doc",
      "lender": { "slug": "non-qm", "name": "Non-QM" },
      "rate_sheet": {
        "rate_sheet_id": "G5202026NQM",
        "effective_at": "2026-05-20T08:27:53+00:00",
        "effective_date": "2026-05-20",
        "extracted_at": "2026-05-21T01:14:02+00:00"
      },
      "doc_types": [
        { "doc_type": "full_doc", "label": "Full Doc", "source_url": null }
      ],
      "counts": {
        "ltv_matrix": 24,
        "eligibility_rules": 6,
        "overlays": 3,
        "matrix_documents": 1,
        "notes": 12
      }
    }
  ],
  "meta": {
    "rate_sheets": [
      { "lender": "non-qm",    "rate_sheet_id": "G5202026NQM", "effective_at": "2026-05-20T08:27:53+00:00", "effective_date": "2026-05-20" },
      { "lender": "flexpoint", "rate_sheet_id": null,           "effective_at": "2026-05-21T00:00:00+00:00", "effective_date": "2026-05-21" }
    ]
  }
}

Response Fields

FieldTypeDescription
data[].slugstringProgram identifier (unique per rate sheet).
data[].namestringDisplay name.
data[].lenderobject{ slug, name } for the owning lender.
data[].rate_sheetobjectSummary of the rate sheet this program belongs to.
data[].doc_types[]arrayDoc types registered for the program (may be empty for rate-only programs).
data[].countsobjectAggregate counts of matrix children — quick way to see if /matrix will return useful data.
meta.rate_sheets[]arrayThe latest rate sheet effective dates per lender included in the response.

Programs with counts.ltv_matrix === 0 (e.g. ces_oo, ces_noo, jumbo) are rate-only — they ship in the catalog but /matrix will return empty arrays.


Usage

curl https://api.example.com/api/programs \
  -H "Authorization: Bearer <token>"

curl 'https://api.example.com/api/programs?lender=non-qm' \
  -H "Authorization: Bearer <token>"

The catalog is derived from the live database — it reflects whatever was seeded by the most recent php artisan rates:daily run.

On this page