Skip to content

Quickstart

Single student — POST /v1/calculate

curl -X POST https://loanlimit.app/v1/calculate \
  -H 'content-type: application/json' \
  -d '{
    "dependency_status": "dependent",
    "degree_level": "undergraduate",
    "grade_level": "first_year",
    "subsidized_amount": 0,
    "plus_denied": false,
    "is_legacy_borrower": false,
    "terms": [
      {"label": "Fall", "full_time_credits": 12, "credits_enrolled": 12},
      {"label": "Spring", "full_time_credits": 12, "credits_enrolled": 9}
    ]
  }'

You'll get back something like:

{
  "annual_ft_credits": 24,
  "reduced_annual_pct": 88,
  "annual_basic_eligibility_sub": 0,
  "annual_basic_eligibility_unsub": 4840,
  "annual_basic_eligibility_grad_plus": 0,
  "terms": [
    {
      "label": "Fall",
      "credits_enrolled": 12,
      "full_time_credits": 12,
      "enrollment_intensity_pct": 100,
      "disbursement_pct": 100,
      "enrollment_status": "Full-Time",
      "equal": {"subsidized": 0, "unsubsidized": 2420, "grad_plus": 0},
      "proportional": {"subsidized": 0, "unsubsidized": 2766, "grad_plus": 0},
      "adjustment_sub": 0,
      "adjustment_unsub": 0,
      "adjustment_grad_plus": 0,
      "adjustment_explanation": "",
      "adjustment_source_index": null,
      "warning": "",
      "final_term_overdisbursement": false
    },
    {
      "label": "Spring",
      "credits_enrolled": 9,
      "full_time_credits": 12,
      "enrollment_intensity_pct": 75,
      "disbursement_pct": 75,
      "enrollment_status": "Part-Time",
      "equal": {"subsidized": 0, "unsubsidized": 2420, "grad_plus": 0},
      "proportional": {"subsidized": 0, "unsubsidized": 2074, "grad_plus": 0},
      "adjustment_sub": 0,
      "adjustment_unsub": 0,
      "adjustment_grad_plus": 0,
      "adjustment_explanation": "",
      "adjustment_source_index": null,
      "warning": "",
      "final_term_overdisbursement": false
    }
  ],
  "total_equal": {"subsidized": 0, "unsubsidized": 4840, "grad_plus": 0},
  "total_proportional": {"subsidized": 0, "unsubsidized": 4840, "grad_plus": 0},
  "show_both_options": true,
  "warnings": []
}

For the full request schema (including legacy-borrower fields, enrollment-change inputs, and institutional limit overrides), see the API Reference and the Single Student guide.

Bulk — POST /v1/calculate/bulk

Download the sample CSV template and edit it for your students:

curl -X POST https://loanlimit.app/v1/calculate/bulk \
  -H 'content-type: text/csv' \
  -H 'accept: text/csv' \
  --data-binary @students.csv \
  > results.csv

The response is a CSV with one row per (student, term), plus error rows for any students that failed validation. See the Bulk CSV guide for the full column reference and error semantics.

What's next

  • The Single Student guide walks through every field of the JSON request and explains when you need each one.
  • The Bulk CSV guide covers the CSV column meanings and how to handle error rows.
  • The Stability page explains exactly what does and doesn't change within /v1/.