Payna is backed by Y Combinator

Reference

Individuals

Per-person licensing for the regulated people at your company. Loan officers, insurance adjusters, and any future regulated role, on the same endpoints.

How it is shaped

Start at GET /individuals to get an individual_id, then use it against the sub-resources. Every sub-resource takes the same ID in the same position, so a client only needs one path builder.

People are typed by vertical rather than split across separate routes. ?type=mlo gives loan officers, ?type=adjuster gives insurance adjusters, and omitting the filter returns everyone. Onboarding a new regulated role does not add endpoints or change response shapes.

Endpoints

GET/individualsList regulated individuals

Paginated list of the regulated people at your company. Omit type to list everyone regardless of vertical.

ParameterTypeDescription
typestringVertical filter, for example mlo or adjuster. Omit to return all individual types.
employment_statusstringOne of active, inactive, terminated, pending.
pageintegerPage number, starting at 1. Defaults to 1.
limitintegerResults per page. Defaults to 50, maximum 200.
GET/individuals/{id}/licensesGet a person’s licenses

Every state license held by one person. For loan officers this is the NMLS individual record per state. Other verticals come from their own source system, NIPR for adjusters.

GET/individuals/{id}/license-conditionsGet open conditions

Regulator conditions attached to a person, with the verbatim condition text and a short action_required title. Lifecycle runs open, in_progress, submitted, cleared.

GET/individuals/{id}/ce-statusGet continuing education status

One record per state license that has CE hours tracked, with required, completed and remaining hours plus the cycle deadline.

GET/individuals/{id}/attestationsGet attestations

Attestation state for a person, currently NMLS MU2 filing attestations, with the last completed timestamp and the next deadline.

GET/individuals/{id}/tasksGet assigned tasks

Work assigned to this person. Read assignment_status rather than status: it is the authoritative per-person value, where status is the parent task.

Requires the individuals capability on your key. Full response schemas are in the interactive reference.

Listing people

curl -s "https://app.payna.com/api/v1/individuals?type=mlo&employment_status=active" \
  -H "Authorization: Bearer $PAYNA_API_KEY"
{
  "data": [
    {
      "individual_id": "c1d2e3f4-0000-0000-0000-aabbccddeeff",
      "individual_type": "mlo",
      "full_name": "Jane Smith",
      "work_email": "jane@company.com",
      "nmls_id": "1234567",
      "employment_status": "active",
      "company_id": "f0a1b2c3-0000-0000-0000-112233445566",
      "updated_at": "2026-07-17T10:00:00Z"
    }
  ],
  "meta": { "total": 12, "page": 1, "limit": 50, "synced_at": "2026-07-17T10:00:00Z" }
}

The common question

Most integrations exist to answer one thing before letting work proceed: is this person licensed in this state right now?

// Can this loan officer originate in the subject state today?
const { data: licenses } = await payna(
  `/individuals/${individualId}/licenses`
)

const licensed = licenses.some(
  (l) => l.state === subjectState && l.status === 'active'
)

Individual licenses use a four value status: active, inactive, pending, not_licensed. Note this differs from the five value model on company licenses, and there is no status_detail object here. Detail lives in sub_status, for example temporary_authority.

The state field is a two-letter US state code, or US for federal and national registrations.

Sub-resources

ResourceWhat it tells you
licensesState by state license status for the person. For loan officers this is the NMLS individual record; other verticals come from their own source system.
license-conditionsOpen regulator conditions with verbatim text, a short action_required title, and a lifecycle of open, in_progress, submitted, cleared.
ce-statusContinuing education per state license: required, completed, and remaining hours plus the cycle deadline.
attestationsAttestation state, currently NMLS MU2 filing attestations, with last completed and next due.
tasksWork assigned to the person, each with a deep link into the Payna portal.

Two fields worth reading carefully

assignment_status, not status

On tasks, status belongs to the parent task and assignment_status belongs to this person. When one task fans out to several people, the parent stays open until everyone is done, so the parent status will not tell you whether this person has finished. Read assignment_status, which is either open or completed.

remaining_hours can be null

On continuing education, remaining_hours is computed as required minus completed, floored at zero. It is null when either input is unknown, which is not the same as zero. Treating null as done will under-report a compliance gap.

Privacy

See how Payna runs licensing.

Tell us a little about the company and we’ll walk through how Payna handles licensing and compliance in every US state.